2
* Copyright (C) 2010 Bastien Nocera
4
* Written by: Bastien Nocera <hadess@hadess.net>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2, or (at your option)
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27
#include <glib/gi18n.h>
29
#include "gnome-region-panel-lang.h"
30
#include "gnome-region-panel-formats.h"
31
#include "gnome-region-panel-system.h"
32
#include "cc-common-language.h"
33
#include "cc-language-chooser.h"
34
#include "gdm-languages.h"
36
static GDBusProxy *proxy = NULL;
39
selection_changed (GtkTreeSelection *selection,
50
if (gtk_tree_selection_get_selected (selection, &model, &iter) == FALSE) {
51
g_warning ("No selected languages, this shouldn't happen");
58
gtk_tree_model_get (model, &iter,
63
g_warning ("Would change the language to '%s', but no D-Bus connection available", locale);
67
variant = g_dbus_proxy_call_sync (proxy,
69
g_variant_new ("(s)", g_get_user_name ()),
70
G_DBUS_CALL_FLAGS_NONE,
74
if (variant == NULL) {
75
g_warning ("Could not contact accounts service to look up '%s': %s",
76
g_get_user_name (), error->message);
81
g_variant_get (variant, "(o)", &object_path);
82
user = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
83
G_DBUS_PROXY_FLAGS_NONE,
85
"org.freedesktop.Accounts",
87
"org.freedesktop.Accounts.User",
93
g_warning ("Could not create proxy for user '%s': %s",
94
g_variant_get_string (variant, NULL), error->message);
98
g_variant_unref (variant);
100
variant = g_dbus_proxy_call_sync (user,
102
g_variant_new ("(s)", locale),
103
G_DBUS_CALL_FLAGS_NONE,
107
if (variant == NULL) {
108
g_warning ("Failed to set the language '%s': %s", locale, error->message);
109
g_error_free (error);
113
/* Update the other tabs */
114
formats_update_language (builder, locale);
115
system_update_language (builder, locale);
121
g_variant_unref (variant);
123
g_object_unref (user);
128
language_response (GtkDialog *dialog,
134
GtkTreeSelection *selection;
137
gtk_widget_hide (GTK_WIDGET (dialog));
139
if (response_id != GTK_RESPONSE_OK) {
143
lang = cc_language_chooser_get_language (GTK_WIDGET (dialog));
149
model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
150
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
152
if (cc_common_language_get_iter_for_language (model, lang, &iter)) {
153
gtk_tree_selection_select_iter (selection, &iter);
156
gtk_widget_grab_focus (treeview);
162
add_language (GtkWidget *button, GtkWidget *treeview)
167
toplevel = gtk_widget_get_toplevel (button);
168
chooser = g_object_get_data (G_OBJECT (button), "chooser");
169
if (chooser == NULL) {
170
chooser = cc_language_chooser_new (toplevel, FALSE);
172
g_signal_connect (chooser, "response",
173
G_CALLBACK (language_response), treeview);
174
g_signal_connect (chooser, "delete-event",
175
G_CALLBACK (gtk_widget_hide_on_delete), NULL);
177
g_object_set_data_full (G_OBJECT (button), "chooser",
178
chooser, (GDestroyNotify)gtk_widget_destroy);
181
cc_language_chooser_clear_filter (chooser);
184
gdk_window_set_cursor (gtk_widget_get_window (toplevel), NULL);
185
gtk_window_present (GTK_WINDOW (chooser));
189
setup_language (GtkBuilder *builder)
192
GHashTable *user_langs;
193
GError *error = NULL;
195
GtkStyleContext *context;
196
GtkTreeSelection *selection;
198
/* Setup junction between toolbar and treeview */
199
widget = (GtkWidget *)gtk_builder_get_object (builder, "language-swindow");
200
context = gtk_widget_get_style_context (widget);
201
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
202
widget = (GtkWidget *)gtk_builder_get_object (builder, "language-toolbar");
203
context = gtk_widget_get_style_context (widget);
204
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
206
treeview = GTK_WIDGET (gtk_builder_get_object (builder, "display_language_treeview"));
208
/* Connect buttons */
209
widget = (GtkWidget *)gtk_builder_get_object (builder, "language_add");
210
g_signal_connect (widget, "clicked",
211
G_CALLBACK (add_language), treeview);
213
/* Setup accounts service */
214
proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
215
G_DBUS_PROXY_FLAGS_NONE,
217
"org.freedesktop.Accounts",
218
"/org/freedesktop/Accounts",
219
"org.freedesktop.Accounts",
224
g_warning ("Failed to contact accounts service: %s", error->message);
225
g_error_free (error);
227
g_object_weak_ref (G_OBJECT (treeview), (GWeakNotify) g_object_unref, proxy);
230
/* Add user languages */
231
user_langs = cc_common_language_get_initial_languages ();
232
cc_common_language_setup_list (treeview, user_langs);
234
/* And select the current language */
235
cc_common_language_select_current_language (GTK_TREE_VIEW (treeview));
237
/* And now listen for changes */
238
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
239
g_signal_connect (G_OBJECT (selection), "changed",
240
G_CALLBACK (selection_changed), builder);
242
gtk_widget_grab_focus (treeview);