From: Mikko Rasa Date: Tue, 11 Jun 2013 15:47:10 +0000 (+0300) Subject: Refactor pointer event handling in Container X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=7675857c7cc7f0accc3c20b13d305318be57dde9;p=libs%2Fgltk.git Refactor pointer event handling in Container --- diff --git a/source/container.cpp b/source/container.cpp index fade54e..e8b666d 100644 --- a/source/container.cpp +++ b/source/container.cpp @@ -135,96 +135,65 @@ Widget *Container::get_final_input_focus() const void Container::button_press(int x, int y, unsigned btn) { - if(pointer_grabbed) + if(Widget *child = get_pointer_target(x, y)) { - const Geometry &cgeom = pointer_focus->get_geometry(); - pointer_focus->button_press(x-cgeom.x, y-cgeom.y, btn); - } - else - { - if(Widget *wdg = get_child_at(x, y)) + if(!click_focus) { - set_pointer_focus(wdg); - if(wdg->is_focusable()) - set_input_focus(wdg); - } - if(click_focus) - { - const Geometry &cgeom = click_focus->get_geometry(); - click_focus->button_press(x-cgeom.x, y-cgeom.y, btn); - } - else - { - if(Widget *wdg = get_child_at(x, y)) - { - click_focus = wdg; - click_button = btn; - - const Geometry &cgeom = wdg->get_geometry(); - wdg->button_press(x-cgeom.x, y-cgeom.y, btn); - } + set_pointer_focus(child); + if(child->is_focusable()) + set_input_focus(child); + + click_focus = child; + click_button = btn; } + + const Geometry &cgeom = child->get_geometry(); + child->button_press(x-cgeom.x, y-cgeom.y, btn); } } void Container::button_release(int x, int y, unsigned btn) { - if(pointer_grabbed) - { - const Geometry &cgeom = pointer_focus->get_geometry(); - pointer_focus->button_release(x-cgeom.x, y-cgeom.y, btn); - } - else if(click_focus) - { - Widget *wdg = click_focus; - - if(btn==click_button) - click_focus = 0; - - const Geometry &cgeom = wdg->get_geometry(); - wdg->button_release(x-cgeom.x, y-cgeom.y, btn); - } - else + if(Widget *child = get_pointer_target(x, y)) { - if(Widget *wdg = get_child_at(x, y)) + if(child==click_focus && btn==click_button) { - const Geometry &cgeom = wdg->get_geometry(); - wdg->button_release(x-cgeom.x, y-cgeom.y, btn); + click_focus = 0; + if(!pointer_focus) + set_pointer_focus(get_child_at(x, y)); } + + const Geometry &cgeom = child->get_geometry(); + child->button_release(x-cgeom.x, y-cgeom.y, btn); } } void Container::pointer_motion(int x, int y) { - if(pointer_grabbed) + Widget *child = get_pointer_target(x, y); + if(!pointer_grabbed) + set_pointer_focus((!click_focus || child->get_geometry().is_inside(x, y)) ? child : 0); + + if(child) { - const Geometry &cgeom = pointer_focus->get_geometry(); - pointer_focus->pointer_motion(x-cgeom.x, y-cgeom.y); + const Geometry &cgeom = child->get_geometry(); + child->pointer_motion(x-cgeom.x, y-cgeom.y); } +} + +Widget *Container::get_pointer_target(int x, int y) +{ + if(pointer_grabbed) + return pointer_focus; + else if(click_focus) + return click_focus; else - { - set_pointer_focus(get_child_at(x, y)); - if(click_focus) - { - const Geometry &cgeom = click_focus->get_geometry(); - click_focus->pointer_motion(x-cgeom.x, y-cgeom.y); - } - else - { - Widget *wdg = get_child_at(x, y); - if(wdg) - { - const Geometry &cgeom = wdg->get_geometry(); - wdg->pointer_motion(x-cgeom.x, y-cgeom.y); - } - } - } + return get_child_at(x, y); } void Container::pointer_leave() { Widget::pointer_leave(); - click_focus = 0; set_pointer_focus(0); } diff --git a/source/container.h b/source/container.h index bca1c59..3275f6a 100644 --- a/source/container.h +++ b/source/container.h @@ -65,6 +65,9 @@ public: virtual void button_press(int, int, unsigned); virtual void button_release(int, int, unsigned); virtual void pointer_motion(int, int); +private: + Widget *get_pointer_target(int, int); +public: virtual void pointer_leave(); virtual void key_press(unsigned, unsigned); virtual void key_release(unsigned, unsigned);