X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fdisplay.cpp;h=1c7b639a06d8f993b72ef92fb19d9d211271ed5b;hb=e15959a69551c2027029470e65a17ea5a305545b;hp=22dd705df90c772e6901ae30f618f87db787077a;hpb=89ec4c335953556ca069960adf6ea3a5dc3bb499;p=libs%2Fgui.git diff --git a/source/graphics/display.cpp b/source/graphics/display.cpp index 22dd705..1c7b639 100644 --- a/source/graphics/display.cpp +++ b/source/graphics/display.cpp @@ -1,3 +1,5 @@ +#include +#include #include "display.h" #include "display_private.h" #include "window.h" @@ -10,11 +12,15 @@ namespace Graphics { void Display::add_window(Window &wnd) { priv->windows[wnd.get_private().window] = &wnd; + wnd.signal_got_focus.connect(sigc::bind(sigc::mem_fun(this, &Display::window_got_focus), sigc::ref(wnd))); + wnd.signal_lost_focus.connect(sigc::mem_fun(this, &Display::window_lost_focus)); } void Display::remove_window(Window &wnd) { priv->windows.erase(wnd.get_private().window); + if(&wnd==focus_window) + focus_window = 0; } const VideoMode &Display::get_desktop_mode() const @@ -31,26 +37,62 @@ void Display::restore_mode() set_mode(*i->desktop_mode, false); } -const VideoMode *Display::find_matching_mode(const VideoMode &mode) const +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) { if(mode.monitor && i->monitor!=mode.monitor) continue; - if(mode.rate && i->rate!=mode.rate) + if(mode.rate && (i->raterate>mode.rate+rate_tolerance)) continue; - if(i->width==mode.width && i->height==mode.height) + if(i->width!=mode.width || i->height!=mode.height) + continue; + + if(mode.rate) + { + float d = abs(i->rate-mode.rate); + if(d