[gimp] app: Add GimpDock::set_host_geometry_hints()
- From: Martin Nordholts <martinn src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] app: Add GimpDock::set_host_geometry_hints()
- Date: Sun, 13 Sep 2009 12:12:27 +0000 (UTC)
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]