[gimp] app: Serialize factory entry name along with GimpSessionInfo
- From: Martin Nordholts <martinn src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: Serialize factory entry name along with GimpSessionInfo
- Date: Sat, 20 Feb 2010 12:03:31 +0000 (UTC)
commit dec798e0df179f4ff252055cb75d02c3062b7bbe
Author: Martin Nordholts <martinn src gnome org>
Date: Sat Feb 20 12:13:55 2010 +0100
app: Serialize factory entry name along with GimpSessionInfo
Serialize factory entry name along with GimpSessionInfo so we can make
the Recently Closed Docks feature work across sessions in a natural
way.
app/gui/session.c | 59 ++++++++++++++++++---------------
app/tests/gimpdir/sessionrc-expected | 24 +++++++++----
app/widgets/gimpdialogfactory.c | 2 -
app/widgets/gimpsessioninfo-private.h | 10 +++---
app/widgets/gimpsessioninfo.c | 31 +++++++++++++++++
5 files changed, 84 insertions(+), 42 deletions(-)
---
diff --git a/app/gui/session.c b/app/gui/session.c
index 6c1ab32..52214c5 100644
--- a/app/gui/session.c
+++ b/app/gui/session.c
@@ -131,7 +131,6 @@ session_init (Gimp *gimp)
gchar *factory_name = NULL;
gchar *entry_name = NULL;
GimpDialogFactoryEntry *entry = NULL;
- gboolean skip = FALSE;
token = G_TOKEN_STRING;
@@ -150,52 +149,58 @@ session_init (Gimp *gimp)
strcmp ("display", factory_name) == 0) ?
"toplevel" :
factory_name);
-
if (! factory)
break;
- if (! gimp_scanner_parse_string (scanner, &entry_name))
- break;
-
info = gimp_session_info_new ();
- /* 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".
+ /* GIMP 2.6 has the entry name as part of the
+ * session-info header, so try to get it
*/
- 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
+ gimp_scanner_parse_string (scanner, &entry_name);
+ if (entry_name)
{
- entry = gimp_dialog_factory_find_entry (factory,
- 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);
}
- else
- {
- skip = TRUE;
- }
+ /* Always try to deserialize */
if (gimp_config_deserialize (GIMP_CONFIG (info), scanner, 1, NULL))
{
- if (! skip)
+ /* 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",
diff --git a/app/tests/gimpdir/sessionrc-expected b/app/tests/gimpdir/sessionrc-expected
index 3d93d40..ac5ffe2 100644
--- a/app/tests/gimpdir/sessionrc-expected
+++ b/app/tests/gimpdir/sessionrc-expected
@@ -5,7 +5,8 @@
# of course you can do. The sessionrc will be entirely rewritten every time
# you quit GIMP. If this file isn't found, defaults are used.
-(session-info "toplevel" "gimp-dock-window"
+(session-info "toplevel"
+ (factory-entry "gimp-dock-window")
(position 566 171)
(size 210 535)
(open-on-exit)
@@ -25,7 +26,8 @@
(current-page 0)
(dockable "gimp-brush-grid"
(tab-style preview)))))
-(session-info "toplevel" "gimp-dock-window"
+(session-info "toplevel"
+ (factory-entry "gimp-dock-window")
(position 141 291)
(size 406 300)
(open-on-exit)
@@ -42,7 +44,8 @@
(current-page 0)
(dockable "gimp-device-status"
(tab-style icon)))))
-(session-info "toplevel" "gimp-dock-window"
+(session-info "toplevel"
+ (factory-entry "gimp-dock-window")
(position 795 43)
(size 200 265)
(open-on-exit)
@@ -56,7 +59,8 @@
(tab-style preview))
(dockable "gimp-gradient-list"
(tab-style preview)))))
-(session-info "toplevel" "gimp-dock-window"
+(session-info "toplevel"
+ (factory-entry "gimp-dock-window")
(position 803 344)
(size 200 404)
(open-on-exit)
@@ -78,17 +82,21 @@
(edit-active "true")
(current-data "Standard")
(zoom-factor "2.80"))))))
-(session-info "toplevel" "gimp-toolbox-window"
+(session-info "toplevel"
+ (factory-entry "gimp-toolbox-window")
(position 13 37)
(size 96 620)
(open-on-exit)
(gimp-toolbox))
-(session-info "toplevel" "gimp-file-open-dialog"
+(session-info "toplevel"
+ (factory-entry "gimp-file-open-dialog")
(position 392 140)
(size 902 816))
-(session-info "toplevel" "gimp-image-new-dialog"
+(session-info "toplevel"
+ (factory-entry "gimp-image-new-dialog")
(position 100 100))
-(session-info "toplevel" "gimp-empty-image-window"
+(session-info "toplevel"
+ (factory-entry "gimp-empty-image-window")
(position 140 32)
(size 610 190))
diff --git a/app/widgets/gimpdialogfactory.c b/app/widgets/gimpdialogfactory.c
index 162fd75..a5cb144 100644
--- a/app/widgets/gimpdialogfactory.c
+++ b/app/widgets/gimpdialogfactory.c
@@ -1451,8 +1451,6 @@ gimp_dialog_factories_save_foreach (gconstpointer key,
gimp_config_writer_open (writer, "session-info");
gimp_config_writer_string (writer,
gimp_object_get_name (factory));
- gimp_config_writer_string (writer,
- gimp_session_info_get_factory_entry (info)->identifier);
GIMP_CONFIG_GET_INTERFACE (info)->serialize (GIMP_CONFIG (info),
writer,
diff --git a/app/widgets/gimpsessioninfo-private.h b/app/widgets/gimpsessioninfo-private.h
index 236de75..31ea9a3 100644
--- a/app/widgets/gimpsessioninfo-private.h
+++ b/app/widgets/gimpsessioninfo-private.h
@@ -24,6 +24,11 @@
struct _GimpSessionInfoPrivate
{
+ /* the dialog factory entry for object we have session info for
+ * note that pure "dock" entries don't have any factory entry
+ */
+ GimpDialogFactoryEntry *factory_entry;
+
gint x;
gint y;
gint width;
@@ -40,11 +45,6 @@ struct _GimpSessionInfoPrivate
GtkWidget *widget;
- /* the dialog factory entry for object we have session info for
- * note that pure "dock" entries don't have any factory entry
- */
- GimpDialogFactoryEntry *factory_entry;
-
/* list of GimpSessionInfoDock */
GList *docks;
};
diff --git a/app/widgets/gimpsessioninfo.c b/app/widgets/gimpsessioninfo.c
index aadd59b..c2408b3 100644
--- a/app/widgets/gimpsessioninfo.c
+++ b/app/widgets/gimpsessioninfo.c
@@ -44,6 +44,7 @@
enum
{
+ SESSION_INFO_FACTORY_ENTRY,
SESSION_INFO_POSITION,
SESSION_INFO_SIZE,
SESSION_INFO_OPEN,
@@ -137,6 +138,13 @@ gimp_session_info_serialize (GimpConfig *config,
GimpSessionInfo *info = GIMP_SESSION_INFO (config);
GList *iter = NULL;
+ 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);
+ }
+
gimp_config_writer_open (writer, "position");
gimp_config_writer_printf (writer, "%d %d", info->p->x, info->p->y);
gimp_config_writer_close (writer);
@@ -213,6 +221,8 @@ gimp_session_info_deserialize (GimpConfig *config,
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",
@@ -245,6 +255,26 @@ gimp_session_info_deserialize (GimpConfig *config,
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_from_name ("toplevel"),
+ 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,
@@ -351,6 +381,7 @@ gimp_session_info_deserialize (GimpConfig *config,
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");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]