diff --git a/panels/region/cc-region-panel.c b/panels/region/cc-region-panel.c index eb30eb499..06b673f52 100644 --- a/panels/region/cc-region-panel.c +++ b/panels/region/cc-region-panel.c @@ -128,15 +128,16 @@ cc_region_panel_init (CcRegionPanel * self) return; } - setup_images (priv->builder); - setup_xkb_tabs (priv->builder); - setup_language (priv->builder); - prefs_widget = (GtkWidget *) gtk_builder_get_object (priv->builder, "region_notebook"); gtk_widget_set_size_request (GTK_WIDGET (prefs_widget), -1, 400); gtk_widget_reparent (prefs_widget, GTK_WIDGET (self)); + + + setup_images (priv->builder); + setup_xkb_tabs (priv->builder); + setup_language (priv->builder); } void diff --git a/panels/region/gnome-region-panel-lang.c b/panels/region/gnome-region-panel-lang.c index a1a603a1e..a7f725b09 100644 --- a/panels/region/gnome-region-panel-lang.c +++ b/panels/region/gnome-region-panel-lang.c @@ -28,9 +28,96 @@ #include "gnome-region-panel-lang.h" #include "cc-common-language.h" +#include "gdm-languages.h" + +static GHashTable * +new_ht_for_user_languages (void) +{ + GHashTable *ht; + char *name; + char *language; + + ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + /* FIXME: As in um-language-dialog.c, we should add the + * languages used by other users on the system */ + + /* Add current locale */ + name = cc_common_language_get_current_language (); + language = gdm_get_language_from_name (name, NULL); + g_hash_table_insert (ht, name, language); + + return ht; +} + +static void +remove_timeout (gpointer data, + GObject *where_the_object_was) +{ + guint timeout = GPOINTER_TO_UINT (data); + g_source_remove (timeout); +} + +static gboolean +finish_language_setup (gpointer user_data) +{ + GtkWidget *list = (GtkWidget *) user_data; + GtkTreeModel *model; + GtkWidget *parent; + GHashTable *user_langs; + guint timeout; + + /* Did we get called after the widget was destroyed? */ + if (list == NULL) + return FALSE; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (list)); + user_langs = g_object_get_data (G_OBJECT (list), "user-langs"); + + cc_common_language_add_available_languages (GTK_LIST_STORE (model), user_langs); + + parent = gtk_widget_get_toplevel (list); + gdk_window_set_cursor (gtk_widget_get_window (parent), NULL); + + g_object_set_data (G_OBJECT (list), "user-langs", NULL); + timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (list), "timeout")); + g_object_weak_unref (G_OBJECT (list), (GWeakNotify) remove_timeout, GUINT_TO_POINTER (timeout)); + + return FALSE; +} void setup_language (GtkBuilder *builder) { - g_message ("TODO"); + GtkWidget *treeview; + GHashTable *user_langs; + GtkWidget *parent; + GtkTreeModel *model; + GdkWindow *window; + guint timeout; + + treeview = GTK_WIDGET (gtk_builder_get_object (builder, "display_language_treeview")); + parent = gtk_widget_get_toplevel (treeview); + g_message ("parent %p", parent); + + /* Add user languages */ + user_langs = new_ht_for_user_languages (); + cc_common_language_setup_list (treeview, user_langs); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview)); + + /* Setup so that the list is populated after the list appears */ + window = gtk_widget_get_window (parent); + if (window) { + GdkCursor *cursor; + + cursor = gdk_cursor_new (GDK_WATCH); + gdk_window_set_cursor (gtk_widget_get_window (parent), cursor); + g_object_unref (cursor); + } + + g_object_set_data_full (G_OBJECT (treeview), "user-langs", + user_langs, (GDestroyNotify) g_hash_table_destroy); + timeout = g_idle_add ((GSourceFunc) finish_language_setup, treeview); + g_object_set_data (G_OBJECT (treeview), "timeout", GUINT_TO_POINTER (timeout)); + g_object_weak_ref (G_OBJECT (treeview), (GWeakNotify) remove_timeout, GUINT_TO_POINTER (timeout)); } diff --git a/panels/region/gnome-region-panel.ui b/panels/region/gnome-region-panel.ui index b9d431a92..380ea7ed7 100644 --- a/panels/region/gnome-region-panel.ui +++ b/panels/region/gnome-region-panel.ui @@ -119,11 +119,20 @@ False 12 - + True True - - + never + in + + + True + True + False + + + +