From 96d42cf1ccfad99068efb81dd9eba3e9041657e5 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 19 Jul 2020 01:17:23 -0400 Subject: [PATCH] actionmuxer: Stop implementing GActionGroup Instead of implementing the GActionGroup interface and using its signals for propagating changes up and down the muxer hierarchy, use the GtkActionObserver mechanism. This cuts down on the signal emission overhead. --- gtk/gtkactionmuxer.c | 480 +++++++++++++++++-------------------------- 1 file changed, 194 insertions(+), 286 deletions(-) diff --git a/gtk/gtkactionmuxer.c b/gtk/gtkactionmuxer.c index ea7cf597d3..e08cc87c55 100644 --- a/gtk/gtkactionmuxer.c +++ b/gtk/gtkactionmuxer.c @@ -59,8 +59,8 @@ * different objects). */ -static void gtk_action_muxer_group_iface_init (GActionGroupInterface *iface); static void gtk_action_muxer_observable_iface_init (GtkActionObservableInterface *iface); +static void gtk_action_muxer_observer_iface_init (GtkActionObserverInterface *iface); typedef GObjectClass GtkActionMuxerClass; @@ -79,7 +79,7 @@ struct _GtkActionMuxer }; G_DEFINE_TYPE_WITH_CODE (GtkActionMuxer, gtk_action_muxer, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, gtk_action_muxer_group_iface_init) + G_IMPLEMENT_INTERFACE (GTK_TYPE_ACTION_OBSERVER, gtk_action_muxer_observer_iface_init) G_IMPLEMENT_INTERFACE (GTK_TYPE_ACTION_OBSERVABLE, gtk_action_muxer_observable_iface_init)) enum @@ -92,11 +92,6 @@ enum static GParamSpec *properties[NUM_PROPERTIES]; -guint accel_signal; - -static guint action_added_signal; -static guint action_removed_signal; - typedef struct { GtkActionMuxer *muxer; @@ -125,6 +120,7 @@ get_action_position (GtkWidgetAction *action) return slot; } +#if 0 static void gtk_action_muxer_append_group_actions (const char *prefix, Group *group, @@ -181,6 +177,7 @@ gtk_action_muxer_list_actions (GActionGroup *action_group) return (char **)keys; } +#endif static Group * gtk_action_muxer_find_group (GtkActionMuxer *muxer, @@ -256,7 +253,6 @@ gtk_action_muxer_action_enabled_changed (GtkActionMuxer *muxer, action = g_hash_table_lookup (muxer->observed_actions, action_name); for (node = action ? action->watchers : NULL; node; node = node->next) gtk_action_observer_action_enabled_changed (node->data, GTK_ACTION_OBSERVABLE (muxer), action_name, enabled); - g_action_group_action_enabled_changed (G_ACTION_GROUP (muxer), action_name, enabled); } static void @@ -270,21 +266,9 @@ gtk_action_muxer_group_action_enabled_changed (GActionGroup *action_group, fullname = g_strconcat (group->prefix, ".", action_name, NULL); gtk_action_muxer_action_enabled_changed (group->muxer, fullname, enabled); - g_free (fullname); } -static void -gtk_action_muxer_parent_action_enabled_changed (GActionGroup *action_group, - const gchar *action_name, - gboolean enabled, - gpointer user_data) -{ - GtkActionMuxer *muxer = user_data; - - gtk_action_muxer_action_enabled_changed (muxer, action_name, enabled); -} - void gtk_action_muxer_action_state_changed (GtkActionMuxer *muxer, const gchar *action_name, @@ -296,7 +280,6 @@ gtk_action_muxer_action_state_changed (GtkActionMuxer *muxer, action = g_hash_table_lookup (muxer->observed_actions, action_name); for (node = action ? action->watchers : NULL; node; node = node->next) gtk_action_observer_action_state_changed (node->data, GTK_ACTION_OBSERVABLE (muxer), action_name, state); - g_action_group_action_state_changed (G_ACTION_GROUP (muxer), action_name, state); } static void @@ -310,20 +293,17 @@ gtk_action_muxer_group_action_state_changed (GActionGroup *action_group, fullname = g_strconcat (group->prefix, ".", action_name, NULL); gtk_action_muxer_action_state_changed (group->muxer, fullname, state); - g_free (fullname); } -static void -gtk_action_muxer_parent_action_state_changed (GActionGroup *action_group, - const gchar *action_name, - GVariant *state, - gpointer user_data) -{ - GtkActionMuxer *muxer = user_data; - - gtk_action_muxer_action_state_changed (muxer, action_name, state); -} +static gboolean action_muxer_query_action (GtkActionMuxer *muxer, + const char *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state, + gboolean recurse); static void notify_observers_added (GtkActionMuxer *muxer, @@ -344,13 +324,21 @@ notify_observers_added (GtkActionMuxer *muxer, if (!action->watchers) continue; - if (!g_action_group_query_action (G_ACTION_GROUP (parent), action_name, - &enabled, ¶meter_type, NULL, NULL, &state)) + if (action_muxer_query_action (muxer, action_name, + NULL, NULL, NULL, NULL, NULL, + FALSE)) + continue; + + gtk_action_observable_register_observer (GTK_ACTION_OBSERVABLE (parent), action_name, GTK_ACTION_OBSERVER (muxer)); + + if (!action_muxer_query_action (parent, action_name, + &enabled, ¶meter_type, + NULL, NULL, &state, + TRUE)) continue; for (node = action->watchers; node; node = node->next) { - g_print ("call gtk_action_observer_action_added\n"); gtk_action_observer_action_added (node->data, GTK_ACTION_OBSERVABLE (muxer), action_name, parameter_type, enabled, state); @@ -361,27 +349,6 @@ notify_observers_added (GtkActionMuxer *muxer, } } -static void -emit_action_added (GtkActionMuxer *muxer, - GtkActionMuxer *parent) -{ - if (g_signal_has_handler_pending (muxer, action_added_signal, 0, FALSE)) - { - gchar **actions; - gchar **it; - - actions = g_action_group_list_actions (G_ACTION_GROUP (parent)); - - for (it = actions; *it; it++) - { - g_print ("emit GtkActionGroup::action-added\n"); - g_action_group_action_added (G_ACTION_GROUP (muxer), *it); - } - - g_strfreev (actions); - } -} - static void notify_observers_removed (GtkActionMuxer *muxer, GtkActionMuxer *parent) @@ -395,9 +362,10 @@ notify_observers_removed (GtkActionMuxer *muxer, { GSList *node; + gtk_action_observable_unregister_observer (GTK_ACTION_OBSERVABLE (parent), action_name, GTK_ACTION_OBSERVER (muxer)); + for (node = action->watchers; node; node = node->next) { - g_print ("call gtk_action_observer_action_removed\n"); gtk_action_observer_action_removed (node->data, GTK_ACTION_OBSERVABLE (muxer), action_name); @@ -406,59 +374,21 @@ notify_observers_removed (GtkActionMuxer *muxer, } static void -emit_action_removed (GtkActionMuxer *muxer, - GtkActionMuxer *parent) +gtk_action_muxer_action_added (GtkActionMuxer *muxer, + const char *action_name, + const GVariantType *parameter_type, + gboolean enabled, + GVariant *state) { - if (g_signal_has_handler_pending (muxer, action_removed_signal, 0, FALSE)) - { - gchar **actions; - gchar **it; - - actions = g_action_group_list_actions (G_ACTION_GROUP (parent)); - - for (it = actions; *it; it++) - { - g_print ("emit GtkActionGroup::action-removed\n"); - g_action_group_action_removed (G_ACTION_GROUP (muxer), *it); - } - - g_strfreev (actions); - } -} - -static void -gtk_action_muxer_action_added (GtkActionMuxer *muxer, - const gchar *action_name, - GActionGroup *original_group, - const gchar *original_action_name) -{ - const GVariantType *parameter_type; - gboolean enabled; - GVariant *state; Action *action; + GSList *node; action = g_hash_table_lookup (muxer->observed_actions, action_name); - if (action && action->watchers && - g_action_group_query_action (original_group, original_action_name, - &enabled, ¶meter_type, NULL, NULL, &state)) - { - GSList *node; - - for (node = action->watchers; node; node = node->next) - { - g_print ("call gtk_action_observer_action_added\n"); - gtk_action_observer_action_added (node->data, - GTK_ACTION_OBSERVABLE (muxer), - action_name, parameter_type, enabled, state); - } - - if (state) - g_variant_unref (state); - } - - g_print ("emit GtkActionGroup::action-added\n"); - g_action_group_action_added (G_ACTION_GROUP (muxer), action_name); + for (node = action ? action->watchers : NULL; node; node = node->next) + gtk_action_observer_action_added (node->data, + GTK_ACTION_OBSERVABLE (muxer), + action_name, parameter_type, enabled, state); } static void @@ -467,42 +397,44 @@ gtk_action_muxer_action_added_to_group (GActionGroup *action_group, gpointer user_data) { Group *group = user_data; + GtkActionMuxer *muxer = group->muxer; + Action *action; + const GVariantType *parameter_type; + gboolean enabled; + GVariant *state; + char *fullname; - if (g_hash_table_size (group->muxer->observed_actions) > 0 || - g_signal_has_handler_pending (group->muxer, action_added_signal, 0, FALSE)) + fullname = g_strconcat (group->prefix, ".", action_name, NULL); + action = g_hash_table_lookup (muxer->observed_actions, fullname); + + if (action && action->watchers && + g_action_group_query_action (action_group, action_name, + &enabled, ¶meter_type, NULL, NULL, &state)) { - char *fullname = g_strconcat (group->prefix, ".", action_name, NULL); - gtk_action_muxer_action_added (group->muxer, fullname, action_group, action_name); - g_free (fullname); + gtk_action_muxer_action_added (muxer, fullname, parameter_type, enabled, state); + + if (state) + g_variant_unref (state); } -} -static void -gtk_action_muxer_action_added_to_parent (GActionGroup *action_group, - const gchar *action_name, - gpointer user_data) -{ - GtkActionMuxer *muxer = user_data; + if (muxer->parent) + gtk_action_observable_unregister_observer (GTK_ACTION_OBSERVABLE (muxer->parent), + fullname, + GTK_ACTION_OBSERVER (muxer)); - gtk_action_muxer_action_added (muxer, action_name, action_group, action_name); + g_free (fullname); } static void gtk_action_muxer_action_removed (GtkActionMuxer *muxer, - const gchar *action_name) + const char *action_name) { Action *action; GSList *node; action = g_hash_table_lookup (muxer->observed_actions, action_name); for (node = action ? action->watchers : NULL; node; node = node->next) - { - g_print ("call gtk_action_observer_action_removed\n"); - gtk_action_observer_action_removed (node->data, GTK_ACTION_OBSERVABLE (muxer), action_name); - } - - g_print ("emit GtkActionGroup::action-removed\n"); - g_action_group_action_removed (G_ACTION_GROUP (muxer), action_name); + gtk_action_observer_action_removed (node->data, GTK_ACTION_OBSERVABLE (muxer), action_name); } static void @@ -511,26 +443,27 @@ gtk_action_muxer_action_removed_from_group (GActionGroup *action_group, gpointer user_data) { Group *group = user_data; + GtkActionMuxer *muxer = group->muxer; + char *fullname; + Action *action; - if (g_hash_table_size (group->muxer->observed_actions) > 0 || - g_signal_has_handler_pending (group->muxer, action_removed_signal, 0, FALSE)) + fullname = g_strconcat (group->prefix, ".", action_name, NULL); + gtk_action_muxer_action_removed (muxer, fullname); + g_free (fullname); + + action = g_hash_table_lookup (muxer->observed_actions, action_name); + + if (action && action->watchers && + !action_muxer_query_action (muxer, action_name, + NULL, NULL, NULL, NULL, NULL, FALSE)) { - char *fullname = g_strconcat (group->prefix, ".", action_name, NULL); - gtk_action_muxer_action_removed (group->muxer, fullname); - g_free (fullname); + if (muxer->parent) + gtk_action_observable_register_observer (GTK_ACTION_OBSERVABLE (muxer->parent), + action_name, + GTK_ACTION_OBSERVER (muxer)); } } -static void -gtk_action_muxer_action_removed_from_parent (GActionGroup *action_group, - const gchar *action_name, - gpointer user_data) -{ - GtkActionMuxer *muxer = user_data; - - gtk_action_muxer_action_removed (muxer, action_name); -} - static void gtk_action_muxer_primary_accel_changed (GtkActionMuxer *muxer, const gchar *action_name, @@ -544,28 +477,8 @@ gtk_action_muxer_primary_accel_changed (GtkActionMuxer *muxer, action = g_hash_table_lookup (muxer->observed_actions, action_name); for (node = action ? action->watchers : NULL; node; node = node->next) - { - g_print ("call gtk_action_observer_primary_accel_changed\n"); - gtk_action_observer_primary_accel_changed (node->data, GTK_ACTION_OBSERVABLE (muxer), - action_name, action_and_target); - } - g_print ("emit GtkActionMuxer::primary-accel-changed\n"); - g_signal_emit (muxer, accel_signal, 0, action_name, action_and_target); -} - -static void -gtk_action_muxer_parent_primary_accel_changed (GtkActionMuxer *parent, - const gchar *action_name, - const gchar *action_and_target, - gpointer user_data) -{ - GtkActionMuxer *muxer = user_data; - - /* If it's in our table then don't let the parent one filter through */ - if (muxer->primary_accels && g_hash_table_lookup (muxer->primary_accels, action_and_target)) - return; - - gtk_action_muxer_primary_accel_changed (muxer, action_name, action_and_target); + gtk_action_observer_primary_accel_changed (node->data, GTK_ACTION_OBSERVABLE (muxer), + action_name, action_and_target); } static GVariant * @@ -700,15 +613,15 @@ prop_actions_connect (GtkActionMuxer *muxer) } } - -gboolean -gtk_action_muxer_query_action (GtkActionMuxer *muxer, - const gchar *action_name, - gboolean *enabled, - const GVariantType **parameter_type, - const GVariantType **state_type, - GVariant **state_hint, - GVariant **state) +static gboolean +action_muxer_query_action (GtkActionMuxer *muxer, + const gchar *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state, + gboolean recurse) { GtkWidgetAction *action; Group *group; @@ -758,20 +671,36 @@ gtk_action_muxer_query_action (GtkActionMuxer *muxer, return g_action_group_query_action (group->group, unprefixed_name, enabled, parameter_type, state_type, state_hint, state); - if (muxer->parent) - return g_action_group_query_action (G_ACTION_GROUP (muxer->parent), action_name, - enabled, parameter_type, - state_type, state_hint, state); + if (muxer->parent && recurse) + return gtk_action_muxer_query_action (muxer->parent, action_name, + enabled, parameter_type, + state_type, state_hint, state); return FALSE; } +gboolean +gtk_action_muxer_query_action (GtkActionMuxer *muxer, + const gchar *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state) +{ + return action_muxer_query_action (muxer, action_name, + enabled, parameter_type, + state_type, state_hint, state, + TRUE); +} + gboolean gtk_action_muxer_has_action (GtkActionMuxer *muxer, const char *action_name) { - return gtk_action_muxer_query_action (muxer, action_name, - NULL, NULL, NULL, NULL, NULL); + return action_muxer_query_action (muxer, action_name, + NULL, NULL, NULL, NULL, NULL, + TRUE); } void @@ -812,12 +741,12 @@ gtk_action_muxer_activate_action (GtkActionMuxer *muxer, if (group) g_action_group_activate_action (group->group, unprefixed_name, parameter); else if (muxer->parent) - g_action_group_activate_action (G_ACTION_GROUP (muxer->parent), action_name, parameter); + gtk_action_muxer_activate_action (muxer->parent, action_name, parameter); } void gtk_action_muxer_change_action_state (GtkActionMuxer *muxer, - const gchar *action_name, + const char *action_name, GVariant *state) { GtkWidgetAction *action; @@ -846,7 +775,7 @@ gtk_action_muxer_change_action_state (GtkActionMuxer *muxer, if (group) g_action_group_change_action_state (group->group, unprefixed_name, state); else if (muxer->parent) - g_action_group_change_action_state (G_ACTION_GROUP (muxer->parent), action_name, state); + gtk_action_muxer_change_action_state (muxer->parent, action_name, state); } static void @@ -862,7 +791,13 @@ gtk_action_muxer_unregister_internal (Action *action, *ptr = g_slist_remove (*ptr, observer); if (action->watchers == NULL) + { + if (muxer->parent) + gtk_action_observable_unregister_observer (GTK_ACTION_OBSERVABLE (muxer->parent), + action->fullname, + GTK_ACTION_OBSERVER (muxer)); g_hash_table_remove (muxer->observed_actions, action->fullname); + } break; } @@ -884,6 +819,9 @@ gtk_action_muxer_register_observer (GtkActionObservable *observable, { GtkActionMuxer *muxer = GTK_ACTION_MUXER (observable); Action *action; + gboolean enabled; + const GVariantType *parameter_type; + GVariant *state; action = g_hash_table_lookup (muxer->observed_actions, name); @@ -899,7 +837,28 @@ gtk_action_muxer_register_observer (GtkActionObservable *observable, action->watchers = g_slist_prepend (action->watchers, observer); g_object_weak_ref (G_OBJECT (observer), gtk_action_muxer_weak_notify, action); - g_print ("register GtkActionObserver\n"); + + if (action_muxer_query_action (muxer, name, + &enabled, ¶meter_type, + NULL, NULL, &state, FALSE)) + { + gtk_action_muxer_action_added (muxer, name, parameter_type, enabled, state); + g_clear_pointer (&state, g_variant_unref); + } + else if (muxer->parent) + { + if (action_muxer_query_action (muxer->parent, name, + &enabled, ¶meter_type, + NULL, NULL, &state, FALSE)) + { + gtk_action_muxer_action_added (muxer, name, parameter_type, enabled, state); + g_clear_pointer (&state, g_variant_unref); + } + + gtk_action_observable_register_observer (GTK_ACTION_OBSERVABLE (muxer->parent), + name, + GTK_ACTION_OBSERVER (muxer)); + } } static void @@ -911,9 +870,11 @@ gtk_action_muxer_unregister_observer (GtkActionObservable *observable, Action *action; action = g_hash_table_lookup (muxer->observed_actions, name); + if (!action) + return; + g_object_weak_unref (G_OBJECT (observer), gtk_action_muxer_weak_notify, action); gtk_action_muxer_unregister_internal (action, observer); - g_print ("unregister GtkActionObserver\n"); } static void @@ -968,23 +929,12 @@ gtk_action_muxer_dispose (GObject *object) { GtkActionMuxer *muxer = GTK_ACTION_MUXER (object); - if (muxer->parent) - { - g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_action_added_to_parent, muxer); - g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_action_removed_from_parent, muxer); - g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_action_enabled_changed, muxer); - g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_action_state_changed, muxer); - g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_primary_accel_changed, muxer); - - g_clear_object (&muxer->parent); - } - + g_clear_object (&muxer->parent); g_hash_table_remove_all (muxer->observed_actions); muxer->widget = NULL; - G_OBJECT_CLASS (gtk_action_muxer_parent_class) - ->dispose (object); + G_OBJECT_CLASS (gtk_action_muxer_parent_class)->dispose (object); } void @@ -1054,51 +1004,67 @@ gtk_action_muxer_observable_iface_init (GtkActionObservableInterface *iface) iface->unregister_observer = gtk_action_muxer_unregister_observer; } -static gboolean -gtk_action_muxer_group_query_action (GActionGroup *group, - const char *action_name, - gboolean *enabled, - const GVariantType **parameter_type, - const GVariantType **state_type, - GVariant **state_hint, - GVariant **state) + +static void +gtk_action_muxer_observer_action_added (GtkActionObserver *observer, + GtkActionObservable *observable, + const char *action_name, + const GVariantType *parameter_type, + gboolean enabled, + GVariant *state) { - return gtk_action_muxer_query_action (GTK_ACTION_MUXER (group), - action_name, - enabled, - parameter_type, - state_type, - state_hint, - state); + gtk_action_muxer_action_added (GTK_ACTION_MUXER (observer), + action_name, + parameter_type, + enabled, + state); } static void -gtk_action_muxer_group_activate_action (GActionGroup *group, - const char *action_name, - GVariant *parameter) +gtk_action_muxer_observer_action_removed (GtkActionObserver *observer, + GtkActionObservable *observable, + const char *action_name) { - gtk_action_muxer_activate_action (GTK_ACTION_MUXER (group), - action_name, - parameter); + gtk_action_muxer_action_removed (GTK_ACTION_MUXER (observer), action_name); } static void -gtk_action_muxer_group_change_action_state (GActionGroup *group, - const gchar *action_name, - GVariant *state) +gtk_action_muxer_observer_action_enabled_changed (GtkActionObserver *observer, + GtkActionObservable *observable, + const char *action_name, + gboolean enabled) { - gtk_action_muxer_change_action_state (GTK_ACTION_MUXER (group), - action_name, - state); + gtk_action_muxer_action_enabled_changed (GTK_ACTION_MUXER (observer), action_name, enabled); } static void -gtk_action_muxer_group_iface_init (GActionGroupInterface *iface) +gtk_action_muxer_observer_action_state_changed (GtkActionObserver *observer, + GtkActionObservable *observable, + const char *action_name, + GVariant *state) { - iface->list_actions = gtk_action_muxer_list_actions; - iface->query_action = gtk_action_muxer_group_query_action; - iface->activate_action = gtk_action_muxer_group_activate_action; - iface->change_action_state = gtk_action_muxer_group_change_action_state; + gtk_action_muxer_action_state_changed (GTK_ACTION_MUXER (observer), action_name, state); +} + +static void +gtk_action_muxer_observer_primary_accel_changed (GtkActionObserver *observer, + GtkActionObservable *observable, + const char *action_name, + const char *action_and_target) +{ + gtk_action_muxer_primary_accel_changed (GTK_ACTION_MUXER (observer), + action_name, + action_and_target); +} + +static void +gtk_action_muxer_observer_iface_init (GtkActionObserverInterface *iface) +{ + iface->action_added = gtk_action_muxer_observer_action_added; + iface->action_removed = gtk_action_muxer_observer_action_removed; + iface->action_enabled_changed = gtk_action_muxer_observer_action_enabled_changed; + iface->action_state_changed = gtk_action_muxer_observer_action_state_changed; + iface->primary_accel_changed = gtk_action_muxer_observer_primary_accel_changed; } static void @@ -1109,20 +1075,6 @@ gtk_action_muxer_class_init (GObjectClass *class) class->finalize = gtk_action_muxer_finalize; class->dispose = gtk_action_muxer_dispose; - action_added_signal = g_signal_lookup ("action-added", GTK_TYPE_ACTION_MUXER); - action_removed_signal = g_signal_lookup ("action-removed", GTK_TYPE_ACTION_MUXER); - - accel_signal = g_signal_new (I_("primary-accel-changed"), - GTK_TYPE_ACTION_MUXER, - G_SIGNAL_RUN_LAST, - 0, - NULL, NULL, - _gtk_marshal_VOID__STRING_STRING, - G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); - g_signal_set_va_marshaller (accel_signal, - G_TYPE_FROM_CLASS (class), - _gtk_marshal_VOID__STRING_STRINGv); - properties[PROP_PARENT] = g_param_spec_object ("parent", "Parent", "The parent muxer", GTK_TYPE_ACTION_MUXER, @@ -1236,7 +1188,6 @@ gtk_action_muxer_remove (GtkActionMuxer *muxer, GtkActionMuxer * gtk_action_muxer_new (GtkWidget *widget) { - g_print ("create GtkActionMuxer\n"); return g_object_new (GTK_TYPE_ACTION_MUXER, "widget", widget, NULL); @@ -1256,26 +1207,6 @@ gtk_action_muxer_get_parent (GtkActionMuxer *muxer) return muxer->parent; } -static void -emit_changed_accels (GtkActionMuxer *muxer, - GtkActionMuxer *parent) -{ - while (parent) - { - if (parent->primary_accels) - { - GHashTableIter iter; - gpointer key; - - g_hash_table_iter_init (&iter, parent->primary_accels); - while (g_hash_table_iter_next (&iter, &key, NULL)) - gtk_action_muxer_primary_accel_changed (muxer, NULL, key); - } - - parent = parent->parent; - } -} - /*< private > * gtk_action_muxer_set_parent: * @muxer: a #GtkActionMuxer @@ -1296,15 +1227,6 @@ gtk_action_muxer_set_parent (GtkActionMuxer *muxer, if (muxer->parent != NULL) { notify_observers_removed (muxer, muxer->parent); - emit_action_removed (muxer, muxer->parent); - emit_changed_accels (muxer, muxer->parent); - - g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_action_added_to_parent, muxer); - g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_action_removed_from_parent, muxer); - g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_action_enabled_changed, muxer); - g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_action_state_changed, muxer); - g_signal_handlers_disconnect_by_func (muxer->parent, gtk_action_muxer_parent_primary_accel_changed, muxer); - g_object_unref (muxer->parent); } @@ -1313,21 +1235,7 @@ gtk_action_muxer_set_parent (GtkActionMuxer *muxer, if (muxer->parent != NULL) { g_object_ref (muxer->parent); - notify_observers_added (muxer, muxer->parent); - emit_action_added (muxer, muxer->parent); - emit_changed_accels (muxer, muxer->parent); - - g_signal_connect (muxer->parent, "action-added", - G_CALLBACK (gtk_action_muxer_action_added_to_parent), muxer); - g_signal_connect (muxer->parent, "action-removed", - G_CALLBACK (gtk_action_muxer_action_removed_from_parent), muxer); - g_signal_connect (muxer->parent, "action-enabled-changed", - G_CALLBACK (gtk_action_muxer_parent_action_enabled_changed), muxer); - g_signal_connect (muxer->parent, "action-state-changed", - G_CALLBACK (gtk_action_muxer_parent_action_state_changed), muxer); - g_signal_connect (muxer->parent, "primary-accel-changed", - G_CALLBACK (gtk_action_muxer_parent_primary_accel_changed), muxer); } g_object_notify_by_pspec (G_OBJECT (muxer), properties[PROP_PARENT]);