[gimp] app: Add GimpDock::set_host_geometry_hints()



commit 67128d6034ee6d311201cab5f5227ec5fef1c764
Author: Martin Nordholts <martinn src gnome org>
Date:   Sun Sep 13 14:14:08 2009 +0200

    app: Add GimpDock::set_host_geometry_hints()
    
    In order to allow the toolbox dock to set geometry hints on the
    GtkWindow it is in, introduce host geometry hint setting through a new
    virtual function GimpDock::set_host_geometry_hints() and a new
    "geometry-invalidated" signal.
    
    Docks that needs to setup geometry hints on the window they are in
    call gimp_dock_invalidate_geometry(). The GimpDockWindow will listen
    to this and give the dock a chance to set geometry hints (or any setup
    really) on the GimpDockWindow.

 app/widgets/gimpdock.c       |   65 ++++++++++++++++++++++++++++++++++++------
 app/widgets/gimpdock.h       |   29 +++++++++++-------
 app/widgets/gimpdockwindow.c |    8 +++++
 app/widgets/gimptoolbox.c    |   37 +++++++++++++----------
 4 files changed, 103 insertions(+), 36 deletions(-)
---
diff --git a/app/widgets/gimpdock.c b/app/widgets/gimpdock.c
index e1d3eef..12ac265 100644
--- a/app/widgets/gimpdock.c
+++ b/app/widgets/gimpdock.c
@@ -51,6 +51,7 @@ enum
   BOOK_ADDED,
   BOOK_REMOVED,
   TITLE_INVALIDATED,
+  GEOMETRY_INVALIDATED,
   LAST_SIGNAL
 };
 
@@ -126,15 +127,26 @@ gimp_dock_class_init (GimpDockClass *klass)
                   gimp_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
 
-  object_class->set_property    = gimp_dock_set_property;
-  object_class->get_property    = gimp_dock_get_property;
+  dock_signals[GEOMETRY_INVALIDATED] =
+    g_signal_new ("geometry-invalidated",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST,
+                  G_STRUCT_OFFSET (GimpDockClass, geometry_invalidated),
+                  NULL, NULL,
+                  gimp_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
+  object_class->set_property     = gimp_dock_set_property;
+  object_class->get_property     = gimp_dock_get_property;
 
-  gtk_object_class->destroy     = gimp_dock_destroy;
+  gtk_object_class->destroy      = gimp_dock_destroy;
 
-  klass->setup                  = NULL;
-  klass->book_added             = gimp_dock_real_book_added;
-  klass->book_removed           = gimp_dock_real_book_removed;
-  klass->title_invalidated      = NULL;
+  klass->setup                   = NULL;
+  klass->set_host_geometry_hints = NULL;
+  klass->book_added              = gimp_dock_real_book_added;
+  klass->book_removed            = gimp_dock_real_book_removed;
+  klass->title_invalidated       = NULL;
+  klass->geometry_invalidated    = NULL;
 
   g_object_class_install_property (object_class, PROP_CONTEXT,
                                    g_param_spec_object ("context", NULL, NULL,
@@ -295,7 +307,7 @@ gchar *
 gimp_dock_get_title (GimpDock *dock)
 {
   g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL);
-  
+
   if (GIMP_DOCK_GET_CLASS (dock)->get_title)
     return GIMP_DOCK_GET_CLASS (dock)->get_title (dock);
 
@@ -306,10 +318,45 @@ void
 gimp_dock_invalidate_title (GimpDock *dock)
 {
   g_return_if_fail (GIMP_IS_DOCK (dock));
-  
+
   g_signal_emit (dock, dock_signals[TITLE_INVALIDATED], 0);
 }
 
+/**
+ * gimp_dock_set_host_geometry_hints:
+ * @dock:   The dock
+ * @window: The #GtkWindow to adapt to hosting the dock
+ *
+ * Some docks have some specific needs on the #GtkWindow they are
+ * in. This function allows such docks to perform any such setup on
+ * the #GtkWindow they are in/will be put in.
+ **/
+void
+gimp_dock_set_host_geometry_hints (GimpDock  *dock,
+                                   GtkWindow *window)
+{
+  g_return_if_fail (GIMP_IS_DOCK (dock));
+  g_return_if_fail (GTK_IS_WINDOW (window));
+
+  if (GIMP_DOCK_GET_CLASS (dock)->set_host_geometry_hints)
+    GIMP_DOCK_GET_CLASS (dock)->set_host_geometry_hints (dock, window);
+}
+
+/**
+ * gimp_dock_invalidate_geometry:
+ * @dock:
+ *
+ * Call when the dock needs to setup its host #GtkWindow with
+ * GtkDock::set_host_geometry_hints().
+ **/
+void
+gimp_dock_invalidate_geometry (GimpDock *dock)
+{
+  g_return_if_fail (GIMP_IS_DOCK (dock));
+
+  g_signal_emit (dock, dock_signals[GEOMETRY_INVALIDATED], 0);
+}
+
 GimpContext *
 gimp_dock_get_context (GimpDock *dock)
 {
diff --git a/app/widgets/gimpdock.h b/app/widgets/gimpdock.h
index 62ee33e..82f01c7 100644
--- a/app/widgets/gimpdock.h
+++ b/app/widgets/gimpdock.h
@@ -51,19 +51,22 @@ struct _GimpDockClass
   GimpDockWindowClass  parent_class;
 
   /*  virtual functions  */
-  void    (* setup)             (GimpDock       *dock,
-                                 const GimpDock *template);
-  void    (* set_aux_info)      (GimpDock       *dock,
-                                 GList          *aux_info);
-  GList * (* get_aux_info)      (GimpDock       *dock);
-  gchar * (* get_title)         (GimpDock       *dock);
+  void    (* setup)                   (GimpDock       *dock,
+                                       const GimpDock *template);
+  void    (* set_aux_info)            (GimpDock       *dock,
+                                       GList          *aux_info);
+  GList * (* get_aux_info)            (GimpDock       *dock);
+  gchar * (* get_title)               (GimpDock       *dock);
+  void    (* set_host_geometry_hints) (GimpDock       *dock,
+                                       GtkWindow      *window);
 
   /*  signals  */
-  void    (* book_added)        (GimpDock       *dock,
-                                 GimpDockbook   *dockbook);
-  void    (* book_removed)      (GimpDock       *dock,
-                                 GimpDockbook   *dockbook);
-  void    (* title_invalidated) (GimpDock       *dock);
+  void    (* book_added)              (GimpDock       *dock,
+                                       GimpDockbook   *dockbook);
+  void    (* book_removed)            (GimpDock       *dock,
+                                       GimpDockbook   *dockbook);
+  void    (* title_invalidated)       (GimpDock       *dock);
+  void    (* geometry_invalidated)    (GimpDock       *dock);
 };
 
 
@@ -76,6 +79,10 @@ void                gimp_dock_set_aux_info       (GimpDock       *dock,
 GList             * gimp_dock_get_aux_info       (GimpDock       *dock);
 gchar             * gimp_dock_get_title          (GimpDock       *dock);
 void                gimp_dock_invalidate_title   (GimpDock       *dock);
+void                gimp_dock_set_host_geometry_hints
+                                                 (GimpDock       *dock,
+                                                  GtkWindow      *window);
+void                gimp_dock_invalidate_geometry(GimpDock       *dock);
 GimpContext       * gimp_dock_get_context        (GimpDock       *dock);
 GimpDialogFactory * gimp_dock_get_dialog_factory (GimpDock       *dock);
 GList             * gimp_dock_get_dockbooks      (GimpDock       *dock);
diff --git a/app/widgets/gimpdockwindow.c b/app/widgets/gimpdockwindow.c
index 8fa4de2..dc34665 100644
--- a/app/widgets/gimpdockwindow.c
+++ b/app/widgets/gimpdockwindow.c
@@ -244,6 +244,14 @@ gimp_dock_window_constructor (GType                  type,
                            dock_window,
                            G_CONNECT_SWAPPED);
 
+  /* Some docks like the toolbox dock needs to maintain special hints
+   * on its container GtkWindow, allow those to do so
+   */
+  gimp_dock_set_host_geometry_hints (dock, GTK_WINDOW (dock_window));
+  g_signal_connect_object (dock, "geometry-invalidated",
+                           G_CALLBACK (gimp_dock_set_host_geometry_hints),
+                           dock_window, 0);
+
   /* Done! */
   return object;
 }
diff --git a/app/widgets/gimptoolbox.c b/app/widgets/gimptoolbox.c
index 23d57e1..0892df9 100644
--- a/app/widgets/gimptoolbox.c
+++ b/app/widgets/gimptoolbox.c
@@ -79,11 +79,13 @@ static gboolean    gimp_toolbox_expose_event       (GtkWidget      *widget,
                                                     GdkEventExpose *event);
 
 static gchar     * gimp_toolbox_get_title          (GimpDock       *dock);
+static void        gimp_toolbox_set_host_geometry_hints
+                                                   (GimpDock       *dock,
+                                                    GtkWindow      *window);
 static void        gimp_toolbox_book_added         (GimpDock       *dock,
                                                     GimpDockbook   *dockbook);
 static void        gimp_toolbox_book_removed       (GimpDock       *dock,
                                                     GimpDockbook   *dockbook);
-static void        gimp_toolbox_set_geometry       (GimpToolbox    *toolbox);
 
 static void        toolbox_separator_expand        (GimpToolbox    *toolbox);
 static void        toolbox_separator_collapse      (GimpToolbox    *toolbox);
@@ -142,17 +144,18 @@ gimp_toolbox_class_init (GimpToolboxClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   GimpDockClass  *dock_class   = GIMP_DOCK_CLASS (klass);
 
-  object_class->constructor         = gimp_toolbox_constructor;
+  object_class->constructor           = gimp_toolbox_constructor;
 
-  widget_class->delete_event        = gimp_toolbox_delete_event;
-  widget_class->size_allocate       = gimp_toolbox_size_allocate;
-  widget_class->style_set           = gimp_toolbox_style_set;
-  widget_class->button_press_event  = gimp_toolbox_button_press_event;
-  widget_class->expose_event        = gimp_toolbox_expose_event;
+  widget_class->delete_event          = gimp_toolbox_delete_event;
+  widget_class->size_allocate         = gimp_toolbox_size_allocate;
+  widget_class->style_set             = gimp_toolbox_style_set;
+  widget_class->button_press_event    = gimp_toolbox_button_press_event;
+  widget_class->expose_event          = gimp_toolbox_expose_event;
 
-  dock_class->get_title             = gimp_toolbox_get_title;
-  dock_class->book_added            = gimp_toolbox_book_added;
-  dock_class->book_removed          = gimp_toolbox_book_removed;
+  dock_class->get_title               = gimp_toolbox_get_title;
+  dock_class->set_host_geometry_hints = gimp_toolbox_set_host_geometry_hints;
+  dock_class->book_added              = gimp_toolbox_book_added;
+  dock_class->book_removed            = gimp_toolbox_book_removed;
 
   gtk_widget_class_install_style_property (widget_class,
                                            g_param_spec_enum ("tool-icon-size",
@@ -466,7 +469,7 @@ gimp_toolbox_style_set (GtkWidget *widget,
         }
     }
 
-  gimp_toolbox_set_geometry (GIMP_TOOLBOX (widget));
+  gimp_dock_invalidate_geometry (GIMP_DOCK (widget));
 }
 
 static gboolean
@@ -552,7 +555,7 @@ gimp_toolbox_book_added (GimpDock     *dock,
 {
   if (g_list_length (gimp_dock_get_dockbooks (dock)) == 1)
     {
-      gimp_toolbox_set_geometry (GIMP_TOOLBOX (dock));
+      gimp_dock_invalidate_geometry (dock);
       toolbox_separator_collapse (GIMP_TOOLBOX (dock));
     }
 }
@@ -564,14 +567,16 @@ gimp_toolbox_book_removed (GimpDock     *dock,
   if (g_list_length (gimp_dock_get_dockbooks (dock)) == 0 &&
       ! (GTK_OBJECT_FLAGS (dock) & GTK_IN_DESTRUCTION))
     {
-      gimp_toolbox_set_geometry (GIMP_TOOLBOX (dock));
+      gimp_dock_invalidate_geometry (dock);
       toolbox_separator_expand (GIMP_TOOLBOX (dock));
     }
 }
 
 static void
-gimp_toolbox_set_geometry (GimpToolbox *toolbox)
+gimp_toolbox_set_host_geometry_hints (GimpDock  *dock,
+                                      GtkWindow *window)
 {
+  GimpToolbox  *toolbox = GIMP_TOOLBOX (dock);
   Gimp         *gimp;
   GimpToolInfo *tool_info;
   GtkWidget    *tool_button;
@@ -604,14 +609,14 @@ gimp_toolbox_set_geometry (GimpToolbox *toolbox)
       geometry.height_inc = (gimp_dock_get_dockbooks (GIMP_DOCK (toolbox)) ?
                              1 : button_requisition.height);
 
-      gtk_window_set_geometry_hints (GTK_WINDOW (toolbox),
+      gtk_window_set_geometry_hints (window,
                                      NULL,
                                      &geometry,
                                      GDK_HINT_MIN_SIZE   |
                                      GDK_HINT_RESIZE_INC |
                                      GDK_HINT_USER_POS);
 
-      gimp_dialog_factory_set_has_min_size (GTK_WINDOW (toolbox), TRUE);
+      gimp_dialog_factory_set_has_min_size (window, TRUE);
     }
 }
 



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