[gimp] app: Serialize factory entry name along with GimpSessionInfo



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]