[gimp] app: Merge 'global_toolbox_factory' into 'global_dock_factory'



commit 1093462ae9777a7f8446eda13735a9348b43ecb1
Author: Martin Nordholts <martinn src gnome org>
Date:   Wed Jan 20 18:29:54 2010 +0100

    app: Merge 'global_toolbox_factory' into 'global_dock_factory'
    
    Get rid of 'global_toolbox_factory' and manage everything dock-related
    with 'global_dock_factory'. The whole of 'global_toolbox_factory' was
    a big special-case and getting rid of it makes it easier to extend the
    session management with e.g. single-window mode dock functionality.
    
    To get rid of 'global_toolbox_factory' we, roughly, have to
     * Replace 'global_toolbox_factory' with 'global_dock_factory'
       everywhere. We can also get rid of lots of code that did special
       things for the "toolbox" factory.
     * Make the use or interaction with the toolbox explicit in some
       places. For example, a function gimp_dock_window_has_toolbox() has
       been introduced.
     * Make GimpSessionInfoDock have an 'identifier' parameter so we can
       differentiate between the "gimp-dock" and "gimp-toolbox" dock
       types.

 app/actions/windows-commands.c         |    7 ++--
 app/dialogs/dialogs-constructors.c     |    6 +---
 app/dialogs/dialogs.c                  |   54 +++---------------------------
 app/dialogs/dialogs.h                  |    1 -
 app/gui/gimpuiconfigurer.c             |   38 ++++++++++++++--------
 app/gui/session.c                      |   10 +++++-
 app/tests/gimpdir/dockrc               |    4 +-
 app/tests/test-window-management.c     |    8 +++--
 app/widgets/gimpdialogfactory.c        |   55 ++++++++++---------------------
 app/widgets/gimpdialogfactory.h        |    3 +-
 app/widgets/gimpdockable.c             |    3 +-
 app/widgets/gimpdockwindow.c           |   26 +++++++++++++++
 app/widgets/gimpdockwindow.h           |    2 +
 app/widgets/gimpsessioninfo-dock.c     |   37 +++++++++++++---------
 app/widgets/gimpsessioninfo-dock.h     |    8 +++-
 app/widgets/gimpsessioninfo-dockable.c |   14 +++-----
 app/widgets/gimpsessioninfo.c          |   36 +++++++++++++++++++--
 17 files changed, 167 insertions(+), 145 deletions(-)
---
diff --git a/app/actions/windows-commands.c b/app/actions/windows-commands.c
index 73f5e4c..f9a4a12 100644
--- a/app/actions/windows-commands.c
+++ b/app/actions/windows-commands.c
@@ -102,10 +102,11 @@ windows_show_toolbox (void)
 {
   GtkWidget *toolbox = NULL;
 
-  if (! gimp_dialog_factory_get_open_dialogs (global_toolbox_factory))
+  if (! dialogs_get_toolbox ())
     {
-      toolbox = gimp_dialog_factory_dock_with_window_new (global_toolbox_factory,
-                                                          gdk_screen_get_default ());
+      toolbox = gimp_dialog_factory_dock_with_window_new (global_dock_factory,
+                                                          gdk_screen_get_default (),
+                                                          TRUE /*toolbox*/);
 
       gtk_widget_show (toolbox);
     }
diff --git a/app/dialogs/dialogs-constructors.c b/app/dialogs/dialogs-constructors.c
index 301d3f5..83c321c 100644
--- a/app/dialogs/dialogs-constructors.c
+++ b/app/dialogs/dialogs-constructors.c
@@ -235,11 +235,7 @@ dialogs_toolbox_new (GimpDialogFactory *factory,
                      GimpUIManager     *ui_manager,
                      gint               view_size)
 {
-  /*  we pass "global_dock_factory", _not_ "global_toolbox_factory" to
-   *  the toolbox constructor, because the global_toolbox_factory has
-   *  no dockables registered
-   */
-  return gimp_toolbox_new (global_dock_factory,
+  return gimp_toolbox_new (factory,
                            context,
                            ui_manager);
 }
diff --git a/app/dialogs/dialogs.c b/app/dialogs/dialogs.c
index 3c093dd..392aeb2 100644
--- a/app/dialogs/dialogs.c
+++ b/app/dialogs/dialogs.c
@@ -30,9 +30,11 @@
 #include "core/gimplist.h"
 
 #include "widgets/gimpdialogfactory.h"
+#include "widgets/gimpdockwindow.h"
 #include "widgets/gimphelp-ids.h"
 #include "widgets/gimpmenufactory.h"
 #include "widgets/gimpsessioninfo.h"
+#include "widgets/gimptoolbox.h"
 
 #include "dialogs.h"
 #include "dialogs-constructors.h"
@@ -42,7 +44,6 @@
 
 GimpDialogFactory *global_dialog_factory  = NULL;
 GimpDialogFactory *global_dock_factory    = NULL;
-GimpDialogFactory *global_toolbox_factory = NULL;
 GimpDialogFactory *global_display_factory = NULL;
 
 GimpContainer     *global_recent_docks    = NULL;
@@ -343,17 +344,6 @@ static const GimpDialogFactoryEntry dock_entries[] =
             dialogs_palette_editor_get, 0, TRUE)
 };
 
-static const GimpDialogFactoryEntry toolbox_entries[] =
-{
-  /*  docks  */
-  DOCK ("gimp-toolbox",
-        dialogs_toolbox_new),
-
-  /*  dock windows  */
-  DOCK_WINDOW ("gimp-toolbox-window",
-               dialogs_toolbox_dock_window_new)
-};
-
 
 /*  public functions  */
 
@@ -372,12 +362,6 @@ dialogs_init (Gimp            *gimp,
                                                    menu_factory,
                                                    TRUE);
 
-  /* Toolbox */
-  global_toolbox_factory = gimp_dialog_factory_new ("toolbox",
-                                                    gimp_get_user_context (gimp),
-                                                    menu_factory,
-                                                    TRUE);
-
   /* Dock windows and docks */
   global_dock_factory = gimp_dialog_factory_new ("dock",
                                                  gimp_get_user_context (gimp),
@@ -421,21 +405,6 @@ dialogs_init (Gimp            *gimp,
                                         dock_entries[i].remember_if_open,
                                         dock_entries[i].dockable);
 
-  for (i = 0; i < G_N_ELEMENTS (toolbox_entries); i++)
-    gimp_dialog_factory_register_entry (global_toolbox_factory,
-                                        toolbox_entries[i].identifier,
-                                        gettext (toolbox_entries[i].name),
-                                        gettext (toolbox_entries[i].blurb),
-                                        toolbox_entries[i].stock_id,
-                                        toolbox_entries[i].help_id,
-                                        toolbox_entries[i].new_func,
-                                        toolbox_entries[i].view_size,
-                                        toolbox_entries[i].singleton,
-                                        toolbox_entries[i].session_managed,
-                                        toolbox_entries[i].remember_size,
-                                        toolbox_entries[i].remember_if_open,
-                                        toolbox_entries[i].dockable);
-
   gimp_dialog_factory_register_entry (global_display_factory,
                                       "gimp-empty-image-window",
                                       NULL, NULL,
@@ -462,18 +431,6 @@ dialogs_exit (Gimp *gimp)
       global_dialog_factory = NULL;
     }
 
-  /*  destroy the "global_toolbox_factory" _before_ destroying the
-   *  "global_dock_factory" because the "global_toolbox_factory" owns
-   *  dockables which were created by the "global_dock_factory".  This
-   *  way they are properly removed from the "global_dock_factory",
-   *  which would complain about stale entries otherwise.
-   */
-  if (global_toolbox_factory)
-    {
-      g_object_unref (global_toolbox_factory);
-      global_toolbox_factory = NULL;
-    }
-
   if (global_dock_factory)
     {
       g_object_unref (global_dock_factory);
@@ -552,13 +509,14 @@ dialogs_get_toolbox (void)
 {
   GList *list;
 
-  g_return_val_if_fail (GIMP_IS_DIALOG_FACTORY (global_toolbox_factory), NULL);
+  g_return_val_if_fail (GIMP_IS_DIALOG_FACTORY (global_dock_factory), NULL);
 
-  for (list = gimp_dialog_factory_get_open_dialogs (global_toolbox_factory);
+  for (list = gimp_dialog_factory_get_open_dialogs (global_dock_factory);
        list;
        list = g_list_next (list))
     {
-      if (gtk_widget_is_toplevel (list->data))
+      if (GIMP_IS_DOCK_WINDOW (list->data) &&
+          gimp_dock_window_has_toolbox (list->data))
         return list->data;
     }
 
diff --git a/app/dialogs/dialogs.h b/app/dialogs/dialogs.h
index 84b227d..6c592ee 100644
--- a/app/dialogs/dialogs.h
+++ b/app/dialogs/dialogs.h
@@ -21,7 +21,6 @@
 
 extern GimpDialogFactory *global_dialog_factory;
 extern GimpDialogFactory *global_dock_factory;
-extern GimpDialogFactory *global_toolbox_factory;
 extern GimpDialogFactory *global_display_factory;
 
 extern GimpContainer     *global_recent_docks;
diff --git a/app/gui/gimpuiconfigurer.c b/app/gui/gimpuiconfigurer.c
index ed81402..1e4a338 100644
--- a/app/gui/gimpuiconfigurer.c
+++ b/app/gui/gimpuiconfigurer.c
@@ -66,8 +66,8 @@ static void              gimp_ui_configurer_get_property                (GObject
                                                                          GValue            *value,
                                                                          GParamSpec        *pspec);
 static void              gimp_ui_configurer_move_docks_to_columns       (GimpUIConfigurer  *ui_configurer,
-                                                                         GimpDialogFactory *dialog_factory,
-                                                                         GimpDockColumns   *dock_columns);
+                                                                         GimpDockColumns   *dock_columns,
+                                                                         gboolean           only_toolbox);
 static void              gimp_ui_configurer_move_shells                 (GimpUIConfigurer  *ui_configurer,
                                                                          GimpImageWindow   *source_image_window,
                                                                          GimpImageWindow   *target_image_window);
@@ -154,12 +154,15 @@ gimp_ui_configurer_get_property (GObject    *object,
 
 static void
 gimp_ui_configurer_move_docks_to_columns (GimpUIConfigurer  *ui_configurer,
-                                          GimpDialogFactory *dialog_factory,
-                                          GimpDockColumns   *dock_columns)
+                                          GimpDockColumns   *dock_columns,
+                                          gboolean           only_toolbox)
 {
-  GList *dialogs     = g_list_copy (gimp_dialog_factory_get_open_dialogs (dialog_factory));
+  GList *dialogs     = NULL;
   GList *dialog_iter = NULL;
 
+  dialogs =
+    g_list_copy (gimp_dialog_factory_get_open_dialogs (global_dock_factory));
+
   for (dialog_iter = dialogs; dialog_iter; dialog_iter = dialog_iter->next)
     {
       GimpDockWindow *dock_window = NULL;
@@ -176,6 +179,10 @@ gimp_ui_configurer_move_docks_to_columns (GimpUIConfigurer  *ui_configurer,
         {
           GimpDock *dock = GIMP_DOCK (dock_iter->data);
 
+          if (only_toolbox &&
+              ! GIMP_IS_TOOLBOX (dock))
+            continue;
+
           /* Move the dock from the image window to the dock columns
            * widget. Note that we need a ref while the dock is parentless
            */
@@ -189,9 +196,14 @@ gimp_ui_configurer_move_docks_to_columns (GimpUIConfigurer  *ui_configurer,
       /* Kill the window if removing the dock didn't destroy it
        * already. This will be the case for the toolbox dock window
        */
-      if (GTK_IS_WIDGET (dock_window))
+      /* FIXME: We should solve this in a more elegant way, valgrind
+       * complains about invalid reads when the dock window already is
+       * destroyed
+       */
+      if (GTK_IS_WIDGET (dock_window) &&
+          g_list_length (gimp_dock_window_get_docks (dock_window)) == 0)
         {
-          gimp_dialog_factory_remove_dialog (dialog_factory,
+          gimp_dialog_factory_remove_dialog (global_dock_factory,
                                              GTK_WIDGET (dock_window));
           gtk_widget_destroy (GTK_WIDGET (dock_window));
         }
@@ -271,9 +283,7 @@ gimp_ui_configurer_move_docks_to_window (GimpUIConfigurer *ui_configurer,
        * toolbox
        */
       dock_window =
-        gimp_dialog_factory_dialog_new ((GIMP_IS_TOOLBOX (dock) ?
-                                         global_toolbox_factory :
-                                         global_dock_factory),
+        gimp_dialog_factory_dialog_new (global_dock_factory,
                                         screen,
                                         (GIMP_IS_TOOLBOX (dock) ?
                                          "gimp-toolbox-window" :
@@ -362,15 +372,15 @@ gimp_ui_configurer_configure_for_single_window (GimpUIConfigurer *ui_configurer)
    * window
    */
   gimp_ui_configurer_move_docks_to_columns (ui_configurer,
-                                            global_toolbox_factory,
-                                            left_docks);
+                                            left_docks,
+                                            TRUE /*only_toolbox*/);
 
   /* Then move the other docks to the right side of the image
    * window
    */
   gimp_ui_configurer_move_docks_to_columns (ui_configurer,
-                                            global_dock_factory,
-                                            right_docks);
+                                            right_docks,
+                                            FALSE /*only_toolbox*/);
 
   /* Show the docks in the window */
   gimp_image_window_set_show_docks (uber_image_window, TRUE);
diff --git a/app/gui/session.c b/app/gui/session.c
index 8dec208..2b7c30c 100644
--- a/app/gui/session.c
+++ b/app/gui/session.c
@@ -138,7 +138,15 @@ session_init (Gimp *gimp)
               if (! gimp_scanner_parse_string (scanner, &factory_name))
                 break;
 
-              factory = gimp_dialog_factory_from_name (factory_name);
+              /* In versions <= GIMP 2.6 there was a "toolbox" and a
+               * "dock" factory. These are now merged so if the
+               * factory name is "toolbox", get the "dock" factory
+               * instead. We don't change factory_name because we need
+               * it below
+               */
+              factory = gimp_dialog_factory_from_name (strcmp ("toolbox", factory_name) == 0 ?
+                                                       "dock" :
+                                                       factory_name);
 
               if (! factory)
                 break;
diff --git a/app/tests/gimpdir/dockrc b/app/tests/gimpdir/dockrc
index 305ddee..a6f0d21 100644
--- a/app/tests/gimpdir/dockrc
+++ b/app/tests/gimpdir/dockrc
@@ -7,7 +7,7 @@
     (aux-info
         (show-image-menu "false")
         (follow-active-image "true"))
-    (dock
+    (gimp-dock
         (book
             (current-page 0)
             (dockable "gimp-palette-list"
@@ -31,7 +31,7 @@
     (aux-info
         (show-image-menu "false")
         (follow-active-image "true"))
-    (dock
+    (gimp-dock
         (book
             (current-page 1)
             (dockable "gimp-selection-editor"
diff --git a/app/tests/test-window-management.c b/app/tests/test-window-management.c
index 1b58d71..d60c081 100644
--- a/app/tests/test-window-management.c
+++ b/app/tests/test-window-management.c
@@ -94,9 +94,11 @@ gimp_test_window_roles (GimpTestFixture *fixture,
   GimpDockWindow *toolbox_window = NULL;
 
   dock           = gimp_dialog_factory_dock_with_window_new (global_dock_factory,
-                                                             gdk_screen_get_default ());
-  toolbox        = gimp_dialog_factory_dock_with_window_new (global_toolbox_factory,
-                                                             gdk_screen_get_default ());
+                                                             gdk_screen_get_default (),
+                                                             FALSE /*toolbox*/);
+  toolbox        = gimp_dialog_factory_dock_with_window_new (global_dock_factory,
+                                                             gdk_screen_get_default (),
+                                                             TRUE /*toolbox*/);
   dock_window    = gimp_dock_window_from_dock (GIMP_DOCK (dock));
   toolbox_window = gimp_dock_window_from_dock (GIMP_DOCK (toolbox));
 
diff --git a/app/widgets/gimpdialogfactory.c b/app/widgets/gimpdialogfactory.c
index b76b54e..97b3036 100644
--- a/app/widgets/gimpdialogfactory.c
+++ b/app/widgets/gimpdialogfactory.c
@@ -210,10 +210,7 @@ gimp_dialog_factory_dispose (GObject *object)
       factory->p->session_infos = NULL;
     }
 
-  if (strcmp (gimp_object_get_name (factory), "toolbox") == 0)
-    key = "";
-  else
-    key = (gpointer)gimp_object_get_name (factory);
+  key = (gpointer)gimp_object_get_name (factory);
 
   g_hash_table_remove (GIMP_DIALOG_FACTORY_GET_CLASS (object)->factories,
                        key);
@@ -274,11 +271,7 @@ gimp_dialog_factory_new (const gchar           *name,
 
   gimp_object_set_name (GIMP_OBJECT (factory), name);
 
-  /*  hack to keep the toolbox on the pool position  */
-  if (strcmp (name, "toolbox") == 0)
-    key = "";
-  else
-    key = (gpointer)gimp_object_get_name (factory);
+  key = (gpointer)gimp_object_get_name (factory);
 
   g_hash_table_insert (GIMP_DIALOG_FACTORY_GET_CLASS (factory)->factories,
                        key, factory);
@@ -302,10 +295,6 @@ gimp_dialog_factory_from_name (const gchar *name)
   if (! factory_class)
     return NULL;
 
-  /*  hack to keep the toolbox on the pool position  */
-  if (strcmp (name, "toolbox") == 0)
-    name = "";
-
   factory =
     (GimpDialogFactory *) g_hash_table_lookup (factory_class->factories, name);
 
@@ -490,7 +479,9 @@ gimp_dialog_factory_dialog_new_internal (GimpDialogFactory *factory,
            *  dialog. We do this because the new dockable needs to be
            *  created in its dock's context.
            */
-          dock     = gimp_dialog_factory_dock_with_window_new (factory, screen);
+          dock     = gimp_dialog_factory_dock_with_window_new (factory,
+                                                               screen,
+                                                               FALSE /*toolbox*/);
           dockbook = gimp_dockbook_new (factory->p->menu_factory);
 
           gimp_dock_add_book (GIMP_DOCK (dock),
@@ -813,10 +804,10 @@ gimp_dialog_factory_dockable_new (GimpDialogFactory *factory,
  **/
 GtkWidget *
 gimp_dialog_factory_dock_with_window_new (GimpDialogFactory *factory,
-                                          GdkScreen         *screen)
+                                          GdkScreen         *screen,
+                                          gboolean           toolbox)
 {
   GtkWidget     *dock_window = NULL;
-  gchar         *dock_id     = NULL;
   GtkWidget     *dock        = NULL;
   GimpUIManager *ui_manager  = NULL;
 
@@ -830,7 +821,7 @@ gimp_dialog_factory_dock_with_window_new (GimpDialogFactory *factory,
   dock_window =
     gimp_dialog_factory_dialog_new (factory,
                                     screen,
-                                    (strcmp ("toolbox", gimp_object_get_name (factory)) == 0 ?
+                                    (toolbox ?
                                      "gimp-toolbox-window" :
                                      "gimp-dock-window"),
                                     -1 /*view_size*/,
@@ -838,17 +829,13 @@ gimp_dialog_factory_dock_with_window_new (GimpDialogFactory *factory,
 
   /* Create the dock */
   ui_manager = gimp_dock_window_get_ui_manager (GIMP_DOCK_WINDOW (dock_window));
-  
-  dock_id = g_strconcat ("gimp-", gimp_object_get_name (factory), NULL);
-  dock    = gimp_dialog_factory_dialog_new (factory,
-                                            screen,
-                                            (strcmp ("toolbox", gimp_object_get_name (factory)) == 0 ?
-                                             "gimp-toolbox" :
-                                             "gimp-dock"),
-                                            -1 /*view_size*/,
-                                            FALSE /*present*/);
-  g_free (dock_id);
-
+  dock       = gimp_dialog_factory_dialog_new (factory,
+                                               screen,
+                                               (toolbox ?
+                                                "gimp-toolbox" :
+                                                "gimp-dock"),
+                                               -1 /*view_size*/,
+                                               FALSE /*present*/);
   if (dock)
     {
       /* Put the dock in the dock window */
@@ -1453,8 +1440,7 @@ gimp_dialog_factories_save_foreach (gconstpointer      key,
 
   for (infos = factory->p->session_infos; infos; infos = g_list_next (infos))
     {
-      GimpSessionInfo *info       = infos->data;
-      const gchar     *identifier = NULL;
+      GimpSessionInfo *info = infos->data;
 
       /*  we keep session info entries for all toplevel dialogs created
        *  by the factory but don't save them if they don't want to be
@@ -1470,13 +1456,8 @@ gimp_dialog_factories_save_foreach (gconstpointer      key,
       gimp_config_writer_open (writer, "session-info");
       gimp_config_writer_string (writer,
                                  gimp_object_get_name (factory));
-
-      /* Some special casing to be avoid changing sessionrc */
-      identifier = gimp_session_info_get_factory_entry (info)->identifier;
-      if (strcmp (identifier, "gimp-dock-window")    == 0 ||
-          strcmp (identifier, "gimp-toolbox-window") == 0)
-        identifier = "dock";
-      gimp_config_writer_string (writer, identifier);
+      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/gimpdialogfactory.h b/app/widgets/gimpdialogfactory.h
index f6f542d..d2cb764 100644
--- a/app/widgets/gimpdialogfactory.h
+++ b/app/widgets/gimpdialogfactory.h
@@ -148,7 +148,8 @@ GtkWidget *         gimp_dialog_factory_dockable_new         (GimpDialogFactory
                                                               const gchar             *identifier,
                                                               gint                     view_size);
 GtkWidget *         gimp_dialog_factory_dock_with_window_new (GimpDialogFactory       *factory,
-                                                              GdkScreen               *screen);
+                                                              GdkScreen               *screen,
+                                                              gboolean                 toolbox);
 void                gimp_dialog_factory_add_dialog           (GimpDialogFactory       *factory,
                                                               GtkWidget               *dialog);
 void                gimp_dialog_factory_add_foreign          (GimpDialogFactory       *factory,
diff --git a/app/widgets/gimpdockable.c b/app/widgets/gimpdockable.c
index 1194a32..c6b849b 100644
--- a/app/widgets/gimpdockable.c
+++ b/app/widgets/gimpdockable.c
@@ -1206,7 +1206,8 @@ gimp_dockable_detach (GimpDockable *dockable)
   src_dock_window = gimp_dock_window_from_dock (src_dock);
 
   dock = gimp_dialog_factory_dock_with_window_new (global_dock_factory,
-                                                   gtk_widget_get_screen (GTK_WIDGET (dockable)));
+                                                   gtk_widget_get_screen (GTK_WIDGET (dockable)),
+                                                   FALSE /*toolbox*/);
   dock_window = gimp_dock_window_from_dock (GIMP_DOCK (dock));
   gtk_window_set_position (GTK_WINDOW (dock_window), GTK_WIN_POS_MOUSE);
   if (src_dock_window)
diff --git a/app/widgets/gimpdockwindow.c b/app/widgets/gimpdockwindow.c
index f37338e..813e815 100644
--- a/app/widgets/gimpdockwindow.c
+++ b/app/widgets/gimpdockwindow.c
@@ -53,6 +53,7 @@
 #include "gimpmenufactory.h"
 #include "gimpsessioninfo-aux.h"
 #include "gimpsessioninfo.h"
+#include "gimptoolbox.h"
 #include "gimpuimanager.h"
 #include "gimpwidgets-utils.h"
 #include "gimpwindow.h"
@@ -1066,6 +1067,31 @@ gimp_dock_window_get_aux_info (GimpDockWindow *dock_window)
   return aux_info;
 }
 
+/**
+ * gimp_dock_window_has_toolbox:
+ * @dock_window:
+ *
+ * Returns: %TRUE if the dock window has a GimpToolbox dock, %FALSE
+ * otherwise.
+ **/
+gboolean
+gimp_dock_window_has_toolbox (GimpDockWindow *dock_window)
+{
+  GList *iter = NULL;
+
+  g_return_val_if_fail (GIMP_IS_DOCK_WINDOW (dock_window), FALSE);
+
+  for (iter = gimp_dock_columns_get_docks (dock_window->p->dock_columns);
+       iter;
+       iter = g_list_next (iter))
+    {
+      if (GIMP_IS_TOOLBOX (iter->data))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
 
 /**
  * gimp_dock_window_from_dock:
diff --git a/app/widgets/gimpdockwindow.h b/app/widgets/gimpdockwindow.h
index 45f0839..8ece994 100644
--- a/app/widgets/gimpdockwindow.h
+++ b/app/widgets/gimpdockwindow.h
@@ -83,8 +83,10 @@ void                gimp_dock_window_setup                  (GimpDockWindow    *
 void                gimp_dock_window_set_aux_info           (GimpDockWindow    *dock,
                                                              GList             *aux_info);
 GList             * gimp_dock_window_get_aux_info           (GimpDockWindow    *dock);
+gboolean            gimp_dock_window_has_toolbox            (GimpDockWindow    *dock_window);
 
 GimpDockWindow    * gimp_dock_window_from_dock              (GimpDock          *dock);
 
 
+
 #endif /* __GIMP_DOCK_WINDOW_H__ */
diff --git a/app/widgets/gimpsessioninfo-dock.c b/app/widgets/gimpsessioninfo-dock.c
index 4366620..a620c5b 100644
--- a/app/widgets/gimpsessioninfo-dock.c
+++ b/app/widgets/gimpsessioninfo-dock.c
@@ -34,6 +34,7 @@
 #include "gimpsessioninfo-book.h"
 #include "gimpsessioninfo-dock.h"
 #include "gimpsessioninfo-private.h"
+#include "gimptoolbox.h"
 
 
 enum
@@ -45,9 +46,14 @@ enum
 /*  public functions  */
 
 GimpSessionInfoDock *
-gimp_session_info_dock_new (void)
+gimp_session_info_dock_new (const gchar *identifier)
 {
-  return g_slice_new0 (GimpSessionInfoDock);
+  GimpSessionInfoDock *dock_info = NULL;
+
+  dock_info = g_slice_new0 (GimpSessionInfoDock);
+  dock_info->identifier = g_strdup (identifier);
+
+  return dock_info;
 }
 
 void
@@ -55,6 +61,12 @@ gimp_session_info_dock_free (GimpSessionInfoDock *dock_info)
 {
   g_return_if_fail (dock_info != NULL);
 
+  if (dock_info->identifier)
+    {
+      g_free (dock_info->identifier);
+      dock_info->identifier = NULL;
+    }
+
   if (dock_info->books)
     {
       g_list_foreach (dock_info->books,
@@ -76,7 +88,7 @@ gimp_session_info_dock_serialize (GimpConfigWriter    *writer,
   g_return_if_fail (writer != NULL);
   g_return_if_fail (dock_info != NULL);
 
-  gimp_config_writer_open (writer, "dock");
+  gimp_config_writer_open (writer, dock_info->identifier);
 
   for (list = dock_info->books; list; list = g_list_next (list))
     gimp_session_info_book_serialize (writer, list->data);
@@ -87,7 +99,8 @@ gimp_session_info_dock_serialize (GimpConfigWriter    *writer,
 GTokenType
 gimp_session_info_dock_deserialize (GScanner             *scanner,
                                     gint                  scope,
-                                    GimpSessionInfoDock **dock_info)
+                                    GimpSessionInfoDock **dock_info,
+                                    const gchar          *identifier)
 {
   GTokenType token;
 
@@ -97,7 +110,7 @@ gimp_session_info_dock_deserialize (GScanner             *scanner,
   g_scanner_scope_add_symbol (scanner, scope, "book",
                               GINT_TO_POINTER (SESSION_INFO_BOOK));
 
-  *dock_info = gimp_session_info_dock_new ();
+  *dock_info = gimp_session_info_dock_new (identifier);
 
   token = G_TOKEN_LEFT_PAREN;
 
@@ -159,7 +172,9 @@ gimp_session_info_dock_from_widget (GimpDock *dock)
 
   g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL);
 
-  dock_info = gimp_session_info_dock_new ();
+  dock_info = gimp_session_info_dock_new (GIMP_IS_TOOLBOX (dock) ?
+                                          "gimp-toolbox" :
+                                          "gimp-dock");
 
   for (list = gimp_dock_get_dockbooks (dock); list; list = g_list_next (list))
     {
@@ -206,7 +221,6 @@ gimp_session_info_dock_restore (GimpSessionInfoDock *dock_info,
                                 GdkScreen           *screen,
                                 GimpDockWindow      *dock_window)
 {
-  gchar         *dock_id    = NULL;
   GtkWidget     *dock       = NULL;
   GList         *iter       = NULL;
   GimpUIManager *ui_manager = NULL;
@@ -215,18 +229,11 @@ gimp_session_info_dock_restore (GimpSessionInfoDock *dock_info,
   g_return_if_fail (GDK_IS_SCREEN (screen));
 
   ui_manager = gimp_dock_window_get_ui_manager (GIMP_DOCK_WINDOW (dock_window));
-
-  /* Create the dock. Always use the dock window factory for it (but
-   * we want to refactor away that hard-coding eventually) but the
-   * type of dock depends on the factory
-   */
-  dock_id    = g_strconcat ("gimp-", gimp_object_get_name (factory), NULL);
   dock       = gimp_dialog_factory_dialog_new (factory,
                                                screen,
-                                               dock_id,
+                                               dock_info->identifier,
                                                -1 /*view_size*/,
                                                FALSE /*present*/);
-  g_free (dock_id);
 
   g_return_if_fail (GIMP_IS_DOCK (dock));
 
diff --git a/app/widgets/gimpsessioninfo-dock.h b/app/widgets/gimpsessioninfo-dock.h
index 35abf42..4acf156 100644
--- a/app/widgets/gimpsessioninfo-dock.h
+++ b/app/widgets/gimpsessioninfo-dock.h
@@ -29,17 +29,21 @@
  */
 struct _GimpSessionInfoDock
 {
+  /* Identifier written to/read from sessionrc */
+  gchar *identifier;
+
   /*  list of GimpSessionInfoBook  */
   GList *books;
 };
 
-GimpSessionInfoDock * gimp_session_info_dock_new         (void);
+GimpSessionInfoDock * gimp_session_info_dock_new         (const gchar          *identifier);
 void                  gimp_session_info_dock_free        (GimpSessionInfoDock  *dock_info);
 void                  gimp_session_info_dock_serialize   (GimpConfigWriter     *writer,
                                                           GimpSessionInfoDock  *dock);
 GTokenType            gimp_session_info_dock_deserialize (GScanner             *scanner,
                                                           gint                  scope,
-                                                          GimpSessionInfoDock **info);
+                                                          GimpSessionInfoDock **info,
+                                                          const gchar          *identifier);
 GimpSessionInfoDock * gimp_session_info_dock_from_widget (GimpDock             *dock);
 void                  gimp_session_info_dock_restore     (GimpSessionInfoDock  *dock_info,
                                                           GimpDialogFactory    *factory,
diff --git a/app/widgets/gimpsessioninfo-dockable.c b/app/widgets/gimpsessioninfo-dockable.c
index 1d9973d..8f268ea 100644
--- a/app/widgets/gimpsessioninfo-dockable.c
+++ b/app/widgets/gimpsessioninfo-dockable.c
@@ -282,15 +282,11 @@ gimp_session_info_dockable_restore (GimpSessionInfoDockable *info,
       info->view_size > GIMP_VIEW_SIZE_GIGANTIC)
     info->view_size = -1;
 
-  /* FIXME: Merge global_dock_factory and global_toolbox_factory
-   * somehow so we don't need this hack
-   */
-  dockable = gimp_dialog_factory_dockable_new ((GIMP_IS_TOOLBOX (dock) ?
-                                                gimp_toolbox_get_dialog_factory (GIMP_TOOLBOX (dock)) :
-                                                gimp_dock_get_dialog_factory (dock)),
-                                               dock,
-                                               info->identifier,
-                                               info->view_size);
+  dockable =
+    gimp_dialog_factory_dockable_new (gimp_dock_get_dialog_factory (dock),
+                                      dock,
+                                      info->identifier,
+                                      info->view_size);
 
   if (dockable)
     {
diff --git a/app/widgets/gimpsessioninfo.c b/app/widgets/gimpsessioninfo.c
index 56cf940..3a736ab 100644
--- a/app/widgets/gimpsessioninfo.c
+++ b/app/widgets/gimpsessioninfo.c
@@ -48,7 +48,9 @@ enum
   SESSION_INFO_SIZE,
   SESSION_INFO_OPEN,
   SESSION_INFO_AUX,
-  SESSION_INFO_DOCK
+  SESSION_INFO_DOCK,
+  SESSION_INFO_GIMP_DOCK,
+  SESSION_INFO_GIMP_TOOLBOX
 };
 
 #define DEFAULT_SCREEN  -1
@@ -219,6 +221,12 @@ gimp_session_info_deserialize (GimpConfig *config,
                               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));
 
@@ -276,13 +284,33 @@ gimp_session_info_deserialize (GimpConfig *config,
                 goto error;
               break;
 
+            case SESSION_INFO_GIMP_TOOLBOX:
+            case SESSION_INFO_GIMP_DOCK:
             case SESSION_INFO_DOCK:
               {
-                GimpSessionInfoDock *dock_info = NULL;
+                GimpSessionInfoDock *dock_info  = NULL;
+                const gchar         *identifier = 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)
+                  {
+                    identifier = "gimp-toolbox";
+                  }
+                else
+                  {
+                    identifier = ((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_info,
+                                                            identifier);
 
                 if (token == G_TOKEN_LEFT_PAREN)
                   {
@@ -315,6 +343,8 @@ gimp_session_info_deserialize (GimpConfig *config,
   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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]