+ wdg_map[n] = p.release();
+}
+
+
+Panel::Child::Child(Panel &p, Widget *w):
+ Container::Child(p, w)
+{
+ widget->signal_visibility_changed.connect(sigc::mem_fun(this, &Child::visibility_changed));
+ widget->signal_request_focus.connect(sigc::mem_fun(this, &Child::request_focus));
+ widget->signal_grab_pointer.connect(sigc::mem_fun(this, &Child::grab_pointer));
+ widget->signal_ungrab_pointer.connect(sigc::mem_fun(this, &Child::ungrab_pointer));
+}
+
+Panel::Child::~Child()
+{
+ visibility_changed(false);
+}
+
+void Panel::Child::visibility_changed(bool v)
+{
+ if(!v)
+ {
+ Panel &panel = static_cast<Panel &>(container);
+ if(widget==panel.pointer_focus)
+ panel.set_pointer_focus(0);
+ if(widget==panel.input_focus)
+ panel.set_input_focus(0);
+ }
+}
+
+void Panel::Child::autosize_changed()
+{
+ Panel &panel = static_cast<Panel &>(container);
+ if(panel.layout)
+ panel.layout->update();
+}
+
+void Panel::Child::request_focus()
+{
+ Panel &panel = static_cast<Panel &>(container);
+ panel.set_input_focus(widget);
+ if(panel.parent && panel.visible)
+ panel.set_focus();
+}
+
+void Panel::Child::grab_pointer()
+{
+ Panel &panel = static_cast<Panel &>(container);
+ if(!panel.pointer_grabbed)
+ {
+ panel.set_pointer_focus(widget);
+ panel.pointer_grabbed = true;
+ panel.signal_grab_pointer.emit();
+ }
+}
+
+void Panel::Child::ungrab_pointer()
+{
+ Panel &panel = static_cast<Panel &>(container);
+ if(panel.pointer_grabbed && panel.pointer_focus==widget)
+ {
+ // XXX Should set to the widget under pointer
+ panel.set_pointer_focus(0);
+ panel.pointer_grabbed = false;
+ panel.signal_ungrab_pointer.emit();
+ }