[gimp] Replace the name_changed_handler_id GQuark by a hash of quarks
- From: Michael Natterer <mitch src gnome org>
- To: svn-commits-list gnome org
- Subject: [gimp] Replace the name_changed_handler_id GQuark by a hash of quarks
- Date: Tue, 28 Jul 2009 17:10:37 +0000 (UTC)
commit b54a0fdf886cd8ed8b658f98f4746ad66cb6e810
Author: Michael Natterer <mitch gimp org>
Date: Tue Jul 28 19:08:07 2009 +0200
Replace the name_changed_handler_id GQuark by a hash of quarks
Keep around the handler IDs for the "name-changed" signals of the
container's children in a hash table that maps containers to handler
IDs and move adding/removing of the handler to
add_container()/remove_container(). This way the name-changed code is
prepared for handling multiple containers.
app/widgets/gimpcontainerview.c | 63 ++++++++++++++++++++++++++------------
1 files changed, 43 insertions(+), 20 deletions(-)
---
diff --git a/app/widgets/gimpcontainerview.c b/app/widgets/gimpcontainerview.c
index e32b62b..90424f3 100644
--- a/app/widgets/gimpcontainerview.c
+++ b/app/widgets/gimpcontainerview.c
@@ -66,7 +66,7 @@ struct _GimpContainerViewPrivate
/* initialized by subclass */
GtkWidget *dnd_widget;
- GQuark name_changed_handler_id;
+ GHashTable *name_changed_handler_hash;
};
@@ -264,6 +264,12 @@ gimp_container_view_private_finalize (GimpContainerViewPrivate *private)
private->item_hash = NULL;
}
+ if (private->name_changed_handler_hash)
+ {
+ g_hash_table_destroy (private->name_changed_handler_hash);
+ private->name_changed_handler_hash = NULL;
+ }
+
g_slice_free (GimpContainerViewPrivate, private);
}
@@ -296,6 +302,11 @@ gimp_container_view_get_private (GimpContainerView *view)
NULL,
view_iface->insert_data_free);
+ private->name_changed_handler_hash = g_hash_table_new_full (g_direct_hash,
+ g_direct_equal,
+ NULL,
+ NULL);
+
g_object_set_qdata_full ((GObject *) view, private_key, private,
(GDestroyNotify) gimp_container_view_private_finalize);
@@ -382,10 +393,6 @@ gimp_container_view_real_set_container (GimpContainerView *view,
{
gimp_container_view_select_item (view, NULL);
- /* FIXME: move to remove_container() */
- gimp_container_remove_handler (private->container,
- private->name_changed_handler_id);
-
/* freeze/thaw is only supported for the toplevel container */
g_signal_handlers_disconnect_by_func (private->container,
gimp_container_view_freeze,
@@ -424,23 +431,9 @@ gimp_container_view_real_set_container (GimpContainerView *view,
if (private->container)
{
- GType children_type = gimp_container_get_children_type (private->container);
- GimpViewableClass *viewable_class;
-
- viewable_class = g_type_class_ref (children_type);
-
if (! gimp_container_frozen (private->container))
gimp_container_view_add_container (view, private->container);
- /* FIXME: move to add_container() */
- private->name_changed_handler_id =
- gimp_container_add_handler (private->container,
- viewable_class->name_changed_signal,
- G_CALLBACK (gimp_container_view_name_changed),
- view);
-
- g_type_class_unref (viewable_class);
-
/* freeze/thaw is only supported for the toplevel container */
g_signal_connect_object (private->container, "freeze",
G_CALLBACK (gimp_container_view_freeze),
@@ -453,9 +446,11 @@ gimp_container_view_real_set_container (GimpContainerView *view,
if (private->context)
{
+ GType children_type;
const gchar *signal_name;
- signal_name = gimp_context_type_to_signal_name (children_type);
+ children_type = gimp_container_get_children_type (private->container);
+ signal_name = gimp_context_type_to_signal_name (children_type);
if (signal_name)
{
@@ -948,10 +943,29 @@ static void
gimp_container_view_add_container (GimpContainerView *view,
GimpContainer *container)
{
+ GimpContainerViewPrivate *private = GIMP_CONTAINER_VIEW_GET_PRIVATE (view);
+ GType children_type;
+ GimpViewableClass *viewable_class;
+ GQuark name_changed_handler_id;
+
gimp_container_foreach (container,
(GFunc) gimp_container_view_add_foreach,
view);
+ children_type = gimp_container_get_children_type (container);
+ viewable_class = g_type_class_ref (children_type);
+
+ name_changed_handler_id =
+ gimp_container_add_handler (container,
+ viewable_class->name_changed_signal,
+ G_CALLBACK (gimp_container_view_name_changed),
+ view);
+
+ g_type_class_unref (viewable_class);
+
+ g_hash_table_insert (private->name_changed_handler_hash, container,
+ GUINT_TO_POINTER (name_changed_handler_id));
+
g_signal_connect_object (container, "add",
G_CALLBACK (gimp_container_view_add),
view,
@@ -1008,6 +1022,15 @@ gimp_container_view_remove_container (GimpContainerView *view,
GimpContainer *container)
{
GimpContainerViewPrivate *private = GIMP_CONTAINER_VIEW_GET_PRIVATE (view);
+ GQuark name_changed_handler_id;
+
+ name_changed_handler_id =
+ GPOINTER_TO_UINT (g_hash_table_lookup (private->name_changed_handler_hash,
+ container));
+
+ gimp_container_remove_handler (container, name_changed_handler_id);
+
+ g_hash_table_remove (private->name_changed_handler_hash, container);
g_signal_handlers_disconnect_by_func (container,
gimp_container_view_add,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]