/** * dialogs_restore_dialog: * @factory: * @screen: * @monitor: * @info: * * Creates a top level widget based on the given session info object * in which other widgets later can be be put, typically also restored * from the same session info object. * * Returns: **/ static GtkWidget * dialogs_restore_dialog (GimpDialogFactory *factory, GdkScreen *screen, gint monitor, GimpSessionInfo *info) { GtkWidget *dialog; GimpCoreConfig *config = gimp_dialog_factory_get_context (factory)->gimp->config; GIMP_LOG (DIALOG_FACTORY, "restoring toplevel \"%s\" (info %p)", gimp_session_info_get_factory_entry (info)->identifier, info); dialog = gimp_dialog_factory_dialog_new (factory, screen, monitor, NULL /*ui_manager*/, gimp_session_info_get_factory_entry (info)->identifier, gimp_session_info_get_factory_entry (info)->view_size, ! GIMP_GUI_CONFIG (config)->hide_docks); g_object_set_data (G_OBJECT (dialog), GIMP_DIALOG_VISIBILITY_KEY, GINT_TO_POINTER (GIMP_GUI_CONFIG (config)->hide_docks ? GIMP_DIALOG_VISIBILITY_HIDDEN : GIMP_DIALOG_VISIBILITY_VISIBLE)); return dialog; }
static void dialogs_ensure_factory_entry_on_recent_dock (GimpSessionInfo *info) { if (! gimp_session_info_get_factory_entry (info)) { GimpDialogFactoryEntry *entry = NULL; /* The recent docks container only contains session infos for * dock windows */ entry = gimp_dialog_factory_find_entry (gimp_dialog_factory_get_singleton (), "gimp-dock-window"); gimp_session_info_set_factory_entry (info, entry); } }
static void windows_menu_remove_toolbox_entries (GimpContainer *docks) { GList *iter = NULL; GList *for_removal = NULL; for (iter = GIMP_LIST (docks)->list; iter; iter = g_list_next (iter)) { GimpSessionInfo *info = iter->data; GimpDialogFactoryEntry *entry = gimp_session_info_get_factory_entry (info); if (entry && strcmp ("gimp-toolbox-window", entry->identifier) == 0) for_removal = g_list_prepend (for_removal, info); } for (iter = for_removal; iter; iter = g_list_next (iter)) { GimpSessionInfo *info = iter->data; gimp_container_remove (docks, GIMP_OBJECT (info)); } g_list_free (for_removal); }
void session_init (Gimp *gimp) { gchar *filename; GScanner *scanner; GTokenType token; GError *error = NULL; g_return_if_fail (GIMP_IS_GIMP (gimp)); filename = session_filename (gimp); scanner = gimp_scanner_new_file (filename, &error); if (! scanner && error->code == GIMP_CONFIG_ERROR_OPEN_ENOENT) { g_clear_error (&error); g_free (filename); filename = g_build_filename (gimp_sysconf_directory (), "sessionrc", NULL); scanner = gimp_scanner_new_file (filename, NULL); } if (! scanner) { g_clear_error (&error); g_free (filename); return; } if (gimp->be_verbose) g_print ("Parsing '%s'\n", gimp_filename_to_utf8 (filename)); g_scanner_scope_add_symbol (scanner, 0, "session-info", GINT_TO_POINTER (SESSION_INFO)); g_scanner_scope_add_symbol (scanner, 0, "hide-docks", GINT_TO_POINTER (HIDE_DOCKS)); g_scanner_scope_add_symbol (scanner, 0, "single-window-mode", GINT_TO_POINTER (SINGLE_WINDOW_MODE)); g_scanner_scope_add_symbol (scanner, 0, "last-tip-shown", GINT_TO_POINTER (LAST_TIP_SHOWN)); token = G_TOKEN_LEFT_PAREN; while (g_scanner_peek_next_token (scanner) == token) { token = g_scanner_get_next_token (scanner); switch (token) { case G_TOKEN_LEFT_PAREN: token = G_TOKEN_SYMBOL; break; case G_TOKEN_SYMBOL: if (scanner->value.v_symbol == GINT_TO_POINTER (SESSION_INFO)) { GimpDialogFactory *factory = NULL; GimpSessionInfo *info = NULL; gchar *factory_name = NULL; gchar *entry_name = NULL; GimpDialogFactoryEntry *entry = NULL; token = G_TOKEN_STRING; if (! gimp_scanner_parse_string (scanner, &factory_name)) break; /* In versions <= GIMP 2.6 there was a "toolbox", a * "dock", a "display" and a "toplevel" factory. These * are now merged to a single gimp_dialog_factory_get_singleton (). We * need the legacy name though, so keep it around. */ factory = gimp_dialog_factory_get_singleton (); info = gimp_session_info_new (); /* GIMP 2.6 has the entry name as part of the * session-info header, so try to get it */ gimp_scanner_parse_string (scanner, &entry_name); if (entry_name) { /* Previously, GimpDock was a toplevel. That is why * versions <= GIMP 2.6 has "dock" as the entry name. We * want "dock" to be interpreted as 'dock window' * however so have some special-casing for that. When * the entry name is "dock" the factory name is either * "dock" or "toolbox". */ if (strcmp (entry_name, "dock") == 0) { entry = gimp_dialog_factory_find_entry (factory, (strcmp (factory_name, "toolbox") == 0 ? "gimp-toolbox-window" : "gimp-dock-window")); } else { entry = gimp_dialog_factory_find_entry (factory, entry_name); } } /* We're done with these now */ g_free (factory_name); g_free (entry_name); /* We can get the factory entry either now (the GIMP <= * 2.6 way), or when we deserialize (the GIMP 2.8 way) */ if (entry) { gimp_session_info_set_factory_entry (info, entry); } /* Always try to deserialize */ if (gimp_config_deserialize (GIMP_CONFIG (info), scanner, 1, NULL)) { /* Make sure we got a factory entry either the 2.6 * or 2.8 way */ if (gimp_session_info_get_factory_entry (info)) { GIMP_LOG (DIALOG_FACTORY, "successfully parsed and added session info %p", info); gimp_dialog_factory_add_session_info (factory, info); } else { GIMP_LOG (DIALOG_FACTORY, "failed to parse session info %p, not adding", info); } g_object_unref (info); } else { g_object_unref (info); break; } } else if (scanner->value.v_symbol == GINT_TO_POINTER (HIDE_DOCKS)) { gboolean hide_docks; token = G_TOKEN_IDENTIFIER; if (! gimp_scanner_parse_boolean (scanner, &hide_docks)) break; g_object_set (gimp->config, "hide-docks", hide_docks, NULL); } else if (scanner->value.v_symbol == GINT_TO_POINTER (SINGLE_WINDOW_MODE)) { gboolean single_window_mode; token = G_TOKEN_IDENTIFIER; if (! gimp_scanner_parse_boolean (scanner, &single_window_mode)) break; g_object_set (gimp->config, "single-window-mode", single_window_mode, NULL); } else if (scanner->value.v_symbol == GINT_TO_POINTER (LAST_TIP_SHOWN)) { gint last_tip_shown; token = G_TOKEN_INT; if (! gimp_scanner_parse_int (scanner, &last_tip_shown)) break; g_object_set (gimp->config, "last-tip-shown", last_tip_shown, NULL); } token = G_TOKEN_RIGHT_PAREN; break; case G_TOKEN_RIGHT_PAREN: token = G_TOKEN_LEFT_PAREN; break; default: /* do nothing */ break; } } if (token != G_TOKEN_LEFT_PAREN) { g_scanner_get_next_token (scanner); g_scanner_unexp_token (scanner, token, NULL, NULL, NULL, _("fatal parse error"), TRUE); } if (error) { gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR, error->message); g_clear_error (&error); gimp_config_file_backup_on_error (filename, "sessionrc", NULL); } gimp_scanner_destroy (scanner); g_free (filename); dialogs_load_recent_docks (gimp); }