[gnome-control-center] user-accounts: Move idle hack to password dialogue



commit ffb0f5aca68058952859ed8fb710956a77fb8128
Author: Bastien Nocera <hadess hadess net>
Date:   Tue Jan 25 17:42:19 2011 +0000

    user-accounts: Move idle hack to password dialogue
    
    We had a hack to show the dialogue ASAP, and fill it in later. Now,
    we have the list of existing languages populated when showing the
    dialogue, and then populate it in an idle.

 panels/user-accounts/um-language-dialog.c |   41 ++++++++++++++++++++++--
 panels/user-accounts/um-language-dialog.h |    2 +-
 panels/user-accounts/um-user-panel.c      |   48 ++++++-----------------------
 3 files changed, 48 insertions(+), 43 deletions(-)
---
diff --git a/panels/user-accounts/um-language-dialog.c b/panels/user-accounts/um-language-dialog.c
index c1192aa..b2c83f0 100644
--- a/panels/user-accounts/um-language-dialog.c
+++ b/panels/user-accounts/um-language-dialog.c
@@ -181,8 +181,35 @@ um_add_user_languages (GtkTreeModel *model)
         g_hash_table_destroy (user_langs);
 }
 
+static gboolean
+finish_um_language_chooser (gpointer user_data)
+{
+	GtkWidget *chooser = (GtkWidget *) user_data;
+	GtkWidget *list;
+	GtkTreeModel *model;
+	GtkWindow *parent;
+	GHashTable *user_langs;
+
+	/* Did we get called after the widget was destroyed? */
+	if (chooser == NULL)
+		return FALSE;
+
+	list = g_object_get_data (G_OBJECT (chooser), "list");
+	model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
+	user_langs = g_object_get_data (G_OBJECT (chooser), "user-langs");
+
+	cc_common_language_add_available_languages (GTK_LIST_STORE (model), user_langs);
+
+	parent = gtk_window_get_transient_for (GTK_WINDOW (chooser));
+	gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (parent)), NULL);
+
+	g_object_set_data (G_OBJECT (chooser), "user-langs", NULL);
+
+	return FALSE;
+}
+
 GtkWidget *
-um_language_chooser_new (void)
+um_language_chooser_new (GtkWidget *parent)
 {
         GtkBuilder *builder;
         const char *filename;
@@ -192,6 +219,7 @@ um_language_chooser_new (void)
         GtkWidget *button;
         GtkTreeModel *model;
         GHashTable *user_langs;
+        GdkCursor *cursor;
 
         builder = gtk_builder_new ();
         filename = UIDIR "/language-chooser.ui";
@@ -219,10 +247,15 @@ um_language_chooser_new (void)
         cc_common_language_setup_list (list, user_langs);
         model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
 
-	/* Add the other languages */
-        cc_common_language_add_available_languages (GTK_LIST_STORE (model), user_langs);
+	/* Setup so that the list is added after the dialogue is shown */
+        cursor = gdk_cursor_new (GDK_WATCH);
+        gdk_window_set_cursor (gtk_widget_get_window (parent), cursor);
+        g_object_unref (cursor);
 
-        g_hash_table_destroy (user_langs);
+	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);
 
         g_object_unref (builder);
 
diff --git a/panels/user-accounts/um-language-dialog.h b/panels/user-accounts/um-language-dialog.h
index d498c9c..0575afe 100644
--- a/panels/user-accounts/um-language-dialog.h
+++ b/panels/user-accounts/um-language-dialog.h
@@ -32,7 +32,7 @@ typedef struct _UmLanguageDialog UmLanguageDialog;
 void              um_add_user_languages       (GtkTreeModel     *model);
 gchar            *um_get_current_language     (void);
 
-GtkWidget        *um_language_chooser_new          (void);
+GtkWidget        *um_language_chooser_new          (GtkWidget *parent);
 gchar            *um_language_chooser_get_language (GtkWidget *chooser);
 
 G_END_DECLS
diff --git a/panels/user-accounts/um-user-panel.c b/panels/user-accounts/um-user-panel.c
index e0cf623..6949008 100644
--- a/panels/user-accounts/um-user-panel.c
+++ b/panels/user-accounts/um-user-panel.c
@@ -71,7 +71,6 @@ struct _UmUserPanelPrivate {
         GtkWidget *lock_button;
         GPermission *permission;
         GtkWidget *language_chooser;
-        guint language_chooser_idle;
 
         UmAccountDialog *account_dialog;
         UmPasswordDialog *password_dialog;
@@ -672,29 +671,6 @@ language_response (GtkDialog         *dialog,
         gtk_widget_set_sensitive (combo, TRUE);
 }
 
-static gboolean
-finish_language_chooser (UmUserPanelPrivate *d)
-{
-        GtkWidget *combo;
-
-        combo = get_widget (d, "account-language-combo");
-        d->language_chooser = um_language_chooser_new ();
-        gtk_window_set_transient_for (GTK_WINDOW (d->language_chooser),
-                                      GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)));
-        g_signal_connect (d->language_chooser, "response",
-                          G_CALLBACK (language_response), d);
-        g_signal_connect (d->language_chooser, "delete-event",
-                          G_CALLBACK (gtk_widget_hide_on_delete), NULL);
-
-        gdk_window_set_cursor (gtk_widget_get_window (gtk_widget_get_toplevel (d->main_box)), NULL);
-        gtk_window_present (GTK_WINDOW (d->language_chooser));
-        gtk_widget_set_sensitive (GTK_WIDGET (combo), FALSE);
-
-        d->language_chooser_idle = 0;
-
-        return FALSE;
-}
-
 static void
 language_changed (UmEditableCombo    *combo,
                   UmUserPanelPrivate *d)
@@ -703,7 +679,6 @@ language_changed (UmEditableCombo    *combo,
         GtkTreeIter iter;
         gchar *lang;
         UmUser *user;
-        GdkCursor *cursor;
 
         if (!um_editable_combo_get_active_iter (combo, &iter))
                  return;
@@ -726,16 +701,17 @@ language_changed (UmEditableCombo    *combo,
                 return;
         }
 
-	/* Already in flight? */
-        if (d->language_chooser_idle > 0)
-                return;
-
-        cursor = gdk_cursor_new (GDK_WATCH);
-        gdk_window_set_cursor (gtk_widget_get_window (gtk_widget_get_toplevel (d->main_box)),
-                               cursor);
-        g_object_unref (cursor);
+        d->language_chooser = um_language_chooser_new (gtk_widget_get_toplevel (d->main_box));
+        gtk_window_set_transient_for (GTK_WINDOW (d->language_chooser),
+                                      GTK_WINDOW (gtk_widget_get_toplevel (d->main_box)));
+        g_signal_connect (d->language_chooser, "response",
+                          G_CALLBACK (language_response), d);
+        g_signal_connect (d->language_chooser, "delete-event",
+                          G_CALLBACK (gtk_widget_hide_on_delete), NULL);
 
-        d->language_chooser_idle = g_idle_add ((GSourceFunc)finish_language_chooser, d);
+        gdk_window_set_cursor (gtk_widget_get_window (gtk_widget_get_toplevel (d->main_box)), NULL);
+        gtk_window_present (GTK_WINDOW (d->language_chooser));
+        gtk_widget_set_sensitive (GTK_WIDGET (combo), FALSE);
 }
 
 static void
@@ -1302,10 +1278,6 @@ um_user_panel_dispose (GObject *object)
                 um_photo_dialog_free (priv->photo_dialog);
                 priv->photo_dialog = NULL;
         }
-        if (priv->language_chooser_idle > 0) {
-                g_source_remove (priv->language_chooser_idle);
-                priv->language_chooser_idle = 0;
-        }
         if (priv->language_chooser) {
                 gtk_widget_destroy (priv->language_chooser);
                 priv->language_chooser = NULL;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]