X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpanel.cpp;h=aeca9e71a61e83d6889e351cb678ddd1493f2741;hb=1a5f227ac945bc9e6449d1552e5d9eb4c1c196fb;hp=3123db41bccd2dc6036a7fd89a1facfdea593e06;hpb=aba0416fb73e17d068b30ff163c2fedcb0254da2;p=libs%2Fgltk.git diff --git a/source/panel.cpp b/source/panel.cpp index 3123db4..aeca9e7 100644 --- a/source/panel.cpp +++ b/source/panel.cpp @@ -95,11 +95,13 @@ void Panel::button_release(int x, int y, unsigned btn) { if(pointer_grab>0) { - const Geometry &cgeom=pointer_focus->get_geometry(); - pointer_focus->button_release(x-cgeom.x, y-cgeom.y, btn); + Widget *wdg=pointer_focus; if(btn==pointer_grab) set_pointer_focus(get_child_at(x, y), 0); + + const Geometry &cgeom=wdg->get_geometry(); + wdg->button_release(x-cgeom.x, y-cgeom.y, btn); } else if(geom.is_inside_relative(x, y)) { @@ -156,12 +158,18 @@ void Panel::child_hidden(Widget &wdg) { if(&wdg==pointer_focus) set_pointer_focus(0, 0); + if(&wdg==input_focus) + set_input_focus(0); } void Panel::grab_pointer(Widget &wdg) { if(pointer_grab==0 || pointer_focus==&wdg) + { set_pointer_focus(&wdg, 255); + if(parent) + parent->grab_pointer(*this); + } else throw InvalidState("Pointer is already grabbed"); } @@ -169,7 +177,11 @@ void Panel::grab_pointer(Widget &wdg) void Panel::ungrab_pointer(Widget &wdg) { if(pointer_focus==&wdg) + { set_pointer_focus(0, 0); + if(parent) + parent->ungrab_pointer(*this); + } else if(pointer_grab>0) throw Exception("Someone is trying to steal the pointer!"); }