mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-28 22:41:43 +00:00
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.
This commit is contained in:
parent
4786a16696
commit
96d42cf1cc
@ -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]);
|
||||
|
Loading…
Reference in New Issue
Block a user