From 226aa064aa4628754dc8d9ed42893843d59e07eb Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Tue, 25 Jan 2011 18:33:47 +0000 Subject: [PATCH] user-accounts: Fix timeout hack to not crash Could end up crashing the way we implemented it. --- panels/user-accounts/um-language-dialog.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/panels/user-accounts/um-language-dialog.c b/panels/user-accounts/um-language-dialog.c index b2c83f0e4..b79749be5 100644 --- a/panels/user-accounts/um-language-dialog.c +++ b/panels/user-accounts/um-language-dialog.c @@ -181,6 +181,14 @@ um_add_user_languages (GtkTreeModel *model) g_hash_table_destroy (user_langs); } +static void +remove_timeout (gpointer data, + GObject *where_the_object_was) +{ + guint timeout = GPOINTER_TO_UINT (data); + g_source_remove (timeout); +} + static gboolean finish_um_language_chooser (gpointer user_data) { @@ -189,6 +197,7 @@ finish_um_language_chooser (gpointer user_data) GtkTreeModel *model; GtkWindow *parent; GHashTable *user_langs; + guint timeout; /* Did we get called after the widget was destroyed? */ if (chooser == NULL) @@ -204,6 +213,8 @@ finish_um_language_chooser (gpointer user_data) gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (parent)), NULL); g_object_set_data (G_OBJECT (chooser), "user-langs", NULL); + timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (chooser), "timeout")); + g_object_weak_unref (G_OBJECT (chooser), (GWeakNotify) remove_timeout, GUINT_TO_POINTER (timeout)); return FALSE; } @@ -220,6 +231,7 @@ um_language_chooser_new (GtkWidget *parent) GtkTreeModel *model; GHashTable *user_langs; GdkCursor *cursor; + guint timeout; builder = gtk_builder_new (); filename = UIDIR "/language-chooser.ui"; @@ -254,8 +266,9 @@ um_language_chooser_new (GtkWidget *parent) g_object_set_data_full (G_OBJECT (chooser), "user-langs", user_langs, (GDestroyNotify) g_hash_table_destroy); - g_object_add_weak_pointer (G_OBJECT (chooser), (gpointer *) &chooser); - g_idle_add ((GSourceFunc) finish_um_language_chooser, chooser); + timeout = g_idle_add ((GSourceFunc) finish_um_language_chooser, chooser); + g_object_set_data (G_OBJECT (chooser), "timeout", GUINT_TO_POINTER (timeout)); + g_object_weak_ref (G_OBJECT (chooser), (GWeakNotify) remove_timeout, GUINT_TO_POINTER (timeout)); g_object_unref (builder);