X-Git-Url: http://git.tdb.fi/?p=libs%2Fgui.git;a=blobdiff_plain;f=source%2Fgraphics%2Fx11%2Fdisplay.cpp;fp=source%2Fgraphics%2Fx11%2Fdisplay.cpp;h=544f9589fb664cfc3381db0d36fbf7b8c5e1c8d6;hp=fd6048566d3faec09b0108440e7b4f008a985a33;hb=72ed51af9656b47a331cf29565a0bdfd35f19847;hpb=507fa60f32bd3f64840a2cdd1be5d68478432b55 diff --git a/source/graphics/x11/display.cpp b/source/graphics/x11/display.cpp index fd60485..544f958 100644 --- a/source/graphics/x11/display.cpp +++ b/source/graphics/x11/display.cpp @@ -5,6 +5,7 @@ #ifdef WITH_XRANDR #include #endif +#include #include #include #include @@ -116,6 +117,9 @@ Display::Display(const string &disp_name): for(int i=0; inmode; ++i) modes_by_id[res->modes[i].id] = &res->modes[i]; + int primary_index = -1; + vector mode_monitor_indices; + vector desktop_mode_indices; for(int i=0; inoutput; ++i) { XRROutputInfo *output = XRRGetOutputInfo(priv->display, res, res->outputs[i]); @@ -159,8 +163,10 @@ Display::Display(const string &disp_name): } if(res->outputs[i]==primary) - primary_monitor = &monitor; + primary_index = monitor.index; + unsigned first_mode = modes.size(); + int desktop_mode_index = -1; for(int j=0; jnmode; ++j) { auto k = modes_by_id.find(output->modes[j]); @@ -168,23 +174,25 @@ Display::Display(const string &disp_name): continue; XRRModeInfo *info = k->second; + float rate = static_cast(info->dotClock)/(info->hTotal*info->vTotal); + + if(any_of(modes.begin()+first_mode, modes.end(), [&info, rate](const VideoMode &m){ + return (m.width==info->width && m.height==info->height && abs(m.rate-rate)<0.01f); + })) + continue; VideoMode mode(info->width, info->height); mode.index = modes.size(); - mode.monitor = &monitor; - mode.rate = static_cast(info->dotClock)/(info->hTotal*info->vTotal); - if(find_mode(mode, 0.01f)) - continue; + mode.rate = rate; modes.push_back(mode); priv->modes.push_back(info->id); - monitor.video_modes.push_back(&modes.back()); + mode_monitor_indices.push_back(monitor.index); if(crtc && info->id==crtc->mode) - monitor.desktop_settings.mode = &modes.back(); + desktop_mode_index = mode.index; } - - monitor.current_settings = monitor.desktop_settings; + desktop_mode_indices.push_back(desktop_mode_index); XRRFreeOutputInfo(output); if(crtc) @@ -193,7 +201,23 @@ Display::Display(const string &disp_name): XRRFreeScreenResources(res); - monitors.sort(monitor_x_compare); + for(unsigned i=0; i=0) + monitors[i].desktop_settings.mode = &modes[j]; + monitors[i].current_settings = monitors[i].desktop_settings; + } + + sort(monitors, monitor_x_compare); + + for(unsigned i=0; ivideo_modes.push_back(&modes[i]); + } + Monitor *prev_enabled = nullptr; for(Monitor &m: monitors) if(m.desktop_settings.mode) @@ -204,6 +228,9 @@ Display::Display(const string &disp_name): prev_enabled = &m; } + if(primary_index>=0) + primary_monitor = &*find_member(monitors, static_cast(primary_index), &Monitor::index); + if(!primary_monitor || !primary_monitor->desktop_settings.mode) { // XRandR didn't give a sensible primary monitor. Try to guess one.