--- a/src/bridge.c +++ b/src/bridge.c @@ -472,59 +472,62 @@ } RebuildData; static gboolean -do_rebuild (RebuildData *data) +do_rebuild (gpointer arg) { - if (data->widget != NULL && gtk_widget_is_toplevel (data->widget)) + RebuildData *data = arg; + if (gtk_widget_is_toplevel (data->widget)) { rebuild_window_items (data->bridge, data->widget); } - if (data->widget != NULL) - { - g_object_remove_weak_pointer (G_OBJECT (data->widget), (gpointer*)&data->widget); - g_hash_table_remove (rebuild_ids, data->widget); - } - + g_hash_table_remove (rebuild_ids, data->widget); + g_object_unref(data->widget); g_free (data); return FALSE; } +struct rebuild_table_entry { + guint id; + RebuildData *data; +}; + static void rebuild (AppMenuBridge *bridge, GtkWidget *toplevel) { - guint id = 0; + + struct rebuild_table_entry *entry; if (rebuild_ids != NULL) { - id = GPOINTER_TO_UINT (g_hash_table_lookup (rebuild_ids, toplevel)); - - if (id > 0) + entry = (g_hash_table_lookup (rebuild_ids, toplevel)); + if (entry) { - g_source_remove (id); + g_source_remove (entry->id); + g_object_unref(entry->data->widget); + g_free (entry->data); g_hash_table_remove (rebuild_ids, toplevel); - id = 0; } } RebuildData *data = g_new0 (RebuildData, 1); data->bridge = bridge; - data->widget = toplevel; + data->widget = g_object_ref(toplevel); - id = g_timeout_add (100, - (GSourceFunc)do_rebuild, + entry = g_new(struct rebuild_table_entry, 1); + entry->id = g_timeout_add (100, + do_rebuild, data); - - g_object_add_weak_pointer (G_OBJECT (data->widget), (gpointer*)&data->widget); + entry->data = data; if (rebuild_ids == NULL) { - rebuild_ids = g_hash_table_new (g_direct_hash, g_direct_equal); + rebuild_ids = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free); } - g_hash_table_insert (rebuild_ids, toplevel, GUINT_TO_POINTER (id)); + g_hash_table_insert (rebuild_ids, toplevel, entry); } static DbusmenuMenuitem * find_menu_bar (GtkWidget * widget);