]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/display.cpp
Track the currently focused window in Display
[libs/gui.git] / source / graphics / display.cpp
index 40112a35f9408760c5f6ab05ea286033403282b1..1c7b639a06d8f993b72ef92fb19d9d211271ed5b 100644 (file)
@@ -1,4 +1,5 @@
 #include <cmath>
+#include <sigc++/bind.h>
 #include "display.h"
 #include "display_private.h"
 #include "window.h"
@@ -11,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
@@ -66,11 +71,28 @@ const VideoMode *Display::find_mode(unsigned width, unsigned height) const
        return find_mode(VideoMode(width, height));
 }
 
+void Display::window_got_focus(Window &w)
+{
+       focus_window = &w;
+}
+
+void Display::window_lost_focus()
+{
+       focus_window = 0;
+}
+
 void Display::tick()
 {
        check_error();
 
+       Window *old_focus = focus_window;
+
        while(process_events()) ;
+
+       if(old_focus && !focus_window)
+               signal_lost_focus.emit();
+       else if(!old_focus && focus_window)
+               signal_got_focus.emit();
 }
 
 } // namespace Graphics