[gimp] app: Make GimpToolbox use parent UI manager
- From: Martin Nordholts <martinn src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: Make GimpToolbox use parent UI manager
- Date: Sun, 7 Aug 2011 18:13:17 +0000 (UTC)
commit 1a8a806d4369e857b071b59876e3c12d2aeb6b21
Author: Martin Nordholts <martinn src gnome org>
Date: Sun Aug 7 19:49:37 2011 +0200
app: Make GimpToolbox use parent UI manager
Make GimpToolbox and GimpToolPalette use the GimpUIManager and
GimpDialogFactory of the top container instead of holding references
on their own. If they hold references on their own, we need to update
these when we move e.g. GimpToolbox between different top level
containers such as GimpDockWindow and GimpImageWindow. Failure to do
this cased problems talked about in bug 646794 (case 2).
app/widgets/gimptoolbox-indicator-area.c | 6 +-
app/widgets/gimptoolbox.c | 72 +--------
app/widgets/gimptoolbox.h | 1 -
app/widgets/gimptoolpalette.c | 239 ++++++++----------------------
app/widgets/gimptoolpalette.h | 6 +-
5 files changed, 72 insertions(+), 252 deletions(-)
---
diff --git a/app/widgets/gimptoolbox-indicator-area.c b/app/widgets/gimptoolbox-indicator-area.c
index 3d9fc9c..3fbfcc3 100644
--- a/app/widgets/gimptoolbox-indicator-area.c
+++ b/app/widgets/gimptoolbox-indicator-area.c
@@ -51,7 +51,7 @@ brush_preview_clicked (GtkWidget *widget,
GdkModifierType state,
GimpToolbox *toolbox)
{
- gimp_dialog_factory_dialog_raise (gimp_toolbox_get_dialog_factory (toolbox),
+ gimp_dialog_factory_dialog_raise (gimp_dock_get_dialog_factory (GIMP_DOCK (toolbox)),
gtk_widget_get_screen (widget),
"gimp-brush-grid|gimp-brush-list", -1);
}
@@ -73,7 +73,7 @@ pattern_preview_clicked (GtkWidget *widget,
GdkModifierType state,
GimpToolbox *toolbox)
{
- gimp_dialog_factory_dialog_raise (gimp_toolbox_get_dialog_factory (toolbox),
+ gimp_dialog_factory_dialog_raise (gimp_dock_get_dialog_factory (GIMP_DOCK (toolbox)),
gtk_widget_get_screen (widget),
"gimp-pattern-grid|gimp-pattern-list", -1);
}
@@ -95,7 +95,7 @@ gradient_preview_clicked (GtkWidget *widget,
GdkModifierType state,
GimpToolbox *toolbox)
{
- gimp_dialog_factory_dialog_raise (gimp_toolbox_get_dialog_factory (toolbox),
+ gimp_dialog_factory_dialog_raise (gimp_dock_get_dialog_factory (GIMP_DOCK (toolbox)),
gtk_widget_get_screen (widget),
"gimp-gradient-list|gimp-gradient-grid", -1);
}
diff --git a/app/widgets/gimptoolbox.c b/app/widgets/gimptoolbox.c
index 64e01c9..352d0c1 100644
--- a/app/widgets/gimptoolbox.c
+++ b/app/widgets/gimptoolbox.c
@@ -60,17 +60,13 @@
enum
{
PROP_0,
- PROP_CONTEXT,
- PROP_DIALOG_FACTORY,
- PROP_UI_MANAGER
+ PROP_CONTEXT
};
struct _GimpToolboxPrivate
{
GimpContext *context;
- GimpDialogFactory *dialog_factory;
- GimpUIManager *ui_manager;
GtkWidget *vbox;
@@ -90,8 +86,8 @@ struct _GimpToolboxPrivate
};
-static void gimp_toolbox_constructed (GObject *object);
-static void gimp_toolbox_dispose (GObject *object);
+static void gimp_toolbox_constructed (GObject *object);
+static void gimp_toolbox_dispose (GObject *object);
static void gimp_toolbox_set_property (GObject *object,
guint property_id,
const GValue *value,
@@ -182,20 +178,6 @@ gimp_toolbox_class_init (GimpToolboxClass *klass)
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
- g_object_class_install_property (object_class, PROP_DIALOG_FACTORY,
- g_param_spec_object ("dialog-factory",
- NULL, NULL,
- GIMP_TYPE_DIALOG_FACTORY,
- GIMP_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
-
- g_object_class_install_property (object_class, PROP_UI_MANAGER,
- g_param_spec_object ("ui-manager",
- NULL, NULL,
- GIMP_TYPE_UI_MANAGER,
- GIMP_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
-
g_type_class_add_private (klass, sizeof (GimpToolboxPrivate));
}
@@ -220,8 +202,6 @@ gimp_toolbox_constructed (GObject *object)
GList *list;
g_assert (GIMP_IS_CONTEXT (toolbox->p->context));
- g_assert (GIMP_IS_UI_MANAGER (toolbox->p->ui_manager));
- g_assert (GIMP_IS_DIALOG_FACTORY (toolbox->p->dialog_factory));
config = GIMP_GUI_CONFIG (toolbox->p->context->gimp->config);
@@ -273,9 +253,9 @@ gimp_toolbox_constructed (GObject *object)
G_CALLBACK (toolbox_wilber_notify),
toolbox->p->header, 0);
- toolbox->p->tool_palette = gimp_tool_palette_new (toolbox->p->context,
- toolbox->p->ui_manager,
- toolbox->p->dialog_factory);
+ toolbox->p->tool_palette = gimp_tool_palette_new ();
+ gimp_tool_palette_set_toolbox (GIMP_TOOL_PALETTE (toolbox->p->tool_palette),
+ toolbox);
gtk_box_pack_start (GTK_BOX (toolbox->p->vbox), toolbox->p->tool_palette,
FALSE, FALSE, 0);
gtk_widget_show (toolbox->p->tool_palette);
@@ -361,18 +341,6 @@ gimp_toolbox_dispose (GObject *object)
toolbox->p->context = NULL;
}
- if (toolbox->p->dialog_factory)
- {
- g_object_unref (toolbox->p->dialog_factory);
- toolbox->p->dialog_factory = NULL;
- }
-
- if (toolbox->p->ui_manager)
- {
- g_object_unref (toolbox->p->ui_manager);
- toolbox->p->ui_manager = NULL;
- }
-
G_OBJECT_CLASS (parent_class)->dispose (object);
toolbox->p->in_destruction = FALSE;
@@ -392,14 +360,6 @@ gimp_toolbox_set_property (GObject *object,
toolbox->p->context = g_value_dup_object (value);
break;
- case PROP_DIALOG_FACTORY:
- toolbox->p->dialog_factory = g_value_dup_object (value);
- break;
-
- case PROP_UI_MANAGER:
- toolbox->p->ui_manager = g_value_dup_object (value);
- break;
-
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -420,14 +380,6 @@ gimp_toolbox_get_property (GObject *object,
g_value_set_object (value, toolbox->p->context);
break;
- case PROP_DIALOG_FACTORY:
- g_value_set_object (value, toolbox->p->dialog_factory);
- break;
-
- case PROP_UI_MANAGER:
- g_value_set_object (value, toolbox->p->ui_manager);
- break;
-
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -683,9 +635,7 @@ gimp_toolbox_new (GimpDialogFactory *factory,
g_return_val_if_fail (GIMP_IS_UI_MANAGER (ui_manager), NULL);
return g_object_new (GIMP_TYPE_TOOLBOX,
- "dialog-factory", factory,
- "context", context,
- "ui-manager", ui_manager,
+ "context", context,
NULL);
}
@@ -697,14 +647,6 @@ gimp_toolbox_get_context (GimpToolbox *toolbox)
return toolbox->p->context;
}
-GimpDialogFactory *
-gimp_toolbox_get_dialog_factory (GimpToolbox *toolbox)
-{
- g_return_val_if_fail (GIMP_IS_TOOLBOX (toolbox), NULL);
-
- return toolbox->p->dialog_factory;
-}
-
void
gimp_toolbox_set_drag_handler (GimpToolbox *toolbox,
GimpPanedBox *drag_handler)
diff --git a/app/widgets/gimptoolbox.h b/app/widgets/gimptoolbox.h
index bad7332..87ecf98 100644
--- a/app/widgets/gimptoolbox.h
+++ b/app/widgets/gimptoolbox.h
@@ -51,7 +51,6 @@ GtkWidget * gimp_toolbox_new (GimpDialogFactory *factory,
GimpContext *context,
GimpUIManager *ui_manager);
GimpContext * gimp_toolbox_get_context (GimpToolbox *toolbox);
-GimpDialogFactory * gimp_toolbox_get_dialog_factory (GimpToolbox *toolbox);
void gimp_toolbox_set_drag_handler (GimpToolbox *toolbox,
GimpPanedBox *drag_handler);
diff --git a/app/widgets/gimptoolpalette.c b/app/widgets/gimptoolpalette.c
index f370b5b..4fc8021 100644
--- a/app/widgets/gimptoolpalette.c
+++ b/app/widgets/gimptoolpalette.c
@@ -31,6 +31,7 @@
#include "core/gimptoolinfo.h"
#include "gimpdialogfactory.h"
+#include "gimptoolbox.h"
#include "gimptoolpalette.h"
#include "gimptoolpalette.h"
#include "gimpuimanager.h"
@@ -46,25 +47,14 @@
#define TOOL_INFO_DATA_KEY "gimp-tool-info"
-enum
-{
- PROP_0,
- PROP_CONTEXT,
- PROP_UI_MANAGER,
- PROP_DIALOG_FACTORY
-};
-
-
typedef struct _GimpToolPalettePrivate GimpToolPalettePrivate;
struct _GimpToolPalettePrivate
{
- GimpContext *context;
- GimpUIManager *ui_manager;
- GimpDialogFactory *dialog_factory;
+ GimpToolbox *toolbox;
- gint tool_rows;
- gint tool_columns;
+ gint tool_rows;
+ gint tool_columns;
};
#define GET_PRIVATE(p) G_TYPE_INSTANCE_GET_PRIVATE (p, \
@@ -72,16 +62,6 @@ struct _GimpToolPalettePrivate
GimpToolPalettePrivate)
-static void gimp_tool_palette_constructed (GObject *object);
-static void gimp_tool_palette_dispose (GObject *object);
-static void gimp_tool_palette_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gimp_tool_palette_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec);
static void gimp_tool_palette_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static void gimp_tool_palette_style_set (GtkWidget *widget,
@@ -113,38 +93,11 @@ G_DEFINE_TYPE (GimpToolPalette, gimp_tool_palette, GTK_TYPE_TOOL_PALETTE)
static void
gimp_tool_palette_class_init (GimpToolPaletteClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
- object_class->constructed = gimp_tool_palette_constructed;
- object_class->dispose = gimp_tool_palette_dispose;
- object_class->set_property = gimp_tool_palette_set_property;
- object_class->get_property = gimp_tool_palette_get_property;
-
widget_class->size_allocate = gimp_tool_palette_size_allocate;
widget_class->style_set = gimp_tool_palette_style_set;
- g_object_class_install_property (object_class, PROP_CONTEXT,
- g_param_spec_object ("context",
- NULL, NULL,
- GIMP_TYPE_CONTEXT,
- GIMP_PARAM_READWRITE |
- G_PARAM_CONSTRUCT));
-
- g_object_class_install_property (object_class, PROP_UI_MANAGER,
- g_param_spec_object ("ui-manager",
- NULL, NULL,
- GIMP_TYPE_UI_MANAGER,
- GIMP_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
-
- g_object_class_install_property (object_class, PROP_DIALOG_FACTORY,
- g_param_spec_object ("dialog-factory",
- NULL, NULL,
- GIMP_TYPE_DIALOG_FACTORY,
- GIMP_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
-
gtk_widget_class_install_style_property (widget_class,
g_param_spec_enum ("tool-icon-size",
NULL, NULL,
@@ -168,109 +121,6 @@ gimp_tool_palette_init (GimpToolPalette *palette)
}
static void
-gimp_tool_palette_constructed (GObject *object)
-{
- GimpToolPalettePrivate *private = GET_PRIVATE (object);
-
- g_assert (GIMP_IS_CONTEXT (private->context));
- g_assert (GIMP_IS_UI_MANAGER (private->ui_manager));
- g_assert (GIMP_IS_DIALOG_FACTORY (private->dialog_factory));
-
- gimp_tool_palette_initialize_tools (GIMP_TOOL_PALETTE (object));
-
- g_signal_connect_object (private->context->gimp->tool_info_list, "reorder",
- G_CALLBACK (gimp_tool_palette_tool_reorder),
- object, 0);
-
- g_signal_connect_object (private->context, "tool-changed",
- G_CALLBACK (gimp_tool_palette_tool_changed),
- object,
- 0);
-}
-
-static void
-gimp_tool_palette_dispose (GObject *object)
-{
- GimpToolPalettePrivate *private = GET_PRIVATE (object);
-
- if (private->context)
- {
- g_object_unref (private->context);
- private->context = NULL;
- }
-
- if (private->ui_manager)
- {
- g_object_unref (private->ui_manager);
- private->ui_manager = NULL;
- }
-
- if (private->dialog_factory)
- {
- g_object_unref (private->dialog_factory);
- private->dialog_factory = NULL;
- }
-
- G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-gimp_tool_palette_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GimpToolPalettePrivate *private = GET_PRIVATE (object);
-
- switch (property_id)
- {
- case PROP_CONTEXT:
- private->context = g_value_dup_object (value);
- break;
-
- case PROP_UI_MANAGER:
- private->ui_manager = g_value_dup_object (value);
- break;
-
- case PROP_DIALOG_FACTORY:
- private->dialog_factory = g_value_dup_object (value);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
-gimp_tool_palette_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GimpToolPalettePrivate *private = GET_PRIVATE (object);
-
- switch (property_id)
- {
- case PROP_CONTEXT:
- g_value_set_object (value, private->context);
- break;
-
- case PROP_UI_MANAGER:
- g_value_set_object (value, private->ui_manager);
- break;
-
- case PROP_DIALOG_FACTORY:
- g_value_set_object (value, private->ui_manager);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-static void
gimp_tool_palette_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
@@ -283,7 +133,7 @@ gimp_tool_palette_size_allocate (GtkWidget *widget,
if (gimp_tool_palette_get_button_size (GIMP_TOOL_PALETTE (widget),
&button_width, &button_height))
{
- Gimp *gimp = private->context->gimp;
+ Gimp *gimp = gimp_toolbox_get_context (private->toolbox)->gimp;
GList *list;
gint n_tools;
gint tool_rows;
@@ -329,10 +179,10 @@ gimp_tool_palette_style_set (GtkWidget *widget,
GTK_WIDGET_CLASS (parent_class)->style_set (widget, previous_style);
- if (! private->context)
+ if (! gimp_toolbox_get_context (private->toolbox))
return;
- gimp = private->context->gimp;
+ gimp = gimp_toolbox_get_context (private->toolbox)->gimp;
gtk_widget_style_get (widget,
"tool-icon-size", &tool_icon_size,
@@ -361,19 +211,43 @@ gimp_tool_palette_style_set (GtkWidget *widget,
}
GtkWidget *
-gimp_tool_palette_new (GimpContext *context,
- GimpUIManager *ui_manager,
- GimpDialogFactory *dialog_factory)
+gimp_tool_palette_new (void)
+{
+ return g_object_new (GIMP_TYPE_TOOL_PALETTE, NULL);
+}
+
+void
+gimp_tool_palette_set_toolbox (GimpToolPalette *palette,
+ GimpToolbox *toolbox)
{
- g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
- g_return_val_if_fail (GIMP_IS_UI_MANAGER (ui_manager), NULL);
- g_return_val_if_fail (GIMP_IS_DIALOG_FACTORY (dialog_factory), NULL);
-
- return g_object_new (GIMP_TYPE_TOOL_PALETTE,
- "context", context,
- "ui-manager", ui_manager,
- "dialog-factory", dialog_factory,
- NULL);
+ GimpToolPalettePrivate *private;
+ GimpContext *context;
+
+ g_return_if_fail (GIMP_IS_TOOL_PALETTE (palette));
+ g_return_if_fail (GIMP_IS_TOOLBOX (toolbox));
+
+ private = GET_PRIVATE (palette);
+
+ private->toolbox = toolbox;
+ context = gimp_toolbox_get_context (toolbox);
+
+ /**
+ * We must wait until GimpToolbox has a parent so we can use
+ * GimpDock::get_ui_manager() and ::get_dialog_factory().
+ */
+ g_signal_connect_swapped (private->toolbox, "parent-set",
+ G_CALLBACK (gimp_tool_palette_initialize_tools),
+ palette);
+
+ g_signal_connect_object (context->gimp->tool_info_list, "reorder",
+ G_CALLBACK (gimp_tool_palette_tool_reorder),
+ palette, 0);
+
+ g_signal_connect_object (context, "tool-changed",
+ G_CALLBACK (gimp_tool_palette_tool_changed),
+ palette,
+ 0);
+
}
gboolean
@@ -391,7 +265,7 @@ gimp_tool_palette_get_button_size (GimpToolPalette *palette,
private = GET_PRIVATE (palette);
- tool_info = gimp_get_tool_info (private->context->gimp,
+ tool_info = gimp_get_tool_info (gimp_toolbox_get_context (private->toolbox)->gimp,
"gimp-rect-select-tool");
tool_button = g_object_get_data (G_OBJECT (tool_info), TOOL_BUTTON_DATA_KEY);
@@ -476,7 +350,7 @@ gimp_tool_palette_tool_button_toggled (GtkWidget *widget,
tool_info = g_object_get_data (G_OBJECT (widget), TOOL_INFO_DATA_KEY);
if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (widget)))
- gimp_context_set_tool (private->context, tool_info);
+ gimp_context_set_tool (gimp_toolbox_get_context (private->toolbox), tool_info);
}
static gboolean
@@ -488,7 +362,9 @@ gimp_tool_palette_tool_button_press (GtkWidget *widget,
if (event->type == GDK_2BUTTON_PRESS && event->button == 1)
{
- gimp_dialog_factory_dialog_raise (private->dialog_factory,
+ GimpDock *dock = GIMP_DOCK (private->toolbox);
+
+ gimp_dialog_factory_dialog_raise (gimp_dock_get_dialog_factory (dock),
gtk_widget_get_screen (widget),
"gimp-tool-options",
-1);
@@ -500,6 +376,7 @@ gimp_tool_palette_tool_button_press (GtkWidget *widget,
static void
gimp_tool_palette_initialize_tools (GimpToolPalette *palette)
{
+ GimpContext *context;
GimpToolInfo *active_tool;
GList *list;
GSList *item_group = NULL;
@@ -511,15 +388,17 @@ gimp_tool_palette_initialize_tools (GimpToolPalette *palette)
gtk_container_add (GTK_CONTAINER (palette), group);
gtk_widget_show (group);
- active_tool = gimp_context_get_tool (private->context);
+ context = gimp_toolbox_get_context (private->toolbox);
+ active_tool = gimp_context_get_tool (context);
- for (list = gimp_get_tool_info_iter (private->context->gimp);
+ for (list = gimp_get_tool_info_iter (context->gimp);
list;
list = g_list_next (list))
{
- GimpToolInfo *tool_info = list->data;
- GtkToolItem *item;
- const gchar *stock_id;
+ GimpToolInfo *tool_info = list->data;
+ GtkToolItem *item;
+ const gchar *stock_id;
+ GimpUIManager *ui_manager;
stock_id = gimp_viewable_get_stock_id (GIMP_VIEWABLE (tool_info));
@@ -549,7 +428,8 @@ gimp_tool_palette_initialize_tools (GimpToolPalette *palette)
G_CALLBACK (gimp_tool_palette_tool_button_press),
palette);
- if (private->ui_manager)
+ ui_manager = gimp_dock_get_ui_manager (GIMP_DOCK (private->toolbox));
+ if (ui_manager)
{
GtkAction *action = NULL;
const gchar *identifier = NULL;
@@ -563,8 +443,7 @@ gimp_tool_palette_initialize_tools (GimpToolPalette *palette)
name = g_strdup_printf ("tools-%s", tmp);
g_free (tmp);
- action = gimp_ui_manager_find_action (private->ui_manager,
- "tools", name);
+ action = gimp_ui_manager_find_action (ui_manager, "tools", name);
g_free (name);
if (action)
diff --git a/app/widgets/gimptoolpalette.h b/app/widgets/gimptoolpalette.h
index 8251f24..c64c4d2 100644
--- a/app/widgets/gimptoolpalette.h
+++ b/app/widgets/gimptoolpalette.h
@@ -45,9 +45,9 @@ struct _GimpToolPaletteClass
GType gimp_tool_palette_get_type (void) G_GNUC_CONST;
-GtkWidget * gimp_tool_palette_new (GimpContext *context,
- GimpUIManager *ui_manager,
- GimpDialogFactory *dialog_factory);
+GtkWidget * gimp_tool_palette_new (void);
+void gimp_tool_palette_set_toolbox (GimpToolPalette *palette,
+ GimpToolbox *toolbox);
gboolean gimp_tool_palette_get_button_size (GimpToolPalette *palette,
gint *width,
gint *height);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]