static void selection_changed (GtkTreeSelection *selection, GtkBuilder *builder) { 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; } /* Update the other tabs */ formats_update_language (builder, locale); system_update_language (builder, locale); /* And done */ bail: if (variant != NULL) g_variant_unref (variant); if (user != NULL) g_object_unref (user); g_free (locale); }
void setup_system (GtkBuilder *dialog) { gchar *language; GDBusConnection *bus; GtkWidget *button; localed_permission = polkit_permission_new_sync ("org.freedesktop.locale1.set-locale", NULL, NULL, NULL); if (localed_permission == NULL) { GtkWidget *tab_widget, *notebook; int num; tab_widget = WID ("table3"); notebook = WID ("region_notebook"); num = gtk_notebook_page_num (GTK_NOTEBOOK (notebook), tab_widget); gtk_notebook_remove_page (GTK_NOTEBOOK (notebook), num); return; } g_object_weak_ref (G_OBJECT (dialog), (GWeakNotify) g_object_unref, localed_permission); g_signal_connect (localed_permission, "notify", G_CALLBACK (on_permission_changed), dialog); on_permission_changed (localed_permission, NULL, dialog); button = WID ("copy_settings_button"); g_signal_connect (button, "clicked", G_CALLBACK (copy_settings), dialog); locale_settings = g_settings_new ("org.gnome.system.locale"); g_signal_connect (locale_settings, "changed::region", G_CALLBACK (locale_settings_changed), dialog); g_object_weak_ref (G_OBJECT (dialog), (GWeakNotify) g_object_unref, locale_settings); xkb_settings = g_settings_new (GKBD_KEYBOARD_SCHEMA); g_signal_connect (xkb_settings, "changed::layouts", G_CALLBACK (xkb_settings_changed), dialog); g_object_weak_ref (G_OBJECT (dialog), (GWeakNotify) g_object_unref, xkb_settings); /* Display user settings */ language = cc_common_language_get_current_language (); system_update_language (dialog, language); g_free (language); locale_settings_changed (locale_settings, "region", dialog); xkb_settings_changed (xkb_settings, "layouts", dialog); bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL); g_dbus_proxy_new (bus, G_DBUS_PROXY_FLAGS_NONE, NULL, "org.freedesktop.locale1", "/org/freedesktop/locale1", "org.freedesktop.locale1", NULL, (GAsyncReadyCallback) localed_proxy_ready, dialog); g_object_unref (bus); }