region: Implement setting the user language

And clean up the accounts service proxy when done.
This commit is contained in:
Bastien Nocera 2011-01-27 12:38:46 +00:00
parent 43dc7e3a7e
commit 8a2f45992f

View file

@ -64,13 +64,13 @@ add_other_users_language (GHashTable *ht)
char *language; char *language;
user = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, user = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE, G_DBUS_PROXY_FLAGS_NONE,
NULL, NULL,
"org.freedesktop.Accounts", "org.freedesktop.Accounts",
str, str,
"org.freedesktop.Accounts.User", "org.freedesktop.Accounts.User",
NULL, NULL,
&error); &error);
if (user == NULL) { if (user == NULL) {
g_warning ("Failed to get proxy for user '%s': %s", g_warning ("Failed to get proxy for user '%s': %s",
str, error->message); str, error->message);
@ -113,6 +113,91 @@ new_ht_for_user_languages (void)
return ht; return ht;
} }
static void
selection_changed (GtkTreeSelection *selection,
GtkTreeView *list)
{
GtkTreeModel *model;
GtkTreeIter iter;
char *locale;
GDBusProxy *user;
GVariant *variant;
GError *error = NULL;
char *object_path;
if (gtk_tree_selection_get_selected (selection, &model, &iter) == FALSE) {
g_warning ("No selected languages, this shouldn't happen");
return;
}
user = NULL;
variant = NULL;
gtk_tree_model_get (model, &iter,
LOCALE_COL, &locale,
-1);
if (proxy == NULL) {
g_warning ("Would change the language to '%s', but no D-Bus connection available", locale);
goto bail;
}
variant = g_dbus_proxy_call_sync (proxy,
"FindUserByName",
g_variant_new ("(s)", g_get_user_name ()),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
if (variant == NULL) {
g_warning ("Could not contact accounts service to look up '%s': %s",
g_get_user_name (), error->message);
g_error_free (error);
goto bail;
}
g_variant_get (variant, "(o)", &object_path);
user = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
"org.freedesktop.Accounts",
object_path,
"org.freedesktop.Accounts.User",
NULL,
&error);
g_free (object_path);
if (user == NULL) {
g_warning ("Could not create proxy for user '%s': %s",
g_variant_get_string (variant, NULL), error->message);
g_error_free (error);
goto bail;
}
g_variant_unref (variant);
variant = g_dbus_proxy_call_sync (user,
"SetLanguage",
g_variant_new ("(s)", locale),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
if (variant == NULL) {
g_warning ("Failed to set the language '%s': %s", locale, error->message);
g_error_free (error);
goto bail;
}
/* And done */
bail:
if (variant != NULL)
g_variant_unref (variant);
if (user != NULL)
g_object_unref (user);
g_free (locale);
}
static void static void
remove_timeout (gpointer data, remove_timeout (gpointer data,
GObject *where_the_object_was) GObject *where_the_object_was)
@ -129,6 +214,7 @@ finish_language_setup (gpointer user_data)
GtkWidget *parent; GtkWidget *parent;
GHashTable *user_langs; GHashTable *user_langs;
guint timeout; guint timeout;
GtkTreeSelection *selection;
/* Did we get called after the widget was destroyed? */ /* Did we get called after the widget was destroyed? */
if (list == NULL) if (list == NULL)
@ -149,6 +235,11 @@ finish_language_setup (gpointer user_data)
/* And select the current language */ /* And select the current language */
cc_common_language_select_current_language (GTK_TREE_VIEW (list)); cc_common_language_select_current_language (GTK_TREE_VIEW (list));
/* And now listen for changes */
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
g_signal_connect (G_OBJECT (selection), "changed",
G_CALLBACK (selection_changed), list);
return FALSE; return FALSE;
} }
@ -178,6 +269,8 @@ setup_language (GtkBuilder *builder)
if (proxy == NULL) { if (proxy == NULL) {
g_warning ("Failed to contact accounts service: %s", error->message); g_warning ("Failed to contact accounts service: %s", error->message);
g_error_free (error); g_error_free (error);
} else {
g_object_weak_ref (G_OBJECT (treeview), (GWeakNotify) g_object_unref, proxy);
} }
/* Add user languages */ /* Add user languages */