static gboolean gimp_session_info_serialize (GimpConfig *config, GimpConfigWriter *writer, gpointer data) { GimpSessionInfo *info = GIMP_SESSION_INFO (config); GimpSessionInfoClass *klass = GIMP_SESSION_INFO_GET_CLASS (info); GList *iter = NULL; gint x_to_write; gint y_to_write; gint w_to_write; gint h_to_write; if (info->p->factory_entry && info->p->factory_entry->identifier) { gimp_config_writer_open (writer, "factory-entry"); gimp_config_writer_string (writer, info->p->factory_entry->identifier); gimp_config_writer_close (writer); } x_to_write = gimp_session_info_class_apply_position_accuracy (klass, info->p->x); y_to_write = gimp_session_info_class_apply_position_accuracy (klass, info->p->y); w_to_write = gimp_session_info_class_apply_position_accuracy (klass, info->p->width); h_to_write = gimp_session_info_class_apply_position_accuracy (klass, info->p->height); gimp_config_writer_open (writer, "position"); gimp_config_writer_printf (writer, "%d %d", x_to_write, y_to_write); gimp_config_writer_close (writer); if (info->p->width > 0 && info->p->height > 0) { gimp_config_writer_open (writer, "size"); gimp_config_writer_printf (writer, "%d %d", w_to_write, h_to_write); gimp_config_writer_close (writer); } if (info->p->open) { gimp_config_writer_open (writer, "open-on-exit"); if (info->p->screen != DEFAULT_SCREEN) gimp_config_writer_printf (writer, "%d", info->p->screen); gimp_config_writer_close (writer); } if (info->p->aux_info) gimp_session_info_aux_serialize (writer, info->p->aux_info); for (iter = info->p->docks; iter; iter = g_list_next (iter)) gimp_session_info_dock_serialize (writer, iter->data); return TRUE; }
static gboolean gimp_session_info_serialize (GimpConfig *config, GimpConfigWriter *writer, gpointer data) { GimpSessionInfo *info = GIMP_SESSION_INFO (config); GList *iter = NULL; gint x; gint y; gint width; gint height; if (info->p->factory_entry && info->p->factory_entry->identifier) { gimp_config_writer_open (writer, "factory-entry"); gimp_config_writer_string (writer, info->p->factory_entry->identifier); gimp_config_writer_close (writer); } x = gimp_session_info_apply_position_accuracy (info->p->x); y = gimp_session_info_apply_position_accuracy (info->p->y); width = gimp_session_info_apply_position_accuracy (info->p->width); height = gimp_session_info_apply_position_accuracy (info->p->height); gimp_config_writer_open (writer, "position"); gimp_config_writer_printf (writer, "%d %d", x, y); gimp_config_writer_close (writer); if (info->p->width > 0 && info->p->height > 0) { gimp_config_writer_open (writer, "size"); gimp_config_writer_printf (writer, "%d %d", width, height); gimp_config_writer_close (writer); } if (info->p->monitor != DEFAULT_MONITOR) { gimp_config_writer_open (writer, "monitor"); gimp_config_writer_printf (writer, "%d", monitor_number (info->p->monitor)); gimp_config_writer_close (writer); } if (info->p->open) { gimp_config_writer_open (writer, "open-on-exit"); gimp_config_writer_close (writer); } if (info->p->aux_info) gimp_session_info_aux_serialize (writer, info->p->aux_info); for (iter = info->p->docks; iter; iter = g_list_next (iter)) gimp_session_info_dock_serialize (writer, iter->data); return TRUE; }
static void gimp_session_info_finalize (GObject *object) { GimpSessionInfo *info = GIMP_SESSION_INFO (object); gimp_session_info_clear_info (info); gimp_session_info_set_widget (info, NULL); G_OBJECT_CLASS (parent_class)->finalize (object); }
static gint64 gimp_session_info_get_memsize (GimpObject *object, gint64 *gui_size) { #if 0 GimpSessionInfo *info = GIMP_SESSION_INFO (object); #endif gint64 memsize = 0; return memsize + GIMP_OBJECT_CLASS (parent_class)->get_memsize (object, gui_size); }
static gboolean gimp_session_info_deserialize (GimpConfig *config, GScanner *scanner, gint nest_level, gpointer data) { GimpSessionInfo *info = GIMP_SESSION_INFO (config); GTokenType token; guint scope_id; guint old_scope_id; scope_id = g_type_qname (G_TYPE_FROM_INSTANCE (config)); old_scope_id = g_scanner_set_scope (scanner, scope_id); g_scanner_scope_add_symbol (scanner, scope_id, "factory-entry", GINT_TO_POINTER (SESSION_INFO_FACTORY_ENTRY)); g_scanner_scope_add_symbol (scanner, scope_id, "position", GINT_TO_POINTER (SESSION_INFO_POSITION)); g_scanner_scope_add_symbol (scanner, scope_id, "size", GINT_TO_POINTER (SESSION_INFO_SIZE)); g_scanner_scope_add_symbol (scanner, scope_id, "monitor", GINT_TO_POINTER (SESSION_INFO_MONITOR)); g_scanner_scope_add_symbol (scanner, scope_id, "open-on-exit", GINT_TO_POINTER (SESSION_INFO_OPEN)); g_scanner_scope_add_symbol (scanner, scope_id, "aux-info", GINT_TO_POINTER (SESSION_INFO_AUX)); g_scanner_scope_add_symbol (scanner, scope_id, "gimp-dock", GINT_TO_POINTER (SESSION_INFO_GIMP_DOCK)); g_scanner_scope_add_symbol (scanner, scope_id, "gimp-toolbox", GINT_TO_POINTER (SESSION_INFO_GIMP_TOOLBOX)); /* For sessionrc files from version <= GIMP 2.6 */ g_scanner_scope_add_symbol (scanner, scope_id, "dock", GINT_TO_POINTER (SESSION_INFO_DOCK)); token = G_TOKEN_LEFT_PAREN; while (g_scanner_peek_next_token (scanner) == token) { token = g_scanner_get_next_token (scanner); switch (token) { gint dummy; case G_TOKEN_LEFT_PAREN: token = G_TOKEN_SYMBOL; break; case G_TOKEN_SYMBOL: switch (GPOINTER_TO_INT (scanner->value.v_symbol)) { case SESSION_INFO_FACTORY_ENTRY: { gchar *identifier = NULL; GimpDialogFactoryEntry *entry = NULL; token = G_TOKEN_STRING; if (! gimp_scanner_parse_string (scanner, &identifier)) goto error; entry = gimp_dialog_factory_find_entry (gimp_dialog_factory_get_singleton (), identifier); if (! entry) goto error; gimp_session_info_set_factory_entry (info, entry); g_free (identifier); } break; case SESSION_INFO_POSITION: token = G_TOKEN_INT; if (! gimp_session_info_parse_offset (scanner, &info->p->x, &info->p->right_align)) goto error; if (! gimp_session_info_parse_offset (scanner, &info->p->y, &info->p->bottom_align)) goto error; break; case SESSION_INFO_SIZE: token = G_TOKEN_INT; if (! gimp_scanner_parse_int (scanner, &info->p->width)) goto error; if (! gimp_scanner_parse_int (scanner, &info->p->height)) goto error; break; case SESSION_INFO_MONITOR: token = G_TOKEN_INT; if (gimp_scanner_parse_int (scanner, &dummy)) { info->p->monitor = gdk_display_get_monitor (gdk_display_get_default (), dummy); } else goto error; break; case SESSION_INFO_OPEN: info->p->open = TRUE; /* the screen number is optional, and obsolete */ if (g_scanner_peek_next_token (scanner) == G_TOKEN_RIGHT_PAREN) break; token = G_TOKEN_INT; if (! gimp_scanner_parse_int (scanner, &dummy)) goto error; break; case SESSION_INFO_AUX: token = gimp_session_info_aux_deserialize (scanner, &info->p->aux_info); if (token != G_TOKEN_LEFT_PAREN) goto error; break; case SESSION_INFO_GIMP_TOOLBOX: case SESSION_INFO_GIMP_DOCK: case SESSION_INFO_DOCK: { GimpSessionInfoDock *dock_info = NULL; const gchar *dock_type = NULL; /* Handle old sessionrc:s from versions <= GIMP 2.6 */ if (GPOINTER_TO_INT (scanner->value.v_symbol) == SESSION_INFO_DOCK && info->p->factory_entry && info->p->factory_entry->identifier && strcmp ("gimp-toolbox-window", info->p->factory_entry->identifier) == 0) { dock_type = "gimp-toolbox"; } else { dock_type = ((GPOINTER_TO_INT (scanner->value.v_symbol) == SESSION_INFO_GIMP_TOOLBOX) ? "gimp-toolbox" : "gimp-dock"); } g_scanner_set_scope (scanner, scope_id + 1); token = gimp_session_info_dock_deserialize (scanner, scope_id + 1, &dock_info, dock_type); if (token == G_TOKEN_LEFT_PAREN) { g_scanner_set_scope (scanner, scope_id); info->p->docks = g_list_append (info->p->docks, dock_info); } else goto error; } break; default: break; } token = G_TOKEN_RIGHT_PAREN; break; case G_TOKEN_RIGHT_PAREN: token = G_TOKEN_LEFT_PAREN; break; default: break; } } error: /* If we don't have docks, assume it is a toolbox dock window from a * sessionrc file from GIMP <= 2.6 and add a toolbox dock manually */ if (! info->p->docks && info->p->factory_entry && strcmp ("gimp-toolbox-window", info->p->factory_entry->identifier) == 0) { info->p->docks = g_list_append (info->p->docks, gimp_session_info_dock_new ("gimp-toolbox")); } g_scanner_scope_remove_symbol (scanner, scope_id, "factory-entry"); g_scanner_scope_remove_symbol (scanner, scope_id, "position"); g_scanner_scope_remove_symbol (scanner, scope_id, "size"); g_scanner_scope_remove_symbol (scanner, scope_id, "open-on-exit"); g_scanner_scope_remove_symbol (scanner, scope_id, "aux-info"); g_scanner_scope_remove_symbol (scanner, scope_id, "gimp-dock"); g_scanner_scope_remove_symbol (scanner, scope_id, "gimp-toolbox"); g_scanner_scope_remove_symbol (scanner, scope_id, "dock"); g_scanner_set_scope (scanner, old_scope_id); return gimp_config_deserialize_return (scanner, token, nest_level); }