X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fdisplay.cpp;h=f40e02e572f6f7965d17e2a2fcadaf8173a00fa7;hb=0e59815bb5b0327ad0159a615c61afbf20dbd89e;hp=1c7b639a06d8f993b72ef92fb19d9d211271ed5b;hpb=e15959a69551c2027029470e65a17ea5a305545b;p=libs%2Fgui.git diff --git a/source/graphics/display.cpp b/source/graphics/display.cpp index 1c7b639..f40e02e 100644 --- a/source/graphics/display.cpp +++ b/source/graphics/display.cpp @@ -25,42 +25,49 @@ void Display::remove_window(Window &wnd) const VideoMode &Display::get_desktop_mode() const { - if(!primary_monitor || !primary_monitor->desktop_mode) + if(!primary_monitor || !primary_monitor->desktop_settings.mode) throw logic_error("no desktop mode"); - return *primary_monitor->desktop_mode; + return *primary_monitor->desktop_settings.mode; } void Display::restore_mode() { - for(list::const_iterator i=monitors.begin(); i!=monitors.end(); ++i) - if(i->desktop_mode) - set_mode(*i->desktop_mode, false); + for(const Monitor &m: monitors) + if(m.desktop_settings.mode) + set_mode(*m.desktop_settings.mode, false); } const VideoMode *Display::find_mode(const VideoMode &mode, float rate_tolerance) const { const VideoMode *closest = 0; - float rate_diff = mode.rate; - for(list::const_iterator i=modes.begin(); i!=modes.end(); ++i) + float rate_diff = 0.0f; + + float target_rate = mode.rate; + if(!target_rate && mode.monitor) + if(const VideoMode *current_mode = mode.monitor->current_settings.mode) + target_rate = current_mode->rate; + + for(const VideoMode &m: modes) { - if(mode.monitor && i->monitor!=mode.monitor) + if(mode.monitor && m.monitor!=mode.monitor) continue; - if(mode.rate && (i->raterate>mode.rate+rate_tolerance)) + // Only check rate tolerance against an explicitly requested rate + if(mode.rate && (m.ratemode.rate+rate_tolerance)) continue; - if(i->width!=mode.width || i->height!=mode.height) + if(m.width!=mode.width || m.height!=mode.height) continue; - if(mode.rate) + float ref_rate = target_rate; + if(!ref_rate) + if(const VideoMode *current_mode = m.monitor->current_settings.mode) + ref_rate = current_mode->rate; + + float d = abs(m.rate-ref_rate); + if(!closest || drate-mode.rate); - if(d