[gimp] app: Set a GimpContext on GimpDockColumns



commit 4fcd3024f1d13ddaeca18060d1bb5d93468fdb58
Author: Martin Nordholts <martinn src gnome org>
Date:   Tue Jan 5 11:08:10 2010 +0100

    app: Set a GimpContext on GimpDockColumns
    
    In order to make a GimpDock get hold of a GimpContext both in
    single-window mode and in multi-window mode, don't make it look for a
    GimpContext in a GimpDockWindow, put the context in GimpDockColumns
    instead. GimpDockColumns exists both in s-w-m and m-w-m, contrary to
    GimpDockWindow. Still use the GimpDockWindow as a backup though.

 app/display/gimpimagewindow.c |    4 ++
 app/widgets/gimpdock.c        |   64 +++++++++++++++++++++++++++++++---------
 app/widgets/gimpdockcolumns.c |   23 +++++++++++++-
 app/widgets/gimpdockcolumns.h |    3 ++
 app/widgets/gimpdockwindow.c  |    7 ++++
 5 files changed, 84 insertions(+), 17 deletions(-)
---
diff --git a/app/display/gimpimagewindow.c b/app/display/gimpimagewindow.c
index 1bdcae8..42b4051 100644
--- a/app/display/gimpimagewindow.c
+++ b/app/display/gimpimagewindow.c
@@ -311,6 +311,8 @@ gimp_image_window_constructor (GType                  type,
 
   /* Create the left dock columns widget */
   private->left_docks = g_object_new (GIMP_TYPE_DOCK_COLUMNS, NULL);
+  gimp_dock_columns_set_context (GIMP_DOCK_COLUMNS (private->left_docks),
+                                 gimp_get_user_context (private->gimp));
   gtk_paned_pack1 (GTK_PANED (private->left_hpane), private->left_docks,
                    FALSE, FALSE);
   if (config->single_window_mode)
@@ -338,6 +340,8 @@ gimp_image_window_constructor (GType                  type,
 
   /* Create the right dock columns widget */
   private->right_docks = g_object_new (GIMP_TYPE_DOCK_COLUMNS, NULL);
+  gimp_dock_columns_set_context (GIMP_DOCK_COLUMNS (private->right_docks),
+                                 gimp_get_user_context (private->gimp));
   gtk_paned_pack2 (GTK_PANED (private->right_hpane), private->right_docks,
                    FALSE, FALSE);
   if (config->single_window_mode)
diff --git a/app/widgets/gimpdock.c b/app/widgets/gimpdock.c
index b187fab..eed6a07 100644
--- a/app/widgets/gimpdock.c
+++ b/app/widgets/gimpdock.c
@@ -36,6 +36,7 @@
 #include "gimpdock.h"
 #include "gimpdockable.h"
 #include "gimpdockbook.h"
+#include "gimpdockcolumns.h"
 #include "gimpdockwindow.h"
 #include "gimppanedbox.h"
 #include "gimpuimanager.h"
@@ -68,18 +69,17 @@ struct _GimpDockPrivate
 };
 
 
-static void      gimp_dock_style_set         (GtkWidget             *widget,
-                                              GtkStyle              *prev_style);
-
-static void      gimp_dock_destroy           (GtkObject             *object);
-
-static void      gimp_dock_real_book_added   (GimpDock              *dock,
-                                              GimpDockbook          *dockbook);
-static void      gimp_dock_real_book_removed (GimpDock              *dock,
-                                              GimpDockbook          *dockbook);
-static gboolean  gimp_dock_dropped_cb        (GtkWidget             *source,
-                                              gint                   insert_index,
-                                              gpointer               data);
+static void              gimp_dock_style_set         (GtkWidget    *widget,
+                                                      GtkStyle     *prev_style);
+static void              gimp_dock_destroy           (GtkObject    *object);
+static void              gimp_dock_real_book_added   (GimpDock     *dock,
+                                                      GimpDockbook *dockbook);
+static void              gimp_dock_real_book_removed (GimpDock     *dock,
+                                                      GimpDockbook *dockbook);
+static gboolean          gimp_dock_dropped_cb        (GtkWidget    *source,
+                                                      gint          insert_index,
+                                                      gpointer      data);
+static GimpDockColumns * gimp_dock_get_dock_columns  (GimpDock     *dock);
 
 
 G_DEFINE_TYPE (GimpDock, gimp_dock, GTK_TYPE_VBOX)
@@ -299,6 +299,24 @@ gimp_dock_dropped_cb (GtkWidget *source,
   return TRUE;
 }
 
+/**
+ * gimp_dock_get_dock_columns:
+ * @dock:
+ *
+ * Returns: The first #GimpDockColumns parent for the dock, or %NULL
+ *          if there is no #GimpDockColumns parent.
+ **/
+static GimpDockColumns *
+gimp_dock_get_dock_columns (GimpDock *dock)
+{
+  GtkWidget *widget = gtk_widget_get_parent (GTK_WIDGET (dock));
+
+  while (widget != NULL && ! GIMP_IS_DOCK_COLUMNS (widget))
+    widget = gtk_widget_get_parent (widget);
+
+  return widget ? GIMP_DOCK_COLUMNS (widget) : NULL;
+}
+
 /*  public functions  */
 
 gchar *
@@ -364,13 +382,29 @@ gimp_dock_invalidate_geometry (GimpDock *dock)
 GimpContext *
 gimp_dock_get_context (GimpDock *dock)
 {
-  GimpDockWindow *dock_window = NULL;
+  GimpContext     *context      = NULL;
 
   g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL);
 
-  dock_window = gimp_dock_window_from_dock (dock);
+  /* First try GimpDockColumns */
+  if (! context)
+    {
+      GimpDockColumns *dock_columns = gimp_dock_get_dock_columns (dock);
+
+      if (dock_columns)
+        context = gimp_dock_columns_get_context (dock_columns);
+    }
+
+  /* Then GimpDockWindow */
+  if (! context)
+    {
+      GimpDockWindow *dock_window = gimp_dock_window_from_dock (dock);
+
+      if (dock_window)
+        context = gimp_dock_window_get_context (dock_window);
+    }
 
-  return gimp_dock_window_get_context (dock_window);
+ return context;
 }
 
 /**
diff --git a/app/widgets/gimpdockcolumns.c b/app/widgets/gimpdockcolumns.c
index 2bc0c3f..18d78cd 100644
--- a/app/widgets/gimpdockcolumns.c
+++ b/app/widgets/gimpdockcolumns.c
@@ -52,9 +52,11 @@ enum
 
 struct _GimpDockColumnsPrivate
 {
-  GList     *docks;
+  GimpContext *context;
 
-  GtkWidget *paned_hbox;
+  GList       *docks;
+
+  GtkWidget   *paned_hbox;
 };
 
 
@@ -243,3 +245,20 @@ gimp_dock_columns_get_docks (GimpDockColumns *dock_columns)
 
   return dock_columns->p->docks;
 }
+
+GimpContext *
+gimp_dock_columns_get_context (GimpDockColumns *dock_columns)
+{
+  g_return_val_if_fail (GIMP_IS_DOCK_COLUMNS (dock_columns), NULL);
+
+  return dock_columns->p->context;
+}
+
+void
+gimp_dock_columns_set_context (GimpDockColumns *dock_columns,
+                               GimpContext     *context)
+{
+  g_return_if_fail (GIMP_IS_DOCK_COLUMNS (dock_columns));
+
+  dock_columns->p->context = context;
+}
diff --git a/app/widgets/gimpdockcolumns.h b/app/widgets/gimpdockcolumns.h
index 076ebcf..7f6d71a 100644
--- a/app/widgets/gimpdockcolumns.h
+++ b/app/widgets/gimpdockcolumns.h
@@ -64,6 +64,9 @@ void                gimp_dock_columns_add_dock       (GimpDockColumns *dock_colu
 void                gimp_dock_columns_remove_dock    (GimpDockColumns *dock_columns,
                                                       GimpDock        *dock);
 GList             * gimp_dock_columns_get_docks      (GimpDockColumns *dock_columns);
+GimpContext       * gimp_dock_columns_get_context    (GimpDockColumns *dock_columns);
+void                gimp_dock_columns_set_context    (GimpDockColumns *dock_columns,
+                                                      GimpContext     *context);
 
 
 #endif /* __GIMP_DOCK_COLUMNS_H__ */
diff --git a/app/widgets/gimpdockwindow.c b/app/widgets/gimpdockwindow.c
index c3bb8bd..d998bfa 100644
--- a/app/widgets/gimpdockwindow.c
+++ b/app/widgets/gimpdockwindow.c
@@ -334,6 +334,13 @@ gimp_dock_window_constructor (GType                  type,
   dock_window->p->image_container   = gimp->images;
   dock_window->p->display_container = gimp->displays;
 
+  /* Let the GimpDockColumns mirror the context so that a GimpDock can
+   * get it when inside a dock window. We do the same thing in the
+   * GimpImageWindow so docks can get the GimpContext there as well
+   */
+  gimp_dock_columns_set_context (dock_window->p->dock_columns,
+                                 dock_window->p->context);
+
   /* Setup hints */
   gimp_window_set_hint (GTK_WINDOW (dock_window), config->dock_window_hint);
 



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