GTK+ FAQ
<<< Previous | Development with GTK+: general questions | Next >>>

# How do I reparent a widget?

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);

<<< Previous | Home | Next >>>
How do I remove the data I have attached to an object? | Up | How could I get any widgets position?