Notebook.setTabDetachable
void setTabDetachable(gtk.widget.Widget child, bool detachable)Sets whether the tab can be detached from notebook to another notebook or widget.
Note that two notebooks must share a common group identifier (see [gtk.notebook.Notebook.setGroupName]) to allow automatic tabs interchange between them.
If you want a widget to interact with a notebook through DnD (i.e.: accept dragged tabs from it) it must be set as a drop destination by adding to it a [gtk.drop_target.DropTarget] controller that accepts the GType GTK_TYPE_NOTEBOOK_PAGE. The :value of said drop target will be preloaded with a [gtk.notebook_page.NotebookPage] object that corresponds to the dropped tab, so you can process the value via ::accept or ::drop signals.
Note that you should use [gtk.notebook.Notebook.detachTab] instead of [gtk.notebook.Notebook.removePage] if you want to remove the tab from the source notebook as part of accepting a drop. Otherwise, the source notebook will think that the dragged tab was removed from underneath the ongoing drag operation, and will initiate a drag cancel animation.
static void
on_drag_data_received (GtkWidget *widget,
GdkDrop *drop,
GtkSelectionData *data,
guint time,
gpointer user_data)
{
GtkDrag *drag;
GtkWidget *notebook;
GtkWidget **child;
drag = gtk_drop_get_drag (drop);
notebook = g_object_get_data (drag, "gtk-notebook-drag-origin");
child = (void*) gtk_selection_data_get_data (data);
// process_widget (*child);
gtk_notebook_detach_tab (GTK_NOTEBOOK (notebook), *child);
}If you want a notebook to accept drags from other widgets, you will have to set your own DnD code to do it.
Parameters
child | a child [gtk.widget.Widget] |
detachable | whether the tab is detachable or not |