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:
parent
f925a9ea86
commit
ffb0f5aca6
3 changed files with 48 additions and 43 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue