+
+ for(unsigned i=0; i<monitors.size(); ++i)
+ {
+ int j = desktop_mode_indices[i];
+ if(j>=0)
+ monitors[i].desktop_settings.mode = &modes[j];
+ monitors[i].current_settings = monitors[i].desktop_settings;
+ }
+
+ sort(monitors, [](const Msp::Graphics::Monitor &m1, const Msp::Graphics::Monitor &m2){
+ if(m1.desktop_settings.mode && !m2.desktop_settings.mode)
+ return true;
+ if(!m1.desktop_settings.mode && m2.desktop_settings.mode)
+ return false;
+ return m1.desktop_settings.x<m2.desktop_settings.x;
+ });
+
+ for(unsigned i=0; i<modes.size(); ++i)
+ {
+ auto j = find_member(monitors, mode_monitor_indices[i], &Monitor::index);
+ modes[i].monitor = &*j;
+ j->video_modes.push_back(&modes[i]);
+ }
+
+ Monitor *prev_enabled = nullptr;
+ for(Monitor &m: monitors)
+ if(m.desktop_settings.mode)
+ {
+ m.next_left = prev_enabled;
+ if(prev_enabled)
+ prev_enabled->next_right = &m;
+ prev_enabled = &m;
+ }
+
+ if(primary_index>=0)
+ primary_monitor = &*find_member(monitors, static_cast<unsigned>(primary_index), &Monitor::index);
+
+ if(!primary_monitor || !primary_monitor->desktop_settings.mode)
+ {
+ // XRandR didn't give a sensible primary monitor. Try to guess one.
+ unsigned largest = 0;
+ for(Monitor &m: monitors)
+ if(const VideoMode *desktop_mode = m.desktop_settings.mode)
+ {
+ unsigned size = desktop_mode->width*desktop_mode->height;
+ if(size>largest)
+ {
+ largest = size;
+ primary_monitor = &m;
+ }
+ }
+ }