From: Mikko Rasa Date: Wed, 21 Nov 2012 15:56:49 +0000 (+0200) Subject: Adjust event handling to match changes in mspgui X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=d88af5a7898020e4493fef8ec0cb9e88666b66df;p=libs%2Fgltk.git Adjust event handling to match changes in mspgui --- diff --git a/source/entry.cpp b/source/entry.cpp index ec6bba7..0e1414c 100644 --- a/source/entry.cpp +++ b/source/entry.cpp @@ -126,7 +126,7 @@ void Entry::render_special(const Part &part) const slider->render(); } -void Entry::key_press(unsigned key, unsigned, wchar_t ch) +void Entry::key_press(unsigned key, unsigned) { if(key==Input::KEY_LEFT) { @@ -181,9 +181,13 @@ void Entry::key_press(unsigned key, unsigned, wchar_t ch) else signal_enter.emit(); } - else if(ch>=' ') +} + +void Entry::character(wchar_t ch) +{ + if(ch>=' ') { - text.insert(edit_pos, Codecs::encode(Codecs::ustring(1, ch))); + text.insert(edit_pos, StringCodec::encode(StringCodec::ustring(1, ch))); ++edit_pos; } } diff --git a/source/entry.h b/source/entry.h index 2323a38..058ef3f 100644 --- a/source/entry.h +++ b/source/entry.h @@ -55,7 +55,8 @@ private: virtual void render_special(const Part &) const; public: - virtual void key_press(unsigned, unsigned, wchar_t); + virtual void key_press(unsigned, unsigned); + virtual void character(wchar_t); private: virtual void on_geometry_change(); virtual void on_style_change(); diff --git a/source/panel.cpp b/source/panel.cpp index 4b44370..a086a4e 100644 --- a/source/panel.cpp +++ b/source/panel.cpp @@ -127,10 +127,10 @@ void Panel::pointer_leave() set_pointer_focus(0); } -void Panel::key_press(unsigned key, unsigned mod, wchar_t ch) +void Panel::key_press(unsigned key, unsigned mod) { if(input_focus) - input_focus->key_press(key, mod, ch); + input_focus->key_press(key, mod); } void Panel::key_release(unsigned key, unsigned mod) @@ -139,6 +139,12 @@ void Panel::key_release(unsigned key, unsigned mod) input_focus->key_release(key, mod); } +void Panel::character(wchar_t ch) +{ + if(input_focus) + input_focus->character(ch); +} + void Panel::focus_out() { set_input_focus(0); diff --git a/source/panel.h b/source/panel.h index 2ba916d..b1261c3 100644 --- a/source/panel.h +++ b/source/panel.h @@ -78,8 +78,9 @@ public: virtual void button_release(int, int, unsigned); virtual void pointer_motion(int, int); virtual void pointer_leave(); - virtual void key_press(unsigned, unsigned, wchar_t); + virtual void key_press(unsigned, unsigned); virtual void key_release(unsigned, unsigned); + virtual void character(wchar_t); virtual void focus_out(); protected: virtual void on_child_added(Widget &); diff --git a/source/root.cpp b/source/root.cpp index 826a540..bce6adf 100644 --- a/source/root.cpp +++ b/source/root.cpp @@ -12,6 +12,8 @@ namespace GLtk { Root::Root(const Resources &r, Graphics::Window &w): resources(r), window(w), + keyboard(window), + mouse(window), lbl_tooltip(0), tooltip_target(0) { @@ -19,11 +21,12 @@ Root::Root(const Resources &r, Graphics::Window &w): update_style(); - window.signal_button_press.connect(sigc::mem_fun(this, &Root::button_press_event)); - window.signal_button_release.connect(sigc::mem_fun(this, &Root::button_release_event)); - window.signal_pointer_motion.connect(sigc::mem_fun(this, &Root::pointer_motion_event)); - window.signal_key_press.connect(sigc::mem_fun(this, &Root::key_press_event)); - window.signal_key_release.connect(sigc::mem_fun(this, &Root::key_release_event)); + mouse.signal_button_press.connect(sigc::mem_fun(this, &Root::button_press_event)); + mouse.signal_button_release.connect(sigc::mem_fun(this, &Root::button_release_event)); + mouse.signal_axis_motion.connect(sigc::mem_fun(this, &Root::axis_motion_event)); + keyboard.signal_button_press.connect(sigc::mem_fun(this, &Root::key_press_event)); + keyboard.signal_button_release.connect(sigc::mem_fun(this, &Root::key_release_event)); + keyboard.signal_character.connect(sigc::mem_fun(this, &Root::character_event)); } void Root::tick() @@ -81,39 +84,32 @@ void Root::render() const Widget::render(); } -void Root::button_press_event(int x, int y, unsigned btn, unsigned mod) +void Root::button_press_event(unsigned btn) { if(visible) { - Widget *old_focus = pointer_focus; - - translate_coords(x, y); + int x, y; + get_pointer(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 mod) +void Root::button_release_event(unsigned btn) { if(visible) { - Widget *old_focus = pointer_focus; - - translate_coords(x, y); + int x, y; + get_pointer(x, y); button_release(x, y, btn); - - if(!pointer_focus && !old_focus) - signal_button_release.emit(x, geom.h-1-y, btn, mod); } } -void Root::pointer_motion_event(int x, int y) +void Root::axis_motion_event(unsigned, float, float) { if(visible) { - translate_coords(x, y); + int x, y; + get_pointer(x, y); pointer_motion(x, y); if(!tooltip_target) @@ -128,42 +124,32 @@ 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) +void Root::key_press_event(unsigned key) { + // XXX Modifiers 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); - } + key_press(key, 0); } -void Root::key_release_event(unsigned key, unsigned mod) +void Root::key_release_event(unsigned key) { if(visible) - { - Widget *old_focus = input_focus; - - key_release(Input::key_from_sys(key), mod); + key_release(key, 0); +} - if(!input_focus && !old_focus) - signal_key_release.emit(key, mod); - } +void Root::character_event(StringCodec::unichar ch) +{ + if(visible) + character(ch); } -void Root::translate_coords(int &x, int &y) +void Root::get_pointer(int &x, int &y) { - x = x*geom.w/window.get_width(); - y = geom.h-1-y*geom.h/window.get_height(); + x = (mouse.get_axis_value(0)*0.5+0.5)*geom.w; + y = (mouse.get_axis_value(1)*0.5+0.5)*geom.h; } } // namespace GLtk diff --git a/source/root.h b/source/root.h index b66f016..53f8ff3 100644 --- a/source/root.h +++ b/source/root.h @@ -2,7 +2,9 @@ #define MSP_GLTK_ROOT_H_ #include -#include +#include +#include +#include #include #include "panel.h" @@ -17,7 +19,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 Graphics::EventSource, public sigc::trackable +class Root: public Panel, public sigc::trackable { public: sigc::signal signal_tooltip; @@ -25,6 +27,8 @@ public: private: const Resources &resources; Graphics::Window &window; + Input::Keyboard keyboard; + Input::Mouse mouse; Label *lbl_tooltip; int pointer_x; int pointer_y; @@ -44,13 +48,14 @@ public: void render() const; private: - void button_press_event(int, int, unsigned, unsigned); - void button_release_event(int, int, unsigned, unsigned); - void pointer_motion_event(int, int); - void key_press_event(unsigned, unsigned, wchar_t); - void key_release_event(unsigned, unsigned); + void button_press_event(unsigned); + void button_release_event(unsigned); + void axis_motion_event(unsigned, float, float); + void key_press_event(unsigned); + void key_release_event(unsigned); + void character_event(StringCodec::unichar); - void translate_coords(int &, int &); + void get_pointer(int &, int &); }; } // namespace GLtk diff --git a/source/widget.h b/source/widget.h index 51728c3..665ca9d 100644 --- a/source/widget.h +++ b/source/widget.h @@ -108,8 +108,9 @@ public: virtual void pointer_motion(int, int) { } virtual void pointer_enter(); virtual void pointer_leave(); - virtual void key_press(unsigned, unsigned, wchar_t) { } + virtual void key_press(unsigned, unsigned) { } virtual void key_release(unsigned, unsigned) { } + virtual void character(wchar_t) { } virtual void focus_in(); virtual void focus_out(); protected: