Drop old code
This commit is contained in:
parent
4f121592d7
commit
35d920f1b8
8 changed files with 0 additions and 2911 deletions
|
@ -1,390 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Rodrigo Moya
|
||||
*
|
||||
* Written by: Rodrigo Moya <rodrigo@gnome.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <glib/gi18n-lib.h>
|
||||
#include <locale.h>
|
||||
#include <langinfo.h>
|
||||
#include <stdlib.h>
|
||||
#define GNOME_DESKTOP_USE_UNSTABLE_API
|
||||
#include <libgnome-desktop/gnome-languages.h>
|
||||
|
||||
#include "cc-common-language.h"
|
||||
#include "cc-language-chooser.h"
|
||||
#include "gnome-region-panel-formats.h"
|
||||
|
||||
static void
|
||||
display_date (GtkLabel *label, GDateTime *dt, const gchar *format)
|
||||
{
|
||||
gchar *s;
|
||||
|
||||
s = g_date_time_format (dt, format);
|
||||
s = g_strstrip (s);
|
||||
gtk_label_set_text (label, s);
|
||||
g_free (s);
|
||||
}
|
||||
|
||||
static void
|
||||
select_region (GtkTreeView *treeview, const gchar *lang)
|
||||
{
|
||||
GtkTreeModel *model;
|
||||
GtkTreeSelection *selection;
|
||||
GtkTreeIter iter;
|
||||
GtkTreePath *path;
|
||||
gboolean cont;
|
||||
|
||||
model = gtk_tree_view_get_model (treeview);
|
||||
selection = gtk_tree_view_get_selection (treeview);
|
||||
cont = gtk_tree_model_get_iter_first (model, &iter);
|
||||
while (cont) {
|
||||
gchar *locale;
|
||||
|
||||
gtk_tree_model_get (model, &iter, 0, &locale, -1);
|
||||
if (g_strcmp0 (locale, lang) == 0) {
|
||||
gtk_tree_selection_select_iter (selection, &iter);
|
||||
path = gtk_tree_model_get_path (model, &iter);
|
||||
gtk_tree_view_scroll_to_cell (treeview, path, NULL, FALSE, 0.0, 0.0);
|
||||
gtk_tree_path_free (path);
|
||||
g_free (locale);
|
||||
break;
|
||||
}
|
||||
g_free (locale);
|
||||
|
||||
cont = gtk_tree_model_iter_next (model, &iter);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
update_examples_cb (GtkTreeSelection *selection, gpointer user_data)
|
||||
{
|
||||
GtkBuilder *builder = GTK_BUILDER (user_data);
|
||||
GtkTreeModel *model;
|
||||
GtkTreeIter iter;
|
||||
gchar *active_id;
|
||||
gchar *locale;
|
||||
GDateTime *dt;
|
||||
gchar *s;
|
||||
struct lconv *num_info;
|
||||
const char *fmt;
|
||||
|
||||
if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
|
||||
return;
|
||||
}
|
||||
gtk_tree_model_get (model, &iter, 0, &active_id, -1);
|
||||
|
||||
locale = g_strdup (setlocale (LC_TIME, NULL));
|
||||
setlocale (LC_TIME, active_id);
|
||||
|
||||
dt = g_date_time_new_now_local ();
|
||||
|
||||
/* Display dates */
|
||||
display_date (GTK_LABEL (gtk_builder_get_object (builder, "full_date_format")), dt, "%A %e %B %Y");
|
||||
display_date (GTK_LABEL (gtk_builder_get_object (builder, "full_day_format")), dt, "%e %B %Y");
|
||||
display_date (GTK_LABEL (gtk_builder_get_object (builder, "short_day_format")), dt, "%e %b %Y");
|
||||
display_date (GTK_LABEL (gtk_builder_get_object (builder, "shortest_day_format")), dt, "%x");
|
||||
|
||||
/* Display times */
|
||||
display_date (GTK_LABEL (gtk_builder_get_object (builder, "full_time_format")), dt, "%r %Z");
|
||||
display_date (GTK_LABEL (gtk_builder_get_object (builder, "short_time_format")), dt, "%X");
|
||||
|
||||
setlocale (LC_TIME, locale);
|
||||
g_free (locale);
|
||||
|
||||
/* Display numbers */
|
||||
locale = g_strdup (setlocale (LC_NUMERIC, NULL));
|
||||
setlocale (LC_NUMERIC, active_id);
|
||||
|
||||
s = g_strdup_printf ("%'.2f", 123456789.00);
|
||||
gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "numbers_format")), s);
|
||||
g_free (s);
|
||||
|
||||
setlocale (LC_NUMERIC, locale);
|
||||
g_free (locale);
|
||||
|
||||
/* Display currency */
|
||||
locale = g_strdup (setlocale (LC_MONETARY, NULL));
|
||||
setlocale (LC_MONETARY, active_id);
|
||||
|
||||
num_info = localeconv ();
|
||||
if (num_info != NULL) {
|
||||
gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "currency_format")), num_info->currency_symbol);
|
||||
}
|
||||
|
||||
setlocale (LC_MONETARY, locale);
|
||||
g_free (locale);
|
||||
|
||||
/* Display measurement */
|
||||
#ifdef LC_MEASUREMENT
|
||||
locale = g_strdup (setlocale (LC_MEASUREMENT, NULL));
|
||||
setlocale (LC_MEASUREMENT, active_id);
|
||||
|
||||
fmt = nl_langinfo (_NL_MEASUREMENT_MEASUREMENT);
|
||||
if (fmt && *fmt == 2)
|
||||
gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "measurement_format")), C_("measurement format", "Imperial"));
|
||||
else
|
||||
gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "measurement_format")), C_("measurement format", "Metric"));
|
||||
|
||||
setlocale (LC_MEASUREMENT, locale);
|
||||
g_free (locale);
|
||||
#endif
|
||||
g_free (active_id);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
update_settings_cb (GtkTreeSelection *selection, gpointer user_data)
|
||||
{
|
||||
GtkBuilder *builder = GTK_BUILDER (user_data);
|
||||
GtkTreeModel *model;
|
||||
GtkTreeIter iter;
|
||||
gchar *active_id;
|
||||
GtkWidget *treeview;
|
||||
GSettings *locale_settings;
|
||||
gchar *current_setting;
|
||||
|
||||
if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
|
||||
return;
|
||||
}
|
||||
gtk_tree_model_get (model, &iter, 0, &active_id, -1);
|
||||
|
||||
treeview = GTK_WIDGET (gtk_builder_get_object (builder, "region_selector"));
|
||||
|
||||
locale_settings = g_object_get_data (G_OBJECT (treeview), "settings");
|
||||
current_setting = g_settings_get_string (locale_settings, "region");
|
||||
|
||||
if (g_strcmp0 (active_id, current_setting) != 0) {
|
||||
g_settings_set_string (locale_settings, "region", active_id);
|
||||
}
|
||||
|
||||
g_free (current_setting);
|
||||
g_free (active_id);
|
||||
}
|
||||
|
||||
static void
|
||||
setting_changed_cb (GSettings *locale_settings, gchar *key, GtkTreeView *treeview)
|
||||
{
|
||||
gchar *current_setting;
|
||||
|
||||
current_setting = g_settings_get_string (locale_settings, "region");
|
||||
select_region (treeview, current_setting);
|
||||
g_free (current_setting);
|
||||
}
|
||||
|
||||
static gint
|
||||
sort_regions (GtkTreeModel *model,
|
||||
GtkTreeIter *a,
|
||||
GtkTreeIter *b,
|
||||
gpointer data)
|
||||
{
|
||||
gchar *la, *lb;
|
||||
gint result;
|
||||
|
||||
gtk_tree_model_get (model, a, 1, &la, -1);
|
||||
gtk_tree_model_get (model, b, 1, &lb, -1);
|
||||
|
||||
result = strcmp (la, lb);
|
||||
|
||||
g_free (la);
|
||||
g_free (lb);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
populate_regions (GtkBuilder *builder, const gchar *current_lang)
|
||||
{
|
||||
gchar *current_region;
|
||||
GSettings *locale_settings;
|
||||
GHashTable *ht;
|
||||
GHashTableIter htiter;
|
||||
GtkTreeModel *model;
|
||||
gchar *name, *language;
|
||||
GtkWidget *treeview;
|
||||
GtkTreeIter iter;
|
||||
GtkTreeSelection *selection;
|
||||
|
||||
treeview = GTK_WIDGET (gtk_builder_get_object (builder, "region_selector"));
|
||||
/* don't update the setting just because the list is repopulated */
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
|
||||
g_signal_handlers_block_by_func (selection, update_settings_cb, builder);
|
||||
|
||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
|
||||
locale_settings = g_object_get_data (G_OBJECT (treeview), "settings");
|
||||
|
||||
ht = cc_common_language_get_initial_regions (current_lang);
|
||||
|
||||
current_region = g_settings_get_string (locale_settings, "region");
|
||||
if (!current_region || !current_region[0]) {
|
||||
current_region = g_strdup (current_lang);
|
||||
}
|
||||
else if (!g_hash_table_lookup (ht, current_region)) {
|
||||
name = gnome_get_region_from_name (current_region, NULL);
|
||||
g_hash_table_insert (ht, g_strdup (current_region), name);
|
||||
}
|
||||
|
||||
gtk_list_store_clear (GTK_LIST_STORE (model));
|
||||
|
||||
g_hash_table_iter_init (&htiter, ht);
|
||||
while (g_hash_table_iter_next (&htiter, (gpointer *)&name, (gpointer *)&language)) {
|
||||
gtk_list_store_append (GTK_LIST_STORE (model), &iter);
|
||||
gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, name, 1, language, -1);
|
||||
}
|
||||
g_hash_table_unref (ht);
|
||||
|
||||
select_region (GTK_TREE_VIEW (treeview), current_region);
|
||||
|
||||
g_free (current_region);
|
||||
|
||||
g_signal_handlers_unblock_by_func (selection, update_settings_cb, builder);
|
||||
}
|
||||
|
||||
static void
|
||||
region_response (GtkDialog *dialog,
|
||||
gint response_id,
|
||||
GtkWidget *treeview)
|
||||
{
|
||||
gchar *lang;
|
||||
GtkTreeModel *model;
|
||||
GtkTreeSelection *selection;
|
||||
GtkTreeIter iter;
|
||||
|
||||
gtk_widget_hide (GTK_WIDGET (dialog));
|
||||
|
||||
if (response_id != GTK_RESPONSE_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
lang = cc_language_chooser_get_language (GTK_WIDGET (dialog));
|
||||
|
||||
if (lang == NULL) {
|
||||
return;
|
||||
}
|
||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
|
||||
|
||||
if (cc_common_language_get_iter_for_region (model, lang, &iter)) {
|
||||
gtk_tree_selection_select_iter (selection, &iter);
|
||||
}
|
||||
|
||||
gtk_widget_grab_focus (treeview);
|
||||
|
||||
g_free (lang);
|
||||
}
|
||||
|
||||
static void
|
||||
add_region (GtkWidget *button, GtkWidget *treeview)
|
||||
{
|
||||
GtkWidget *toplevel;
|
||||
GtkWidget *chooser;
|
||||
|
||||
toplevel = gtk_widget_get_toplevel (button);
|
||||
chooser = g_object_get_data (G_OBJECT (button), "chooser");
|
||||
if (chooser == NULL) {
|
||||
chooser = cc_language_chooser_new (toplevel, TRUE);
|
||||
|
||||
g_signal_connect (chooser, "response",
|
||||
G_CALLBACK (region_response), treeview);
|
||||
g_signal_connect (chooser, "delete-event",
|
||||
G_CALLBACK (gtk_widget_hide_on_delete), NULL);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (button), "chooser",
|
||||
chooser, (GDestroyNotify)gtk_widget_destroy);
|
||||
}
|
||||
else {
|
||||
cc_language_chooser_clear_filter (chooser);
|
||||
}
|
||||
|
||||
gdk_window_set_cursor (gtk_widget_get_window (toplevel), NULL);
|
||||
gtk_window_present (GTK_WINDOW (chooser));
|
||||
}
|
||||
|
||||
void
|
||||
setup_formats (GtkBuilder *builder)
|
||||
{
|
||||
GtkWidget *treeview;
|
||||
gchar *current_lang;
|
||||
GtkTreeModel *model;
|
||||
GtkCellRenderer *cell;
|
||||
GtkTreeViewColumn *column;
|
||||
GtkWidget *widget;
|
||||
GtkStyleContext *context;
|
||||
GSettings *locale_settings;
|
||||
GtkTreeSelection *selection;
|
||||
|
||||
locale_settings = g_settings_new ("org.gnome.system.locale");
|
||||
|
||||
/* Setup junction between toolbar and treeview */
|
||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "region-swindow");
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
|
||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "region-toolbar");
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
|
||||
|
||||
/* Setup formats selector */
|
||||
treeview = GTK_WIDGET (gtk_builder_get_object (builder, "region_selector"));
|
||||
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", 1, NULL);
|
||||
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
|
||||
|
||||
model = (GtkTreeModel*)gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
|
||||
gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (model),
|
||||
sort_regions, NULL, NULL);
|
||||
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
|
||||
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
|
||||
GTK_SORT_ASCENDING);
|
||||
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), model);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (treeview), "settings", locale_settings, g_object_unref);
|
||||
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
|
||||
g_signal_connect (selection, "changed",
|
||||
G_CALLBACK (update_settings_cb), builder);
|
||||
g_signal_connect (selection, "changed",
|
||||
G_CALLBACK (update_examples_cb), builder);
|
||||
|
||||
/* Connect buttons */
|
||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "region_add");
|
||||
g_signal_connect (widget, "clicked",
|
||||
G_CALLBACK (add_region), treeview);
|
||||
|
||||
current_lang = cc_common_language_get_current_language ();
|
||||
populate_regions (builder, current_lang);
|
||||
g_free (current_lang);
|
||||
|
||||
g_signal_connect (locale_settings, "changed::region",
|
||||
G_CALLBACK (setting_changed_cb), treeview);
|
||||
}
|
||||
|
||||
void
|
||||
formats_update_language (GtkBuilder *builder,
|
||||
const gchar *language)
|
||||
{
|
||||
populate_regions (builder, language);
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Rodrigo Moya
|
||||
*
|
||||
* Written by: Rodrigo Moya <rodrigo@gnome.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __GNOME_REGION_PANEL_FORMATS_H
|
||||
#define __GNOME_REGION_PANEL_FORMATS_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
void setup_formats (GtkBuilder *builder);
|
||||
void formats_update_language (GtkBuilder *builder,
|
||||
const gchar *language);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load diff
|
@ -1,36 +0,0 @@
|
|||
/* gnome-region-panel-input.h
|
||||
* Copyright (C) 2011 Red Hat, Inc.
|
||||
*
|
||||
* Written by Matthias Clasen
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __GNOME_KEYBOARD_PROPERTY_INPUT_H
|
||||
#define __GNOME_KEYBOARD_PROPERTY_INPUT_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "cc-region-panel.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void setup_input_tabs (GtkBuilder *builder,
|
||||
CcRegionPanel *self);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GNOME_KEYBOARD_PROPERTY_INPUT_H */
|
|
@ -1,363 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2010 Bastien Nocera
|
||||
*
|
||||
* Written by: Bastien Nocera <hadess@hadess.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <locale.h>
|
||||
|
||||
#include "gnome-region-panel-lang.h"
|
||||
#include "gnome-region-panel-formats.h"
|
||||
#include "gnome-region-panel-system.h"
|
||||
#include "cc-common-language.h"
|
||||
#include "cc-language-chooser.h"
|
||||
|
||||
static GDBusProxy *proxy = NULL;
|
||||
static GDBusProxy *sm_proxy = NULL;
|
||||
static char *old_locale = NULL;
|
||||
|
||||
static void
|
||||
logout_requested (GtkButton *button,
|
||||
gpointer user_data)
|
||||
{
|
||||
GError *error = NULL;
|
||||
GVariant *res;
|
||||
|
||||
g_return_if_fail (sm_proxy != NULL);
|
||||
|
||||
res = g_dbus_proxy_call_sync (sm_proxy,
|
||||
"Logout",
|
||||
g_variant_new ("(u)", 0),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1,
|
||||
NULL,
|
||||
&error);
|
||||
if (res == NULL) {
|
||||
g_warning ("Logout failed: %s", error->message);
|
||||
g_error_free (error);
|
||||
} else
|
||||
g_variant_unref (res);
|
||||
}
|
||||
|
||||
static void
|
||||
set_old_locale (void)
|
||||
{
|
||||
GError *error = NULL;
|
||||
GVariant *variant;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
g_variant_get (variant, "(s)", &old_locale);
|
||||
|
||||
g_variant_unref (variant);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_old_locale (const char *new_locale)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
|
||||
g_debug ("Comparing locale '%s' (old) and '%s' (new)",
|
||||
old_locale, new_locale);
|
||||
if (g_strcmp0 (old_locale, new_locale) == 0)
|
||||
ret = TRUE;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
update_logout_button (GtkBuilder *builder,
|
||||
const char *locale)
|
||||
{
|
||||
GtkWidget *button, *notebook;
|
||||
char *old_lang;
|
||||
|
||||
/* Offer log out in the new language, unless it is
|
||||
* the original session language */
|
||||
button = (GtkWidget *)gtk_builder_get_object (builder, "logout_button");
|
||||
notebook = (GtkWidget *)gtk_builder_get_object (builder, "logout_notebook");
|
||||
|
||||
if (is_old_locale (locale) == FALSE) {
|
||||
old_lang = g_strdup (setlocale (LC_MESSAGES, NULL));
|
||||
setlocale (LC_MESSAGES, locale);
|
||||
gtk_button_set_label (GTK_BUTTON (button), _("Log out for changes to take effect"));
|
||||
setlocale (LC_MESSAGES, old_lang);
|
||||
g_free (old_lang);
|
||||
|
||||
gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), 1);
|
||||
} else {
|
||||
gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), 0);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
update_logout_button (builder, locale);
|
||||
|
||||
bail:
|
||||
if (variant != NULL)
|
||||
g_variant_unref (variant);
|
||||
if (user != NULL)
|
||||
g_object_unref (user);
|
||||
g_free (locale);
|
||||
}
|
||||
|
||||
static void
|
||||
language_response (GtkDialog *dialog,
|
||||
gint response_id,
|
||||
GtkWidget *treeview)
|
||||
{
|
||||
gchar *lang;
|
||||
GtkTreeModel *model;
|
||||
GtkTreeSelection *selection;
|
||||
GtkTreeIter iter;
|
||||
|
||||
gtk_widget_hide (GTK_WIDGET (dialog));
|
||||
|
||||
if (response_id != GTK_RESPONSE_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
lang = cc_language_chooser_get_language (GTK_WIDGET (dialog));
|
||||
|
||||
if (lang == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
|
||||
|
||||
if (cc_common_language_get_iter_for_language (model, lang, &iter)) {
|
||||
gtk_tree_selection_select_iter (selection, &iter);
|
||||
}
|
||||
|
||||
gtk_widget_grab_focus (treeview);
|
||||
|
||||
g_free (lang);
|
||||
}
|
||||
|
||||
static void
|
||||
add_language (GtkWidget *button, GtkWidget *treeview)
|
||||
{
|
||||
GtkWidget *toplevel;
|
||||
GtkWidget *chooser;
|
||||
|
||||
toplevel = gtk_widget_get_toplevel (button);
|
||||
chooser = g_object_get_data (G_OBJECT (button), "chooser");
|
||||
if (chooser == NULL) {
|
||||
chooser = cc_language_chooser_new (toplevel, FALSE);
|
||||
|
||||
g_signal_connect (chooser, "response",
|
||||
G_CALLBACK (language_response), treeview);
|
||||
g_signal_connect (chooser, "delete-event",
|
||||
G_CALLBACK (gtk_widget_hide_on_delete), NULL);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (button), "chooser",
|
||||
chooser, (GDestroyNotify)gtk_widget_destroy);
|
||||
}
|
||||
else {
|
||||
cc_language_chooser_clear_filter (chooser);
|
||||
}
|
||||
|
||||
gdk_window_set_cursor (gtk_widget_get_window (toplevel), NULL);
|
||||
gtk_window_present (GTK_WINDOW (chooser));
|
||||
}
|
||||
|
||||
void
|
||||
setup_language (GtkBuilder *builder)
|
||||
{
|
||||
GtkWidget *treeview;
|
||||
GHashTable *user_langs, *popular_langs;
|
||||
GError *error = NULL;
|
||||
GtkWidget *widget;
|
||||
GtkStyleContext *context;
|
||||
GtkTreeSelection *selection;
|
||||
char *locale;
|
||||
|
||||
/* Setup junction between toolbar and treeview */
|
||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "language-swindow");
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
|
||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "language-toolbar");
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
|
||||
|
||||
treeview = GTK_WIDGET (gtk_builder_get_object (builder, "display_language_treeview"));
|
||||
|
||||
/* Connect buttons */
|
||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "language_add");
|
||||
g_signal_connect (widget, "clicked",
|
||||
G_CALLBACK (add_language), treeview);
|
||||
|
||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "logout_button");
|
||||
g_signal_connect (widget, "clicked",
|
||||
G_CALLBACK (logout_requested), NULL);
|
||||
|
||||
/* Setup accounts service */
|
||||
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,
|
||||
&error);
|
||||
|
||||
if (proxy == NULL) {
|
||||
g_warning ("Failed to contact accounts service: %s", error->message);
|
||||
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);
|
||||
set_old_locale ();
|
||||
g_object_weak_ref (G_OBJECT (treeview), (GWeakNotify) g_free, old_locale);
|
||||
}
|
||||
|
||||
/* Add user languages */
|
||||
user_langs = cc_common_language_get_user_languages ();
|
||||
popular_langs = cc_common_language_get_initial_languages ();
|
||||
cc_common_language_setup_list (treeview, user_langs, popular_langs);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (treeview), "user-langs",
|
||||
user_langs, (GDestroyNotify) g_hash_table_destroy);
|
||||
g_object_set_data_full (G_OBJECT (treeview), "popular-langs",
|
||||
popular_langs, (GDestroyNotify) g_hash_table_destroy);
|
||||
|
||||
/* And select the current language */
|
||||
cc_common_language_select_current_language (GTK_TREE_VIEW (treeview));
|
||||
|
||||
/* Show the logout button if necessary */
|
||||
locale = cc_common_language_get_current_language ();
|
||||
update_logout_button (builder, locale);
|
||||
|
||||
/* And now listen for changes */
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
|
||||
g_signal_connect (G_OBJECT (selection), "changed",
|
||||
G_CALLBACK (selection_changed), builder);
|
||||
|
||||
gtk_widget_grab_focus (treeview);
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2010 Bastien Nocera
|
||||
*
|
||||
* Written by: Bastien Nocera <hadess@hadess.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __GNOME_KEYBOARD_PROPERTY_LANG_H
|
||||
#define __GNOME_KEYBOARD_PROPERTY_LANG_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void setup_language (GtkBuilder *builder);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* __GNOME_KEYBOARD_PROPERTY_LANG_H */
|
|
@ -1,547 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Rodrigo Moya
|
||||
*
|
||||
* Written by: Rodrigo Moya <rodrigo@gnome.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <polkit/polkit.h>
|
||||
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
#define GNOME_DESKTOP_USE_UNSTABLE_API
|
||||
#include <libgnome-desktop/gnome-languages.h>
|
||||
#include <libgnome-desktop/gnome-xkb-info.h>
|
||||
|
||||
#include "cc-common-language.h"
|
||||
#include "gnome-region-panel-system.h"
|
||||
|
||||
#define WID(s) GTK_WIDGET(gtk_builder_get_object (dialog, s))
|
||||
|
||||
static GSettings *locale_settings, *input_sources_settings;
|
||||
static GDBusProxy *localed_proxy;
|
||||
static GPermission *localed_permission;
|
||||
|
||||
static void
|
||||
update_copy_button (GtkBuilder *dialog)
|
||||
{
|
||||
GtkWidget *label;
|
||||
GtkWidget *button;
|
||||
const gchar *user_lang, *system_lang;
|
||||
const gchar *user_region, *system_region;
|
||||
const gchar *user_input_source, *system_input_source;
|
||||
const gchar *user_input_variants, *system_input_variants;
|
||||
gboolean layouts_differ;
|
||||
|
||||
label = WID ("user_display_language");
|
||||
user_lang = g_object_get_data (G_OBJECT (label), "language");
|
||||
|
||||
label = WID ("system_display_language");
|
||||
system_lang = g_object_get_data (G_OBJECT (label), "language");
|
||||
|
||||
label = WID ("user_format");
|
||||
user_region = g_object_get_data (G_OBJECT (label), "region");
|
||||
|
||||
label = WID ("system_format");
|
||||
system_region = g_object_get_data (G_OBJECT (label), "region");
|
||||
|
||||
label = WID ("user_input_source");
|
||||
user_input_source = g_object_get_data (G_OBJECT (label), "input_source");
|
||||
user_input_variants = g_object_get_data (G_OBJECT (label), "input_variants");
|
||||
|
||||
label = WID ("system_input_source");
|
||||
system_input_source = g_object_get_data (G_OBJECT (label), "input_source");
|
||||
system_input_variants = g_object_get_data (G_OBJECT (label), "input_variants");
|
||||
|
||||
button = WID ("copy_settings_button");
|
||||
|
||||
if (user_input_source && user_input_source[0]) {
|
||||
layouts_differ = (g_strcmp0 (user_input_source, system_input_source) != 0);
|
||||
if (layouts_differ == FALSE)
|
||||
layouts_differ = (g_strcmp0 (user_input_variants, system_input_variants) != 0);
|
||||
} else {
|
||||
/* Nothing to copy */
|
||||
layouts_differ = FALSE;
|
||||
}
|
||||
|
||||
if (g_strcmp0 (user_lang, system_lang) == 0 &&
|
||||
g_strcmp0 (user_region, system_region) == 0 &&
|
||||
!layouts_differ)
|
||||
gtk_widget_set_sensitive (button, FALSE);
|
||||
else
|
||||
gtk_widget_set_sensitive (button, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
locale_settings_changed (GSettings *settings,
|
||||
const gchar *key,
|
||||
GtkBuilder *dialog)
|
||||
{
|
||||
GtkWidget *label;
|
||||
gchar *region, *display_region;
|
||||
|
||||
region = g_settings_get_string (locale_settings, "region");
|
||||
if (!region || !region[0]) {
|
||||
label = WID ("user_display_language");
|
||||
region = g_strdup ((gchar*)g_object_get_data (G_OBJECT (label), "language"));
|
||||
}
|
||||
|
||||
display_region = gnome_get_region_from_name (region, NULL);
|
||||
label = WID ("user_format");
|
||||
gtk_label_set_text (GTK_LABEL (label), display_region);
|
||||
g_object_set_data_full (G_OBJECT (label), "region", g_strdup (region), g_free);
|
||||
g_free (region);
|
||||
g_free (display_region);
|
||||
|
||||
update_copy_button (dialog);
|
||||
}
|
||||
|
||||
void
|
||||
system_update_language (GtkBuilder *dialog, const gchar *language)
|
||||
{
|
||||
gchar *display_language;
|
||||
GtkWidget *label;
|
||||
|
||||
display_language = gnome_get_language_from_name (language, NULL);
|
||||
label = WID ("user_display_language");
|
||||
gtk_label_set_text (GTK_LABEL (label), display_language);
|
||||
g_object_set_data_full (G_OBJECT (label), "language", g_strdup (language), g_free);
|
||||
g_free (display_language);
|
||||
|
||||
/* need to update the region display in case the setting is '' */
|
||||
locale_settings_changed (locale_settings, "region", dialog);
|
||||
|
||||
update_copy_button (dialog);
|
||||
}
|
||||
|
||||
static void
|
||||
input_sources_changed (GSettings *settings,
|
||||
const gchar *key,
|
||||
GtkBuilder *dialog)
|
||||
{
|
||||
GString *disp, *list, *variants;
|
||||
GtkWidget *label;
|
||||
GnomeXkbInfo *xkb_info;
|
||||
GVariantIter iter;
|
||||
GVariant *sources;
|
||||
const gchar *type;
|
||||
const gchar *id;
|
||||
|
||||
sources = g_settings_get_value (input_sources_settings, "sources");
|
||||
xkb_info = gnome_xkb_info_new ();
|
||||
|
||||
label = WID ("user_input_source");
|
||||
disp = g_string_new ("");
|
||||
list = g_string_new ("");
|
||||
variants = g_string_new ("");
|
||||
|
||||
g_variant_iter_init (&iter, sources);
|
||||
while (g_variant_iter_next (&iter, "(&s&s)", &type, &id)) {
|
||||
/* We can't copy non-XKB layouts to the system yet */
|
||||
if (g_str_equal (type, "xkb")) {
|
||||
char **split;
|
||||
gchar *layout, *variant;
|
||||
const char *name;
|
||||
|
||||
gnome_xkb_info_get_layout_info (xkb_info, id, &name, NULL, NULL, NULL);
|
||||
if (disp->str[0] != '\0')
|
||||
g_string_append (disp, ", ");
|
||||
g_string_append (disp, name);
|
||||
|
||||
split = g_strsplit (id, "+", 2);
|
||||
|
||||
if (split == NULL || split[0] == NULL)
|
||||
continue;
|
||||
|
||||
layout = split[0];
|
||||
variant = split[1];
|
||||
|
||||
if (list->str[0] != '\0') {
|
||||
g_string_append (list, ",");
|
||||
g_string_append (variants, ",");
|
||||
}
|
||||
g_string_append (list, layout);
|
||||
g_string_append (variants, variant ? variant : "");
|
||||
|
||||
g_strfreev (split);
|
||||
}
|
||||
}
|
||||
g_variant_unref (sources);
|
||||
g_object_unref (xkb_info);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (label), "input_source", g_string_free (list, FALSE), g_free);
|
||||
g_object_set_data_full (G_OBJECT (label), "input_variants", g_string_free (variants, FALSE), g_free);
|
||||
|
||||
gtk_label_set_text (GTK_LABEL (label), disp->str);
|
||||
g_string_free (disp, TRUE);
|
||||
|
||||
update_copy_button (dialog);
|
||||
}
|
||||
|
||||
static void
|
||||
update_property (GDBusProxy *proxy,
|
||||
const char *property)
|
||||
{
|
||||
GError *error = NULL;
|
||||
GVariant *variant;
|
||||
|
||||
/* Work around systemd-localed not sending us back
|
||||
* the property value when changing values */
|
||||
variant = g_dbus_proxy_call_sync (proxy,
|
||||
"org.freedesktop.DBus.Properties.Get",
|
||||
g_variant_new ("(ss)", "org.freedesktop.locale1", property),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1,
|
||||
NULL,
|
||||
&error);
|
||||
if (variant == NULL) {
|
||||
g_warning ("Failed to get property '%s': %s", property, error->message);
|
||||
g_error_free (error);
|
||||
} else {
|
||||
GVariant *v;
|
||||
|
||||
g_variant_get (variant, "(v)", &v);
|
||||
g_dbus_proxy_set_cached_property (proxy, property, v);
|
||||
g_variant_unref (variant);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
on_localed_properties_changed (GDBusProxy *proxy,
|
||||
GVariant *changed_properties,
|
||||
const gchar **invalidated_properties,
|
||||
GtkBuilder *dialog)
|
||||
{
|
||||
GVariant *v, *w;
|
||||
GtkWidget *label;
|
||||
GnomeXkbInfo *xkb_info;
|
||||
char **layouts;
|
||||
char **variants;
|
||||
GString *disp;
|
||||
guint i, n;
|
||||
|
||||
if (invalidated_properties != NULL) {
|
||||
guint i;
|
||||
for (i = 0; invalidated_properties[i] != NULL; i++) {
|
||||
if (g_str_equal (invalidated_properties[i], "Locale"))
|
||||
update_property (proxy, "Locale");
|
||||
else if (g_str_equal (invalidated_properties[i], "X11Layout"))
|
||||
update_property (proxy, "X11Layout");
|
||||
else if (g_str_equal (invalidated_properties[i], "X11Variant"))
|
||||
update_property (proxy, "X11Variant");
|
||||
}
|
||||
}
|
||||
|
||||
v = g_dbus_proxy_get_cached_property (proxy, "Locale");
|
||||
if (v) {
|
||||
const gchar **strv;
|
||||
gsize len;
|
||||
gint i;
|
||||
const gchar *lang, *messages, *time;
|
||||
gchar *name;
|
||||
GtkWidget *label;
|
||||
|
||||
strv = g_variant_get_strv (v, &len);
|
||||
|
||||
lang = messages = time = NULL;
|
||||
for (i = 0; strv[i]; i++) {
|
||||
if (g_str_has_prefix (strv[i], "LANG=")) {
|
||||
lang = strv[i] + strlen ("LANG=");
|
||||
}
|
||||
else if (g_str_has_prefix (strv[i], "LC_MESSAGES=")) {
|
||||
messages = strv[i] + strlen ("LC_MESSAGES=");
|
||||
}
|
||||
else if (g_str_has_prefix (strv[i], "LC_TIME=")) {
|
||||
time = strv[i] + strlen ("LC_TIME=");
|
||||
}
|
||||
}
|
||||
if (!messages) {
|
||||
messages = lang;
|
||||
}
|
||||
if (!time) {
|
||||
time = lang;
|
||||
}
|
||||
|
||||
if (messages) {
|
||||
name = gnome_get_language_from_name (messages, NULL);
|
||||
label = WID ("system_display_language");
|
||||
gtk_label_set_text (GTK_LABEL (label), name);
|
||||
g_free (name);
|
||||
g_object_set_data_full (G_OBJECT (label), "language", g_strdup (lang), g_free);
|
||||
}
|
||||
|
||||
if (time) {
|
||||
name = gnome_get_region_from_name (time, NULL);
|
||||
label = WID ("system_format");
|
||||
gtk_label_set_text (GTK_LABEL (label), name);
|
||||
g_free (name);
|
||||
g_object_set_data_full (G_OBJECT (label), "region", g_strdup (time), g_free);
|
||||
}
|
||||
g_variant_unref (v);
|
||||
}
|
||||
|
||||
label = WID ("system_input_source");
|
||||
v = g_dbus_proxy_get_cached_property (proxy, "X11Layout");
|
||||
if (v) {
|
||||
layouts = g_strsplit (g_variant_get_string (v, NULL), ",", -1);
|
||||
g_object_set_data_full (G_OBJECT (label), "input_source",
|
||||
g_variant_dup_string (v, NULL), g_free);
|
||||
g_variant_unref (v);
|
||||
} else {
|
||||
g_object_set_data_full (G_OBJECT (label), "input_source", NULL, g_free);
|
||||
update_copy_button (dialog);
|
||||
return;
|
||||
}
|
||||
|
||||
variants = NULL;
|
||||
g_object_set_data_full (G_OBJECT (label), "input_variants", NULL, g_free);
|
||||
|
||||
w = g_dbus_proxy_get_cached_property (proxy, "X11Variant");
|
||||
if (w) {
|
||||
const char *variants_str;
|
||||
|
||||
variants_str = g_variant_get_string (w, NULL);
|
||||
g_debug ("Got variants '%s'", variants_str);
|
||||
if (variants_str && *variants_str != '\0') {
|
||||
variants = g_strsplit (variants_str, ",", -1);
|
||||
g_object_set_data_full (G_OBJECT (label), "input_variants",
|
||||
g_strdup (variants_str), g_free);
|
||||
}
|
||||
g_variant_unref (w);
|
||||
}
|
||||
|
||||
if (variants && variants[0])
|
||||
n = MIN (g_strv_length (layouts), g_strv_length (variants));
|
||||
else
|
||||
n = g_strv_length (layouts);
|
||||
|
||||
xkb_info = gnome_xkb_info_new ();
|
||||
disp = g_string_new ("");
|
||||
for (i = 0; i < n && layouts[i][0]; i++) {
|
||||
const char *name;
|
||||
char *id;
|
||||
|
||||
if (variants && variants[i] && variants[i][0])
|
||||
id = g_strdup_printf ("%s+%s", layouts[i], variants[i]);
|
||||
else
|
||||
id = g_strdup (layouts[i]);
|
||||
|
||||
gnome_xkb_info_get_layout_info (xkb_info, id, &name, NULL, NULL, NULL);
|
||||
if (disp->str[0] != '\0')
|
||||
disp = g_string_append (disp, ", ");
|
||||
disp = g_string_append (disp, name ? name : id);
|
||||
|
||||
g_free (id);
|
||||
}
|
||||
gtk_label_set_text (GTK_LABEL (label), disp->str);
|
||||
g_string_free (disp, TRUE);
|
||||
|
||||
g_strfreev (variants);
|
||||
g_strfreev (layouts);
|
||||
g_object_unref (xkb_info);
|
||||
|
||||
update_copy_button (dialog);
|
||||
}
|
||||
|
||||
static void
|
||||
localed_proxy_ready (GObject *source,
|
||||
GAsyncResult *res,
|
||||
GtkBuilder *dialog)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
localed_proxy = g_dbus_proxy_new_finish (res, &error);
|
||||
|
||||
if (!localed_proxy) {
|
||||
g_warning ("Failed to contact localed: %s\n", error->message);
|
||||
g_error_free (error);
|
||||
return;
|
||||
}
|
||||
|
||||
g_object_weak_ref (G_OBJECT (dialog), (GWeakNotify) g_object_unref, localed_proxy);
|
||||
|
||||
g_signal_connect (localed_proxy, "g-properties-changed",
|
||||
G_CALLBACK (on_localed_properties_changed), dialog);
|
||||
|
||||
on_localed_properties_changed (localed_proxy, NULL, NULL, dialog);
|
||||
}
|
||||
|
||||
static void
|
||||
copy_settings (GtkButton *button, GtkBuilder *dialog)
|
||||
{
|
||||
const gchar *language;
|
||||
const gchar *region;
|
||||
const gchar *layout;
|
||||
const gchar *variants;
|
||||
GtkWidget *label;
|
||||
GVariantBuilder *b;
|
||||
gchar *s;
|
||||
|
||||
label = WID ("user_display_language");
|
||||
language = g_object_get_data (G_OBJECT (label), "language");
|
||||
label = WID ("user_format");
|
||||
region = g_object_get_data (G_OBJECT (label), "region");
|
||||
|
||||
b = g_variant_builder_new (G_VARIANT_TYPE ("as"));
|
||||
s = g_strconcat ("LANG=", language, NULL);
|
||||
g_variant_builder_add (b, "s", s);
|
||||
g_free (s);
|
||||
if (g_strcmp0 (language, region) != 0) {
|
||||
s = g_strconcat ("LC_TIME=", region, NULL);
|
||||
g_variant_builder_add (b, "s", s);
|
||||
g_free (s);
|
||||
s = g_strconcat ("LC_NUMERIC=", region, NULL);
|
||||
g_variant_builder_add (b, "s", s);
|
||||
g_free (s);
|
||||
s = g_strconcat ("LC_MONETARY=", region, NULL);
|
||||
g_variant_builder_add (b, "s", s);
|
||||
g_free (s);
|
||||
s = g_strconcat ("LC_MEASUREMENT=", region, NULL);
|
||||
g_variant_builder_add (b, "s", s);
|
||||
g_free (s);
|
||||
}
|
||||
|
||||
g_dbus_proxy_call (localed_proxy,
|
||||
"SetLocale",
|
||||
g_variant_new ("(asb)", b, TRUE),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1, NULL, NULL, NULL);
|
||||
g_variant_builder_unref (b);
|
||||
|
||||
label = WID ("user_input_source");
|
||||
layout = g_object_get_data (G_OBJECT (label), "input_source");
|
||||
variants = g_object_get_data (G_OBJECT (label), "input_variants");
|
||||
|
||||
if (layout == NULL || layout[0] == '\0') {
|
||||
g_debug ("Not calling SetX11Keyboard, as there are no XKB input sources in the user's settings");
|
||||
return;
|
||||
}
|
||||
|
||||
g_dbus_proxy_call (localed_proxy,
|
||||
"SetX11Keyboard",
|
||||
g_variant_new ("(ssssbb)", layout, "", variants ? variants : "", "", TRUE, TRUE),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
on_permission_changed (GPermission *permission,
|
||||
GParamSpec *pspec,
|
||||
GtkBuilder *dialog)
|
||||
{
|
||||
GtkWidget *button;
|
||||
GtkWidget *label;
|
||||
gboolean can_acquire;
|
||||
gboolean allowed;
|
||||
|
||||
if (permission) {
|
||||
can_acquire = g_permission_get_can_acquire (permission);
|
||||
allowed = g_permission_get_allowed (permission);
|
||||
}
|
||||
else {
|
||||
can_acquire = FALSE;
|
||||
allowed = FALSE;
|
||||
}
|
||||
|
||||
button = WID ("copy_settings_button");
|
||||
label = WID ("system-title");
|
||||
|
||||
if (!allowed && !can_acquire) {
|
||||
gtk_label_set_text (GTK_LABEL (label),
|
||||
_("The login screen, system accounts and new user accounts use the system-wide Region and Language settings."));
|
||||
gtk_widget_hide (button);
|
||||
}
|
||||
else {
|
||||
gtk_label_set_text (GTK_LABEL (label),
|
||||
_("The login screen, system accounts and new user accounts use the system-wide Region and Language settings. You may change the system settings to match yours."));
|
||||
gtk_widget_show (button);
|
||||
if (allowed) {
|
||||
gtk_button_set_label (GTK_BUTTON (button), _("Copy Settings"));
|
||||
}
|
||||
else {
|
||||
gtk_button_set_label (GTK_BUTTON (button), _("Copy Settings…"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
input_sources_settings = g_settings_new ("org.gnome.desktop.input-sources");
|
||||
g_signal_connect (input_sources_settings, "changed::sources",
|
||||
G_CALLBACK (input_sources_changed), dialog);
|
||||
g_object_weak_ref (G_OBJECT (dialog), (GWeakNotify) g_object_unref, input_sources_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);
|
||||
|
||||
input_sources_changed (input_sources_settings, "sources", 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);
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Rodrigo Moya
|
||||
*
|
||||
* Written by: Rodrigo Moya <rodrigo@gnome.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __GNOME_REGION_PANEL_SYSTEM_H
|
||||
#define __GNOME_REGION_PANEL_SYSTEM_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
void setup_system (GtkBuilder *builder);
|
||||
void system_update_language (GtkBuilder *builder,
|
||||
const gchar *language);
|
||||
|
||||
#endif
|
Loading…
Add table
Reference in a new issue