From fab2ebfc84ded877f392369d8643634b0e5446f8 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 4 Jun 2012 18:46:08 +0200 Subject: gactiongroup: don't remove items from the hash while iterating over it --- src/gactionmuxer.c | 47 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/gactionmuxer.c b/src/gactionmuxer.c index e2cee3f..6c4d08b 100644 --- a/src/gactionmuxer.c +++ b/src/gactionmuxer.c @@ -60,6 +60,8 @@ struct _GActionMuxer static void g_action_muxer_group_init (GActionGroupInterface *iface); static void g_action_muxer_dispose (GObject *object); static void g_action_muxer_finalize (GObject *object); +static void g_action_muxer_disconnect_group (GActionMuxer *muxer, + GActionGroup *subgroup); static gchar ** g_action_muxer_list_actions (GActionGroup *group); static void g_action_muxer_activate_action (GActionGroup *group, const gchar *action_name, @@ -122,13 +124,20 @@ g_action_muxer_dispose (GObject *object) { GActionMuxer *muxer = G_ACTION_MUXER (object); GHashTableIter it; - gchar *prefix; + GActionGroup *subgroup; - g_clear_object (&muxer->global_actions); + if (muxer->global_actions) + { + g_action_muxer_disconnect_group (muxer, muxer->global_actions); + g_clear_object (&muxer->global_actions); + } g_hash_table_iter_init (&it, muxer->groups); - while (g_hash_table_iter_next (&it, (gpointer *) &prefix, NULL)) - g_action_muxer_remove (muxer, prefix); + while (g_hash_table_iter_next (&it, NULL, (gpointer *) &subgroup)) + g_action_muxer_disconnect_group (muxer, subgroup); + + g_hash_table_remove_all (muxer->groups); + g_hash_table_remove_all (muxer->reverse); } static void @@ -187,6 +196,24 @@ g_action_muxer_lookup_full_name (GActionMuxer *muxer, return NULL; } +static void +g_action_muxer_disconnect_group (GActionMuxer *muxer, + GActionGroup *subgroup) +{ + gchar **actions; + gchar **action; + + actions = g_action_group_list_actions (subgroup); + for (action = actions; *action; action++) + g_action_muxer_action_removed (subgroup, *action, muxer); + g_strfreev (actions); + + g_signal_handlers_disconnect_by_func (subgroup, g_action_muxer_action_added, muxer); + g_signal_handlers_disconnect_by_func (subgroup, g_action_muxer_action_removed, muxer); + g_signal_handlers_disconnect_by_func (subgroup, g_action_muxer_action_enabled_changed, muxer); + g_signal_handlers_disconnect_by_func (subgroup, g_action_muxer_action_state_changed, muxer); +} + static gchar ** g_action_muxer_list_actions (GActionGroup *group) { @@ -432,8 +459,6 @@ g_action_muxer_remove (GActionMuxer *muxer, const gchar *prefix) { GActionGroup *subgroup; - gchar **actions; - gchar **action; g_return_if_fail (G_IS_ACTION_MUXER (muxer)); @@ -441,15 +466,7 @@ g_action_muxer_remove (GActionMuxer *muxer, if (!subgroup) return; - actions = g_action_group_list_actions (subgroup); - for (action = actions; *action; action++) - g_action_muxer_action_removed (subgroup, *action, muxer); - g_strfreev (actions); - - g_signal_handlers_disconnect_by_func (subgroup, g_action_muxer_action_added, muxer); - g_signal_handlers_disconnect_by_func (subgroup, g_action_muxer_action_removed, muxer); - g_signal_handlers_disconnect_by_func (subgroup, g_action_muxer_action_enabled_changed, muxer); - g_signal_handlers_disconnect_by_func (subgroup, g_action_muxer_action_state_changed, muxer); + g_action_muxer_disconnect_group (muxer, subgroup); if (prefix) { -- cgit v1.2.3