static void gimp_dialog_factory_dispose (GObject *object) { GimpDialogFactory *factory = GIMP_DIALOG_FACTORY (object); GList *list; gpointer key; /* start iterating from the beginning each time we destroyed a * toplevel because destroying a dock may cause lots of items * to be removed from factory->open_dialogs */ while (factory->open_dialogs) { for (list = factory->open_dialogs; list; list = g_list_next (list)) { if (GTK_WIDGET_TOPLEVEL (list->data)) { gtk_widget_destroy (GTK_WIDGET (list->data)); break; } } /* the list being non-empty without any toplevel is an error, * so eek and chain up */ if (! list) { g_warning ("%s: stale non-toplevel entries in factory->open_dialogs", G_STRFUNC); break; } } if (factory->open_dialogs) { g_list_free (factory->open_dialogs); factory->open_dialogs = NULL; } if (factory->session_infos) { g_list_foreach (factory->session_infos, (GFunc) gimp_session_info_free, NULL); g_list_free (factory->session_infos); factory->session_infos = NULL; } if (strcmp (GIMP_OBJECT (factory)->name, "toolbox") == 0) key = ""; else key = GIMP_OBJECT (factory)->name; g_hash_table_remove (GIMP_DIALOG_FACTORY_GET_CLASS (object)->factories, key); G_OBJECT_CLASS (parent_class)->dispose (object); }
GimpDialogFactory * gimp_dialog_factory_new (const gchar *name, GimpContext *context, GimpMenuFactory *menu_factory, GimpDialogNewFunc new_dock_func, gboolean toggle_visibility) { GimpDialogFactory *factory; gpointer key; g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL); g_return_val_if_fail (! menu_factory || GIMP_IS_MENU_FACTORY (menu_factory), NULL); if (gimp_dialog_factory_from_name (name)) { g_warning ("%s: dialog factory \"%s\" already exists", G_STRFUNC, name); return NULL; } factory = g_object_new (GIMP_TYPE_DIALOG_FACTORY, NULL); gimp_object_set_name (GIMP_OBJECT (factory), name); /* hack to keep the toolbox on the pool position */ if (strcmp (name, "toolbox") == 0) key = ""; else key = GIMP_OBJECT (factory)->name; g_hash_table_insert (GIMP_DIALOG_FACTORY_GET_CLASS (factory)->factories, key, factory); factory->context = context; factory->menu_factory = menu_factory; factory->new_dock_func = new_dock_func; factory->toggle_visibility = toggle_visibility; return factory; }