GimpDockbook * gimp_session_info_book_restore (GimpSessionInfoBook *info, GimpDock *dock) { GtkWidget *dockbook; GList *pages; gint n_dockables = 0; g_return_val_if_fail (info != NULL, NULL); g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL); dockbook = gimp_dockbook_new (global_menu_factory); gimp_dock_add_book (dock, GIMP_DOCKBOOK (dockbook), -1); for (pages = info->dockables; pages; pages = g_list_next (pages)) { GimpSessionInfoDockable *dockable_info = pages->data; GimpDockable *dockable; dockable = gimp_session_info_dockable_restore (dockable_info, dock); if (dockable) { gimp_dockbook_add (GIMP_DOCKBOOK (dockbook), dockable, -1); n_dockables++; } } if (info->current_page < gtk_notebook_get_n_pages (GTK_NOTEBOOK (dockbook))) { gtk_notebook_set_current_page (GTK_NOTEBOOK (dockbook), info->current_page); } else if (n_dockables > 1) { gtk_notebook_set_current_page (GTK_NOTEBOOK (dockbook), 0); } /* Return the dockbook even if no dockable could be restored * (n_dockables == 0) because otherwise we would have to remove it * from the dock right here, which could implicitly destroy the * dock and make catching restore errors much harder on higher * levels. Instead, we check for restored empty dockbooks in our * caller. */ return GIMP_DOCKBOOK (dockbook); }
GimpDockbook * gimp_session_info_book_restore (GimpSessionInfoBook *info, GimpDock *dock) { GtkWidget *dockbook; GList *pages; g_return_val_if_fail (info != NULL, NULL); g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL); dockbook = gimp_dockbook_new (dock->dialog_factory->menu_factory); gimp_dock_add_book (dock, GIMP_DOCKBOOK (dockbook), -1); for (pages = info->dockables; pages; pages = g_list_next (pages)) { GimpSessionInfoDockable *dockable_info = pages->data; GimpDockable *dockable; dockable = gimp_session_info_dockable_restore (dockable_info, dock); if (dockable) gimp_dockbook_add (GIMP_DOCKBOOK (dockbook), dockable, -1); } if (info->current_page < gtk_notebook_get_n_pages (GTK_NOTEBOOK (dockbook))) { gtk_notebook_set_current_page (GTK_NOTEBOOK (dockbook), info->current_page); } else { gtk_notebook_set_current_page (GTK_NOTEBOOK (dockbook), 0); } return GIMP_DOCKBOOK (dockbook); }
static GtkWidget * gimp_dialog_factory_dialog_new_internal (GimpDialogFactory *factory, GdkScreen *screen, GimpContext *context, const gchar *identifier, gint view_size, gboolean return_existing, gboolean present) { GimpDialogFactoryEntry *entry; GtkWidget *dialog = NULL; g_return_val_if_fail (GIMP_IS_DIALOG_FACTORY (factory), NULL); g_return_val_if_fail (identifier != NULL, NULL); entry = gimp_dialog_factory_find_entry (factory, identifier); if (! entry) { g_warning ("%s: no entry registered for \"%s\"", G_STRFUNC, identifier); return NULL; } if (! entry->new_func) { g_warning ("%s: entry for \"%s\" has no constructor", G_STRFUNC, identifier); return NULL; } /* a singleton dialog is always returned if it already exisits */ if (return_existing || entry->singleton) { GimpSessionInfo *info; info = gimp_dialog_factory_find_session_info (factory, identifier); if (info) dialog = info->widget; } /* create the dialog if it was not found */ if (! dialog) { GtkWidget *dock = NULL; /* If the dialog will be a dockable (factory->new_dock_func) and * we are called from gimp_dialog_factory_dialog_raise() (! context), * create a new dock _before_ creating the dialog. * We do this because the new dockable needs to be created in it's * dock's context. */ if (factory->new_dock_func && ! context) { GtkWidget *dockbook; dock = gimp_dialog_factory_dock_new (factory, screen); dockbook = gimp_dockbook_new (factory->menu_factory); gimp_dock_add_book (GIMP_DOCK (dock), GIMP_DOCKBOOK (dockbook), 0); } /* Create the new dialog in the appropriate context which is * - the passed context if not NULL * - the newly created dock's context if we just created it * - the factory's context, which happens when raising a toplevel * dialog was the original request. */ if (view_size < GIMP_VIEW_SIZE_TINY) view_size = entry->view_size; if (context) dialog = factory->constructor (factory, entry, context, view_size); else if (dock) dialog = factory->constructor (factory, entry, GIMP_DOCK (dock)->context, view_size); else dialog = factory->constructor (factory, entry, factory->context, view_size); if (dialog) { gimp_dialog_factory_set_widget_data (dialog, factory, entry); /* If we created a dock before, the newly created dialog is * supposed to be a GimpDockable. */ if (dock) { if (GIMP_IS_DOCKABLE (dialog)) { gimp_dock_add (GIMP_DOCK (dock), GIMP_DOCKABLE (dialog), 0, 0); gtk_widget_show (dock); } else { g_warning ("%s: GimpDialogFactory is a dockable factory " "but constructor for \"%s\" did not return a " "GimpDockable", G_STRFUNC, identifier); gtk_widget_destroy (dialog); gtk_widget_destroy (dock); dialog = NULL; dock = NULL; } } } else if (dock) { g_warning ("%s: constructor for \"%s\" returned NULL", G_STRFUNC, identifier); gtk_widget_destroy (dock); dock = NULL; } if (dialog) gimp_dialog_factory_add_dialog (factory, dialog); } /* Finally, if we found an existing dialog or created a new one, raise it. */ if (! dialog) return NULL; if (GTK_WIDGET_TOPLEVEL (dialog)) { gtk_window_set_screen (GTK_WINDOW (dialog), screen); if (present) gtk_window_present (GTK_WINDOW (dialog)); } else if (GIMP_IS_DOCKABLE (dialog)) { GimpDockable *dockable = GIMP_DOCKABLE (dialog); if (dockable->dockbook && dockable->dockbook->dock) { GtkNotebook *notebook = GTK_NOTEBOOK (dockable->dockbook); gint num = gtk_notebook_page_num (notebook, dialog); if (num != -1) { gtk_notebook_set_current_page (notebook, num); gimp_dockable_blink (dockable); } } if (present) { GtkWidget *toplevel = gtk_widget_get_toplevel (dialog); if (GTK_IS_WINDOW (toplevel)) gtk_window_present (GTK_WINDOW (toplevel)); } } return dialog; }