Speed up action muxer setup
We don't need to duplicate all these action names and emit all these signals if nobody is listening.
This commit is contained in:
@@ -322,6 +322,108 @@ gtk_action_muxer_parent_action_state_changed (GActionGroup *action_group,
|
||||
gtk_action_muxer_action_state_changed (muxer, action_name, state);
|
||||
}
|
||||
|
||||
static void
|
||||
notify_observers_added (GtkActionMuxer *muxer,
|
||||
GtkActionMuxer *parent)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
const char *action_name;
|
||||
Action *action;
|
||||
|
||||
g_hash_table_iter_init (&iter, muxer->observed_actions);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer *)&action_name, (gpointer *)&action))
|
||||
{
|
||||
const GVariantType *parameter_type;
|
||||
gboolean enabled;
|
||||
GVariant *state;
|
||||
GSList *node;
|
||||
|
||||
if (!action->watchers)
|
||||
continue;
|
||||
|
||||
if (!g_action_group_query_action (G_ACTION_GROUP (parent), action_name,
|
||||
&enabled, ¶meter_type, NULL, NULL, &state))
|
||||
continue;
|
||||
|
||||
for (node = action->watchers; node; node = node->next)
|
||||
gtk_action_observer_action_added (node->data,
|
||||
GTK_ACTION_OBSERVABLE (muxer),
|
||||
action_name, parameter_type, enabled, state);
|
||||
|
||||
if (state)
|
||||
g_variant_unref (state);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
emit_action_added (GtkActionMuxer *muxer,
|
||||
GtkActionMuxer *parent)
|
||||
{
|
||||
static guint signal_id = 0;
|
||||
|
||||
if (signal_id == 0)
|
||||
signal_id = g_signal_lookup ("action-added", G_OBJECT_TYPE (muxer));
|
||||
|
||||
if (g_signal_has_handler_pending (muxer, signal_id, 0, FALSE))
|
||||
{
|
||||
gchar **actions;
|
||||
gchar **it;
|
||||
|
||||
actions = g_action_group_list_actions (G_ACTION_GROUP (parent));
|
||||
|
||||
for (it = actions; *it; it++)
|
||||
g_action_group_action_added (G_ACTION_GROUP (muxer), *it);
|
||||
|
||||
g_strfreev (actions);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
notify_observers_removed (GtkActionMuxer *muxer,
|
||||
GtkActionMuxer *parent)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
const char *action_name;
|
||||
Action *action;
|
||||
|
||||
g_hash_table_iter_init (&iter, muxer->observed_actions);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer *)&action_name, (gpointer *)&action))
|
||||
{
|
||||
GSList *node;
|
||||
|
||||
if (!action->watchers)
|
||||
continue;
|
||||
|
||||
for (node = action->watchers; node; node = node->next)
|
||||
gtk_action_observer_action_removed (node->data,
|
||||
GTK_ACTION_OBSERVABLE (muxer),
|
||||
action_name);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
emit_action_removed (GtkActionMuxer *muxer,
|
||||
GtkActionMuxer *parent)
|
||||
{
|
||||
static guint signal_id = 0;
|
||||
|
||||
if (signal_id == 0)
|
||||
signal_id = g_signal_lookup ("action-removed", G_OBJECT_TYPE (muxer));
|
||||
|
||||
if (g_signal_has_handler_pending (muxer, signal_id, 0, FALSE))
|
||||
{
|
||||
gchar **actions;
|
||||
gchar **it;
|
||||
|
||||
actions = g_action_group_list_actions (G_ACTION_GROUP (parent));
|
||||
|
||||
for (it = actions; *it; it++)
|
||||
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,
|
||||
@@ -1125,14 +1227,8 @@ gtk_action_muxer_set_parent (GtkActionMuxer *muxer,
|
||||
|
||||
if (muxer->parent != NULL)
|
||||
{
|
||||
gchar **actions;
|
||||
gchar **it;
|
||||
|
||||
actions = g_action_group_list_actions (G_ACTION_GROUP (muxer->parent));
|
||||
for (it = actions; *it; it++)
|
||||
gtk_action_muxer_action_removed (muxer, *it);
|
||||
g_strfreev (actions);
|
||||
|
||||
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);
|
||||
@@ -1148,16 +1244,10 @@ gtk_action_muxer_set_parent (GtkActionMuxer *muxer,
|
||||
|
||||
if (muxer->parent != NULL)
|
||||
{
|
||||
gchar **actions;
|
||||
gchar **it;
|
||||
|
||||
g_object_ref (muxer->parent);
|
||||
|
||||
actions = g_action_group_list_actions (G_ACTION_GROUP (muxer->parent));
|
||||
for (it = actions; *it; it++)
|
||||
gtk_action_muxer_action_added (muxer, *it, G_ACTION_GROUP (muxer->parent), *it);
|
||||
g_strfreev (actions);
|
||||
|
||||
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",
|
||||
|
||||
Reference in New Issue
Block a user