]> git.tdb.fi Git - libs/gltk.git/commitdiff
Derive Root from Graphics::EventSource
authorMikko Rasa <tdb@tdb.fi>
Sun, 28 Feb 2010 11:41:40 +0000 (11:41 +0000)
committerMikko Rasa <tdb@tdb.fi>
Sun, 28 Feb 2010 11:41:40 +0000 (11:41 +0000)
Repeat events from Root, but only if they didn't go to any widget

source/root.cpp
source/root.h

index 9fc48e00aac234aecca5f3e6e1ac1e5b0b7c09db..c7a2657005426ecc0f20eff1de7c9f8cb18a0e86 100644 (file)
@@ -79,21 +79,31 @@ void Root::tick()
        }
 }
 
-void Root::button_press_event(int x, int y, unsigned btn, unsigned)
+void Root::button_press_event(int x, int y, unsigned btn, unsigned mod)
 {
        if(visible)
        {
+               Widget *old_focus=pointer_focus;
+
                translate_coords(x, y);
                button_press(x, y, btn);
+
+               if(!pointer_focus && !old_focus)
+                       signal_button_press.emit(x, geom.h-1-y, btn, mod);
        }
 }
 
-void Root::button_release_event(int x, int y, unsigned btn, unsigned)
+void Root::button_release_event(int x, int y, unsigned btn, unsigned mod)
 {
        if(visible)
        {
+               Widget *old_focus=pointer_focus;
+
                translate_coords(x, y);
                button_release(x, y, btn);
+
+               if(!pointer_focus && !old_focus)
+                       signal_button_release.emit(x, geom.h-1-y, btn, mod);
        }
 }
 
@@ -116,19 +126,36 @@ void Root::pointer_motion_event(int x, int y)
                                lbl_tooltip->set_visible(false);
                        tooltip_target=0;
                }
+
+               if(!pointer_focus)
+                       signal_pointer_motion.emit(x, geom.h-1-y);
        }
 }
 
 void Root::key_press_event(unsigned key, unsigned mod, wchar_t ch)
 {
        if(visible)
+       {
+               Widget *old_focus=input_focus;
+
                key_press(Input::key_from_sys(key), mod, ch);
+
+               if(!input_focus && !old_focus)
+                       signal_key_press.emit(key, mod, ch);
+       }
 }
 
 void Root::key_release_event(unsigned key, unsigned mod)
 {
        if(visible)
+       {
+               Widget *old_focus=input_focus;
+
                key_release(Input::key_from_sys(key), mod);
+
+               if(!input_focus && !old_focus)
+                       signal_key_release.emit(key, mod);
+       }
 }
 
 void Root::translate_coords(int &x, int &y)
index 50445fecea3fd8a0bcc206de73561a1c229e05ef..16e01aed06a1e43d3721bb7ebfca1db2ea120c59 100644 (file)
@@ -24,7 +24,7 @@ input from it.  When created, a Root widget will take its size from the window
 it is created for.  The size can be changed, but a Root should always be
 rendered to fill the window in order to get coordinates mapped correctly.
 */
-class Root: public Panel, public sigc::trackable
+class Root: public Panel, public Graphics::EventSource, public sigc::trackable
 {
 public:
        sigc::signal<std::string, int, int> signal_tooltip;
@@ -40,6 +40,10 @@ private:
 public:
        Root(const Resources &, Graphics::Window &);
        void tick();
+
+       virtual unsigned get_width() const { return geom.w; }
+       virtual unsigned get_height() const { return geom.h; }
+
 private:
        virtual const char *get_class() const { return "root"; }
        void button_press_event(int, int, unsigned, unsigned);