]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/panel.cpp
Prevent problems if a button press handler throws
[libs/gltk.git] / source / panel.cpp
index 3123db41bccd2dc6036a7fd89a1facfdea593e06..aeca9e71a61e83d6889e351cb678ddd1493f2741 100644 (file)
@@ -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!");
 }