The normal way to reparent (ie change the owner) of a
widget should be to use the function:
void gtk_widget_reparent (GtkWidget *widget,
GtkWidget *new_parent) |
But this is only a "should be" since this function does
not correctly do its job on some specific widgets. The main
goal of gtk_widget_reparent() is to avoid unrealizing widget
if both widget and new_parent are realized (in this case,
widget->window is successfully reparented). The problem here
is that some widgets in the GTK+ hierarchy have multiple
attached X subwindows and this is notably the case for the
GtkSpinButton widget. For those, gtk_widget_reparent() will
fail by leaving an unrealized child window where it should
not.
To avoid this problem, simply use the following code
snippet:
gtk_widget_ref(widget);
gtk_container_remove(GTK_CONTAINER(old_parent), widget);
gtk_container_add(GTK_CONTAINER(new_parent), widget);
gtk_widget_unref(widget); |