]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/panel.cpp
Add Widget::focusable flag
[libs/gltk.git] / source / panel.cpp
index 14e9b6ea8cc3dbf97b9c57f4f673df53870bacc2..4d7e1a9df3d0aa814aa225c9dc47038d58fc3f68 100644 (file)
@@ -47,6 +47,17 @@ void Panel::raise(Widget &wdg)
        throw InvalidState("That Widget is not in this Panel");
 }
 
+Widget *Panel::get_final_input_focus() const
+{
+       if(Panel *panel=dynamic_cast<Panel *>(input_focus))
+       {
+               Widget *focus=panel->get_final_input_focus();
+               if(focus)
+                       return focus;
+       }
+       return input_focus;
+}
+
 void Panel::button_press(int x, int y, unsigned btn)
 {
        if(pointer_grabbed)
@@ -59,7 +70,8 @@ void Panel::button_press(int x, int y, unsigned btn)
                if(Widget *wdg=get_child_at(x, y))
                {
                        set_pointer_focus(wdg);
-                       set_input_focus(wdg);
+                       if(wdg->is_focusable())
+                               set_input_focus(wdg);
                }
                Container::button_press(x, y, btn);
        }
@@ -224,7 +236,10 @@ void Panel::Child::visibility_changed(bool v)
 
 void Panel::Child::request_focus()
 {
-       static_cast<Panel &>(container).set_input_focus(widget);
+       Panel &panel=static_cast<Panel &>(container);
+       panel.set_input_focus(widget);
+       if(panel.parent && panel.visible)
+               panel.set_focus();
 }
 
 void Panel::Child::grab_pointer()