[gnome-control-center] region: Don't offer logout button if we revert the language
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] region: Don't offer logout button if we revert the language
- Date: Fri, 23 Nov 2012 17:53:01 +0000 (UTC)
commit 4099b547a7d6b4d19bda09f09af2bf83f5efa20e
Author: Bastien Nocera <hadess hadess net>
Date: Fri Nov 23 18:28:07 2012 +0100
region: Don't offer logout button if we revert the language
If the language selected is the language that was originally
the session language, don't offer to log out.
https://bugzilla.gnome.org/show_bug.cgi?id=647373
panels/region/gnome-region-panel-lang.c | 92 ++++++++++++++++++++++---------
1 files changed, 66 insertions(+), 26 deletions(-)
---
diff --git a/panels/region/gnome-region-panel-lang.c b/panels/region/gnome-region-panel-lang.c
index f63756f..2008f90 100644
--- a/panels/region/gnome-region-panel-lang.c
+++ b/panels/region/gnome-region-panel-lang.c
@@ -25,6 +25,7 @@
#include <string.h>
#include <glib/gi18n.h>
+#include <locale.h>
#include "gnome-region-panel-lang.h"
#include "gnome-region-panel-formats.h"
@@ -34,30 +35,16 @@
#include "gdm-languages.h"
static GDBusProxy *proxy = NULL;
+static GDBusProxy *sm_proxy = NULL;
static void
logout_requested (GtkButton *button,
gpointer user_data)
{
- GError *error;
- GDBusProxy *sm_proxy;
+ GError *error = NULL;
GVariant *res;
- error = NULL;
- sm_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_NONE,
- NULL,
- "org.gnome.SessionManager",
- "/org/gnome/SessionManager",
- "org.gnome.SessionManager",
- NULL,
- &error);
-
- if (sm_proxy == NULL) {
- g_warning ("Failed to contact gnome session service: %s", error->message);
- g_error_free (error);
- return;
- }
+ g_return_if_fail (sm_proxy != NULL);
res = g_dbus_proxy_call_sync (sm_proxy,
"Logout",
@@ -71,8 +58,39 @@ logout_requested (GtkButton *button,
g_error_free (error);
} else
g_variant_unref (res);
+}
+
+static gboolean
+is_old_locale (const char *new_locale)
+{
+ GError *error = NULL;
+ GVariant *variant;
+ char *old_locale;
+ gboolean ret = FALSE;
- g_object_unref (sm_proxy);
+ variant = g_dbus_proxy_call_sync (sm_proxy,
+ "GetLocale",
+ g_variant_new ("(i)", LC_MESSAGES),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (variant == NULL) {
+ g_warning ("Could not get current locale: %s", error->message);
+ g_error_free (error);
+ return FALSE;
+ }
+
+ g_variant_get (variant, "(s)", &old_locale);
+
+ g_debug ("Comparing locale '%s' (old) and '%s' (new)",
+ old_locale, new_locale);
+ if (g_strcmp0 (old_locale, new_locale) == 0)
+ ret = TRUE;
+
+ g_free (old_locale);
+
+ return ret;
}
static void
@@ -156,15 +174,21 @@ selection_changed (GtkTreeSelection *selection,
formats_update_language (builder, locale);
system_update_language (builder, locale);
- /* Offer log out in the new language */
+ /* Offer log out in the new language, unless it is
+ * the original session language */
widget = (GtkWidget *)gtk_builder_get_object (builder, "logout_button");
- old_lang = g_strdup (setlocale (LC_MESSAGES, NULL));
- setlocale (LC_MESSAGES, locale);
- gtk_button_set_label (GTK_BUTTON (widget), _("Log out for changes to take effect"));
- setlocale (LC_MESSAGES, old_lang);
- g_free (old_lang);
- gtk_widget_show (widget);
+ if (is_old_locale (locale) == FALSE) {
+ old_lang = g_strdup (setlocale (LC_MESSAGES, NULL));
+ setlocale (LC_MESSAGES, locale);
+ gtk_button_set_label (GTK_BUTTON (widget), _("Log out for changes to take effect"));
+ setlocale (LC_MESSAGES, old_lang);
+ g_free (old_lang);
+
+ gtk_widget_show (widget);
+ } else {
+ gtk_widget_hide (widget);
+ }
bail:
if (variant != NULL)
@@ -276,11 +300,27 @@ setup_language (GtkBuilder *builder)
if (proxy == NULL) {
g_warning ("Failed to contact accounts service: %s", error->message);
- g_error_free (error);
+ g_clear_error (&error);
} else {
g_object_weak_ref (G_OBJECT (treeview), (GWeakNotify) g_object_unref, proxy);
}
+ /* And the session proxy */
+ sm_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.gnome.SessionManager",
+ "/org/gnome/SessionManager",
+ "org.gnome.SessionManager",
+ NULL,
+ &error);
+ if (sm_proxy == NULL) {
+ g_warning ("Failed to contact accounts service: %s", error->message);
+ g_error_free (error);
+ } else {
+ g_object_weak_ref (G_OBJECT (treeview), (GWeakNotify) g_object_unref, sm_proxy);
+ }
+
/* Add user languages */
user_langs = cc_common_language_get_initial_languages ();
cc_common_language_setup_list (treeview, user_langs);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]