static void add_languages (GtkDialog *chooser, gchar **locale_ids, GHashTable *initial) { CcLanguageChooserPrivate *priv = GET_PRIVATE (chooser); while (*locale_ids) { gchar *locale_id; gboolean is_initial; GtkWidget *widget; locale_id = *locale_ids; locale_ids ++; if (!cc_common_language_has_font (locale_id)) continue; is_initial = (g_hash_table_lookup (initial, locale_id) != NULL); widget = language_widget_new (locale_id, priv->language, !is_initial); gtk_container_add (GTK_CONTAINER (priv->language_list), widget); } gtk_container_add (GTK_CONTAINER (priv->language_list), GTK_WIDGET (priv->more_item)); gtk_widget_show_all (priv->language_list); }
static void add_languages (CcLanguageChooser *chooser, char **locale_ids, GHashTable *initial) { CcLanguageChooserPrivate *priv = chooser->priv; while (*locale_ids) { const gchar *locale_id; gboolean is_initial; GtkWidget *widget; locale_id = *locale_ids; locale_ids ++; if (!cc_common_language_has_font (locale_id)) continue; is_initial = (g_hash_table_lookup (initial, locale_id) != NULL); widget = language_widget_new (locale_id, !is_initial); gtk_container_add (GTK_CONTAINER (priv->language_list), widget); } gtk_container_add (GTK_CONTAINER (priv->language_list), priv->more_item); gtk_list_box_set_placeholder (GTK_LIST_BOX (priv->language_list), priv->no_results); gtk_widget_show_all (priv->language_list); }
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)) { GDBusProxy *user; GVariant *props; const char *lang; char *name; char *language; user = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, NULL, "org.freedesktop.Accounts", str, "org.freedesktop.Accounts.User", NULL, &error); if (user == NULL) { g_warning ("Failed to get proxy for user '%s': %s", str, error->message); g_error_free (error); error = NULL; continue; } props = g_dbus_proxy_get_cached_property (user, "Language"); lang = g_variant_get_string (props, NULL); if (lang != NULL && *lang != '\0' && cc_common_language_has_font (lang) && gdm_language_has_translations (lang)) { name = gdm_normalize_language_name (lang); if (!g_hash_table_lookup (ht, name)) { language = gdm_get_language_from_name (name, NULL); g_hash_table_insert (ht, name, language); } else { g_free (name); } } g_variant_unref (props); g_object_unref (user); } g_variant_iter_free (vi); g_variant_unref (variant); g_object_unref (proxy); }
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 = gdm_normalize_language_name (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 = gdm_get_region_from_name (name, NULL); } else { language = gdm_get_language_from_name (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; } /* Add separator between initial languages and new additions */ if (g_object_get_data (G_OBJECT (data->store), "needs-separator")) { GtkTreeIter iter; gtk_list_store_insert_with_values (GTK_LIST_STORE (data->store), &iter, -1, LOCALE_COL, NULL, DISPLAY_LOCALE_COL, "Don't show", SEPARATOR_COL, TRUE, USER_LANGUAGE, FALSE, -1); g_object_set_data (G_OBJECT (data->store), "needs-separator", NULL); } 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; }