From d5054f9b9946096031f09f788e13cc35fe18bcda Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 17 Jun 2021 08:37:42 -0400 Subject: [PATCH] action muxer: Propagate registrations further up We were pretty aggressive about not registering observers further than necessary, stopping at the first muxer that provides an action. But even though action changes further up in the tree won't be relevant in that case, we need to listen to accel changes, since they may come from higher up in the tree (e.g. when using gtk_application_set_accels_for_action with an action that is defined on a widget. So, register all the way to the top, and stop propagating action changes when we hit a muxer that provides the action. --- gtk/gtkactionmuxer.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/gtk/gtkactionmuxer.c b/gtk/gtkactionmuxer.c index 9eac44b72e..d894d2b0bd 100644 --- a/gtk/gtkactionmuxer.c +++ b/gtk/gtkactionmuxer.c @@ -966,21 +966,14 @@ gtk_action_muxer_register_observer (GtkActionObservable *observable, if (action_muxer_query_action (muxer, name, &enabled, ¶meter_type, - NULL, NULL, &state, FALSE)) + NULL, NULL, &state, TRUE)) { 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); - } + if (muxer->parent) + { gtk_action_observable_register_observer (GTK_ACTION_OBSERVABLE (muxer->parent), name, GTK_ACTION_OBSERVER (muxer)); @@ -1142,6 +1135,10 @@ gtk_action_muxer_observer_action_added (GtkActionObserver *observer, gboolean enabled, GVariant *state) { + if (action_muxer_query_action (GTK_ACTION_MUXER (observer), action_name, + NULL, NULL, NULL, NULL, NULL, FALSE)) + return; + gtk_action_muxer_action_added (GTK_ACTION_MUXER (observer), action_name, parameter_type, @@ -1154,6 +1151,10 @@ gtk_action_muxer_observer_action_removed (GtkActionObserver *observer, GtkActionObservable *observable, const char *action_name) { + if (action_muxer_query_action (GTK_ACTION_MUXER (observer), action_name, + NULL, NULL, NULL, NULL, NULL, FALSE)) + return; + gtk_action_muxer_action_removed (GTK_ACTION_MUXER (observer), action_name); } @@ -1163,6 +1164,10 @@ gtk_action_muxer_observer_action_enabled_changed (GtkActionObserver *observer, const char *action_name, gboolean enabled) { + if (action_muxer_query_action (GTK_ACTION_MUXER (observer), action_name, + NULL, NULL, NULL, NULL, NULL, FALSE)) + return; + gtk_action_muxer_action_enabled_changed (GTK_ACTION_MUXER (observer), action_name, enabled); } @@ -1172,6 +1177,10 @@ gtk_action_muxer_observer_action_state_changed (GtkActionObserver *observer, const char *action_name, GVariant *state) { + if (action_muxer_query_action (GTK_ACTION_MUXER (observer), action_name, + NULL, NULL, NULL, NULL, NULL, FALSE)) + return; + gtk_action_muxer_action_state_changed (GTK_ACTION_MUXER (observer), action_name, state); }