+#include "display.h"
#include <cmath>
#include <sigc++/bind.h>
-#include "display.h"
#include "display_private.h"
#include "window.h"
{
priv->windows.erase(wnd.get_private().window);
if(&wnd==focus_window)
- focus_window = 0;
+ focus_window = nullptr;
}
const VideoMode &Display::get_desktop_mode() const
void Display::restore_mode()
{
- for(list<Monitor>::const_iterator i=monitors.begin(); i!=monitors.end(); ++i)
- if(i->desktop_settings.mode)
- set_mode(*i->desktop_settings.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<VideoMode>::const_iterator i=modes.begin(); i!=modes.end(); ++i)
+ const VideoMode *closest = nullptr;
+ 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->rate<mode.rate-rate_tolerance || i->rate>mode.rate+rate_tolerance))
+ // Only check rate tolerance against an explicitly requested rate
+ if(mode.rate && (m.rate<mode.rate-rate_tolerance || m.rate>mode.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 || d<rate_diff)
{
- float d = abs(i->rate-mode.rate);
- if(d<rate_diff)
- {
- closest = &*i;
- rate_diff = d;
- }
+ closest = &m;
+ rate_diff = d;
}
- else
- return &*i;
}
return closest;
void Display::window_lost_focus()
{
- focus_window = 0;
+ focus_window = nullptr;
}
void Display::tick()