Dockables aren't disposed when closing floating dock window
This is my first post in gimp-dev so forgive me if I happen to miss
out context or interfere with current work in progress.
It turns out dockables aren't disposed after a gimp_dock_dispose()
call in the current master. gimp_dock_dispose() only removes dockbooks
which will not be disposed if references are still held by attached
dockables.
The behavior is particularly notable on singleton dockables when
closing a floating dock window:
1. Add a new tab Tool Options to main dock
2. Drag out or detach Tool Options tab to a floating dock window
3. Close the floating dock window
4. Try to re-insert Tool Options tab in main dock. Doesn't work - as
floating dock's dockbook hasn't been disposed and Tool Options
dockable is still attached to it
I took a chance and came up with the following workaround by
explicitly removing all dockables from a dockbook upon
gimp_dock_dispose() call:
diff --git a/app/widgets/gimpdock.c b/app/widgets/gimpdock.c
index ccdeac1..c27aceb 100644
--- a/app/widgets/gimpdock.c
+++ b/app/widgets/gimpdock.c
@@ -199,9 +199,14 @@ static void
gimp_dock_dispose (GObject *object)
{
GimpDock *dock = GIMP_DOCK (object);
+ GimpDockbook *dockbook = NULL;
while (dock->p->dockbooks)
- gimp_dock_remove_book (dock, GIMP_DOCKBOOK (dock->p->dockbooks->data));
+ {
+ dockbook = GIMP_DOCKBOOK (dock->p->dockbooks->data);
+ gimp_dock_remove_book (dock, dockbook);
+ gimp_dockbook_remove_all (dockbook);
+ }
G_OBJECT_CLASS (parent_class)->dispose (object);
}
diff --git a/app/widgets/gimpdockbook.c b/app/widgets/gimpdockbook.c
index bf47c16..3e7f267 100644
--- a/app/widgets/gimpdockbook.c
+++ b/app/widgets/gimpdockbook.c
@@ -1081,6 +1081,14 @@ gimp_dockbook_remove (GimpDockbook *dockbook,
}
}
+void
+gimp_dockbook_remove_all (GimpDockbook *dockbook)
+{
+ g_return_if_fail (GIMP_IS_DOCKBOOK (dockbook));
+
+ while (dockbook->p->dockables)
+ gimp_dockbook_remove(dockbook,
GIMP_DOCKABLE(dockbook->p->dockables->data));
+}
/**
* gimp_dockbook_update_with_context:
* @dockbook:
diff --git a/app/widgets/gimpdockbook.h b/app/widgets/gimpdockbook.h
index 2af7b40..434495a 100644
--- a/app/widgets/gimpdockbook.h
+++ b/app/widgets/gimpdockbook.h
@@ -73,6 +73,7 @@ GtkWidget *
gimp_dockbook_add_from_dialog_factory (GimpDockbook *dockbo
gint
position);
void gimp_dockbook_remove (GimpDockbook
*dockbook,
GimpDockable
*dockable);
+void gimp_dockbook_remove_all (GimpDockbook
*dockbook);
void gimp_dockbook_update_with_context (GimpDockbook
*dockbook,
GimpContext
*context);
GtkWidget * gimp_dockbook_create_tab_widget (GimpDockbook
*dockbook,