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.
This commit is contained in:
Bastien Nocera 2011-01-25 17:42:19 +00:00
parent f925a9ea86
commit ffb0f5aca6
3 changed files with 48 additions and 43 deletions

View file

@ -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);

View file

@ -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

View file

@ -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;
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);
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_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;