diff --git a/panels/common/cc-common-language.c b/panels/common/cc-common-language.c index 2a8c925d0..2f7543176 100644 --- a/panels/common/cc-common-language.c +++ b/panels/common/cc-common-language.c @@ -36,62 +36,6 @@ static char *get_lang_for_user_object_path (const char *path); -static gint -cc_common_language_sort_languages (GtkTreeModel *model, - GtkTreeIter *a, - GtkTreeIter *b, - gpointer data) -{ - char *ca, *cb; - char *la, *lb; - gboolean sa, ula; - gboolean sb, ulb; - gint result; - - gtk_tree_model_get (model, a, - LOCALE_COL, &ca, - DISPLAY_LOCALE_COL, &la, - SEPARATOR_COL, &sa, - USER_LANGUAGE, &ula, - -1); - gtk_tree_model_get (model, b, - LOCALE_COL, &cb, - DISPLAY_LOCALE_COL, &lb, - SEPARATOR_COL, &sb, - USER_LANGUAGE, &ulb, - -1); - - /* Sort before and after separator first */ - if (sa && sb) - result = 0; - else if (sa) - result = ulb ? 1 : -1; - else if (sb) - result = ula ? -1 : 1; - - /* Sort user-languages first */ - else if (ula != ulb) { - if (ula) - result = -1; - else - result = 1; - } - - else if (!ca) - result = 1; - else if (!cb) - result = -1; - else - result = strcmp (la, lb); - - g_free (ca); - g_free (cb); - g_free (la); - g_free (lb); - - return result; -} - static gboolean iter_for_language (GtkTreeModel *model, const gchar *lang, @@ -143,14 +87,6 @@ cc_common_language_get_iter_for_language (GtkTreeModel *model, return iter_for_language (model, lang, iter, FALSE); } -gboolean -cc_common_language_get_iter_for_region (GtkTreeModel *model, - const gchar *lang, - GtkTreeIter *iter) -{ - return iter_for_language (model, lang, iter, TRUE); -} - gboolean cc_common_language_has_font (const gchar *locale) { @@ -209,95 +145,6 @@ cc_common_language_has_font (const gchar *locale) return is_displayable; } -typedef struct -{ - GtkListStore *store; - GHashTable *user_langs; - gchar **languages; - gboolean regions; - gint position; -} AsyncLangData; - -static void -async_lang_data_free (AsyncLangData *data) -{ - g_object_unref (data->store); - g_hash_table_unref (data->user_langs); - g_strfreev (data->languages); - g_free (data); -} - -static gboolean -add_one_language (gpointer d) -{ - AsyncLangData *data = d; - char *name; - char *language; - GtkTreeIter iter; - - if (data->languages[data->position] == NULL) { - /* we are done */ - async_lang_data_free (data); - return FALSE; - } - - name = gnome_normalize_locale (data->languages[data->position]); - if (g_hash_table_lookup (data->user_langs, name) != NULL) { - g_free (name); - goto next; - } - - if (!cc_common_language_has_font (data->languages[data->position])) { - g_free (name); - goto next; - } - - if (data->regions) { - language = gnome_get_country_from_locale (name, NULL); - } - else { - language = gnome_get_language_from_locale (name, NULL); - } - if (!language) { - g_debug ("Ignoring '%s' as a locale, because we couldn't figure the language name", name); - g_free (name); - goto next; - } - - gtk_list_store_insert_with_values (data->store, - &iter, - -1, - LOCALE_COL, name, - DISPLAY_LOCALE_COL, language, - -1); - - g_free (name); - g_free (language); - - next: - data->position++; - - return TRUE; -} - -guint -cc_common_language_add_available_languages (GtkListStore *store, - gboolean regions, - GHashTable *user_langs) -{ - AsyncLangData *data; - - data = g_new0 (AsyncLangData, 1); - - data->store = g_object_ref (store); - data->user_langs = g_hash_table_ref (user_langs); - data->languages = gnome_get_all_locales (); - data->regions = regions; - data->position = 0; - - return g_idle_add (add_one_language, data); -} - gchar * cc_common_language_get_current_language (void) { @@ -320,168 +167,6 @@ cc_common_language_get_current_language (void) return language; } -typedef struct { - GtkListStore *store; - gboolean user_lang; -} LangForeachData; - -static void -languages_foreach_cb (gpointer key, - gpointer value, - gpointer user_data) -{ - LangForeachData *data = (LangForeachData *) user_data; - const char *locale = (const char *) key; - const char *display_locale = (const char *) value; - - gtk_list_store_insert_with_values (data->store, - NULL, - -1, - LOCALE_COL, locale, - DISPLAY_LOCALE_COL, display_locale, - SEPARATOR_COL, FALSE, - USER_LANGUAGE, data->user_lang, - -1); -} - -static gboolean -separator_func (GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data) -{ - gboolean is_sep; - - gtk_tree_model_get (model, iter, - SEPARATOR_COL, &is_sep, - -1); - - return is_sep; -} - -void -cc_common_language_setup_list (GtkWidget *treeview, - GHashTable *users, - GHashTable *initial) -{ - GtkCellRenderer *cell; - GtkTreeViewColumn *column; - GtkListStore *store; - LangForeachData data; - GList *langs, *l; - - cell = gtk_cell_renderer_text_new (); - g_object_set (cell, - "width-chars", 40, - "ellipsize", PANGO_ELLIPSIZE_END, - NULL); - column = gtk_tree_view_column_new_with_attributes (NULL, cell, "text", DISPLAY_LOCALE_COL, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); - store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN); - gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (store), - cc_common_language_sort_languages, NULL, NULL); - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), - GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, - GTK_SORT_ASCENDING); - gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (treeview), - separator_func, - NULL, NULL); - - gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store)); - - data.store = store; - - /* Add the original users languages */ - if (users != NULL && g_hash_table_size (users) > 0) { - data.user_lang = TRUE; - g_hash_table_foreach (users, (GHFunc) languages_foreach_cb, &data); - - gtk_list_store_insert_with_values (store, - NULL, - -1, - LOCALE_COL, NULL, - DISPLAY_LOCALE_COL, "Don't show", - SEPARATOR_COL, TRUE, - USER_LANGUAGE, FALSE, - -1); - } - - /* Add languages from the initial hashtable */ - data.user_lang = FALSE; - langs = initial ? g_hash_table_get_keys (initial) : NULL; - for (l = langs; l != NULL; l = l->next) { - char *lang = l->data; - - if (g_hash_table_lookup (users, lang) != NULL) - continue; - - languages_foreach_cb (lang, g_hash_table_lookup (initial, lang), &data); - } -} - -void -cc_common_language_select_current_language (GtkTreeView *treeview) -{ - GtkTreeModel *model; - GtkTreeIter iter; - gboolean cont; - char *lang; - gboolean found; - - lang = cc_common_language_get_current_language (); - g_debug ("Trying to select lang '%s' in treeview", lang); - model = gtk_tree_view_get_model (treeview); - found = FALSE; - cont = gtk_tree_model_get_iter_first (model, &iter); - while (cont) { - char *locale; - - gtk_tree_model_get (model, &iter, - LOCALE_COL, &locale, - -1); - if (locale != NULL && - g_str_equal (locale, lang)) { - GtkTreeSelection *selection; - - g_debug ("Found '%s' in treeview", locale); - - found = TRUE; - selection = gtk_tree_view_get_selection (treeview); - gtk_tree_selection_select_iter (selection, &iter); - g_free (locale); - break; - } - g_free (locale); - - cont = gtk_tree_model_iter_next (model, &iter); - } - g_free (lang); - - if (found == FALSE) - g_warning ("Could not find current language '%s' in the treeview", lang); -} - -static gboolean -user_language_has_translations (const char *locale) -{ - char *name, *language_code, *territory_code; - gboolean ret; - - gnome_parse_locale (locale, - &language_code, - &territory_code, - NULL, NULL); - name = g_strdup_printf ("%s%s%s", - language_code, - territory_code != NULL? "_" : "", - territory_code != NULL? territory_code : ""); - g_free (language_code); - g_free (territory_code); - ret = gnome_language_has_translations (name); - g_free (name); - - return ret; -} - static char * get_lang_for_user_object_path (const char *path) { @@ -517,67 +202,6 @@ get_lang_for_user_object_path (const char *path) return lang; } -static void -add_other_users_language (GHashTable *ht) -{ - GVariant *variant; - GVariantIter *vi; - GError *error = NULL; - const char *str; - GDBusProxy *proxy; - - proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_NONE, - NULL, - "org.freedesktop.Accounts", - "/org/freedesktop/Accounts", - "org.freedesktop.Accounts", - NULL, - NULL); - - if (proxy == NULL) - return; - - variant = g_dbus_proxy_call_sync (proxy, - "ListCachedUsers", - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); - if (variant == NULL) { - g_warning ("Failed to list existing users: %s", error->message); - g_error_free (error); - g_object_unref (proxy); - return; - } - g_variant_get (variant, "(ao)", &vi); - while (g_variant_iter_loop (vi, "o", &str)) { - char *lang; - char *name; - char *language; - - lang = get_lang_for_user_object_path (str); - if (lang != NULL && *lang != '\0' && - cc_common_language_has_font (lang) && - user_language_has_translations (lang)) { - name = gnome_normalize_locale (lang); - if (!g_hash_table_lookup (ht, name)) { - language = gnome_get_language_from_locale (name, NULL); - g_hash_table_insert (ht, name, language); - } - else { - g_free (name); - } - } - g_free (lang); - } - g_variant_iter_free (vi); - g_variant_unref (variant); - - g_object_unref (proxy); -} - /* * Note that @lang needs to be formatted like the locale strings * returned by gnome_get_all_locales(). @@ -646,68 +270,6 @@ cc_common_language_get_initial_languages (void) return ht; } -GHashTable * -cc_common_language_get_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); - - /* Add the languages used by other users on the system */ - add_other_users_language (ht); - - /* Add current locale */ - name = cc_common_language_get_current_language (); - if (g_hash_table_lookup (ht, name) == NULL) { - language = gnome_get_language_from_locale (name, NULL); - g_hash_table_insert (ht, name, language); - } else { - g_free (name); - } - - return ht; -} - -GHashTable * -cc_common_language_get_initial_regions (const gchar *lang) -{ - GHashTable *ht; - char *language; - gchar **langs; - gint i; - - ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - -#if 0 - /* Add some common regions */ - g_hash_table_insert (ht, g_strdup ("en_US.utf8"), g_strdup (_("United States"))); - g_hash_table_insert (ht, g_strdup ("de_DE.utf8"), g_strdup (_("Germany"))); - g_hash_table_insert (ht, g_strdup ("fr_FR.utf8"), g_strdup (_("France"))); - g_hash_table_insert (ht, g_strdup ("es_ES.utf8"), g_strdup (_("Spain"))); - g_hash_table_insert (ht, g_strdup ("zh_CN.utf8"), g_strdup (_("China"))); -#endif - - gnome_parse_locale (lang, &language, NULL, NULL, NULL); - langs = gnome_get_all_locales (); - for (i = 0; langs[i]; i++) { - gchar *l, *s; - gnome_parse_locale (langs[i], &l, NULL, NULL, NULL); - if (g_strcmp0 (language, l) == 0) { - if (!g_hash_table_lookup (ht, langs[i])) { - s = gnome_get_country_from_locale (langs[i], NULL); - g_hash_table_insert (ht, g_strdup (langs[i]), s); - } - } - g_free (l); - } - g_strfreev (langs); - g_free (language); - - return ht; -} - static void foreach_user_lang_cb (gpointer key, gpointer value,