1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
3
* Copyright (C) 2008 Red Hat, Inc.
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
* Written by: Ray Strode <rstrode@redhat.com>
34
#include <glib/gi18n.h>
35
#include <glib/gstdio.h>
38
#include "gdm-profile.h"
39
#include "gdm-languages.h"
40
#include "gdm-language-option-widget.h"
41
#include "gdm-recent-option-widget.h"
42
#include "gdm-language-chooser-dialog.h"
44
#define GDM_LANGUAGE_OPTION_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LANGUAGE_OPTION_WIDGET, GdmLanguageOptionWidgetPrivate))
46
struct GdmLanguageOptionWidgetPrivate
57
static guint signals [NUMBER_OF_SIGNALS] = { 0, };
59
static void gdm_language_option_widget_class_init (GdmLanguageOptionWidgetClass *klass);
60
static void gdm_language_option_widget_init (GdmLanguageOptionWidget *language_option_widget);
61
static void gdm_language_option_widget_finalize (GObject *object);
62
static void gdm_language_option_widget_hide_dialog (GdmLanguageOptionWidget *widget);
64
G_DEFINE_TYPE (GdmLanguageOptionWidget, gdm_language_option_widget, GDM_TYPE_RECENT_OPTION_WIDGET)
67
gdm_language_option_widget_set_language_from_dialog (GdmLanguageOptionWidget *widget)
71
language_name = gdm_language_chooser_dialog_get_current_language_name (GDM_LANGUAGE_CHOOSER_DIALOG (widget->priv->dialog));
72
gdm_language_option_widget_set_current_language_name (widget, language_name);
73
g_free (language_name);
77
on_dialog_response (GtkDialog *dialog,
79
GdmLanguageOptionWidget *widget)
81
switch (response_id) {
83
gdm_language_option_widget_set_language_from_dialog (widget);
90
gdm_language_option_widget_hide_dialog (widget);
94
gdm_language_option_widget_hide_dialog (GdmLanguageOptionWidget *widget)
96
gtk_widget_destroy (widget->priv->dialog);
97
widget->priv->dialog = NULL;
98
g_signal_emit (G_OBJECT (widget), signals[DIALOG_HIDDEN], 0);
102
create_dialog (GdmLanguageOptionWidget *widget)
104
gdm_profile_start (NULL);
106
g_assert (widget->priv->dialog == NULL);
108
widget->priv->dialog = gdm_language_chooser_dialog_new ();
110
gdm_profile_end (NULL);
114
gdm_language_option_widget_show_dialog (GdmLanguageOptionWidget *widget,
115
const char *active_item_id)
117
if (widget->priv->dialog == NULL) {
118
create_dialog (widget);
121
g_signal_connect (GTK_DIALOG (widget->priv->dialog),
123
G_CALLBACK (on_dialog_response),
126
gtk_widget_show_all (GTK_WIDGET (widget->priv->dialog));
128
gdm_language_chooser_dialog_set_current_language_name (GDM_LANGUAGE_CHOOSER_DIALOG (GDM_LANGUAGE_OPTION_WIDGET (widget)->priv->dialog),
133
gdm_language_option_widget_activated (GdmOptionWidget *widget)
135
char *active_item_id;
137
active_item_id = gdm_option_widget_get_active_item (GDM_OPTION_WIDGET (widget));
138
if (active_item_id == NULL) {
142
if (strcmp (active_item_id, "__other") == 0) {
143
g_free (active_item_id);
145
active_item_id = gdm_option_widget_get_default_item (widget);
146
gdm_language_option_widget_set_current_language_name (GDM_LANGUAGE_OPTION_WIDGET (widget), active_item_id);
147
gdm_language_option_widget_show_dialog (GDM_LANGUAGE_OPTION_WIDGET (widget), active_item_id);
150
g_signal_emit (G_OBJECT (widget), signals[LANGUAGE_ACTIVATED], 0);
152
g_free (active_item_id);
156
gdm_language_option_widget_class_init (GdmLanguageOptionWidgetClass *klass)
158
GObjectClass *object_class = G_OBJECT_CLASS (klass);
159
GdmOptionWidgetClass *option_widget_class = GDM_OPTION_WIDGET_CLASS (klass);
161
object_class->finalize = gdm_language_option_widget_finalize;
163
option_widget_class->activated = gdm_language_option_widget_activated;
165
signals[LANGUAGE_ACTIVATED] = g_signal_new ("language-activated",
166
G_TYPE_FROM_CLASS (object_class),
168
G_STRUCT_OFFSET (GdmLanguageOptionWidgetClass, language_activated),
171
g_cclosure_marshal_VOID__VOID,
175
signals[DIALOG_HIDDEN] = g_signal_new ("dialog-hidden",
176
G_TYPE_FROM_CLASS (object_class),
178
G_STRUCT_OFFSET (GdmLanguageOptionWidgetClass, dialog_hidden),
181
g_cclosure_marshal_VOID__VOID,
185
g_type_class_add_private (klass, sizeof (GdmLanguageOptionWidgetPrivate));
189
gdm_language_option_widget_lookup_item (GdmRecentOptionWidget *widget,
195
char *readable_language;
197
char *normalized_locale;
199
normalized_locale = gdm_normalize_language_name (locale);
201
language = gdm_get_language_from_name (locale, normalized_locale);
203
if (language == NULL) {
204
g_free (normalized_locale);
208
readable_language = gdm_get_language_from_name (locale, NULL);
209
gdm_parse_language_name (locale, &lang_tag, NULL, NULL, NULL);
210
*name = g_strdup_printf ("<span lang=\"%s\">%s</span>", lang_tag, language);
211
*comment = readable_language;
216
return normalized_locale;
220
gdm_language_option_widget_init (GdmLanguageOptionWidget *widget)
224
widget->priv = GDM_LANGUAGE_OPTION_WIDGET_GET_PRIVATE (widget);
227
gdm_recent_option_widget_set_gconf_key (GDM_RECENT_OPTION_WIDGET (widget),
228
"/apps/gdm/simple-greeter/recent-languages",
229
gdm_language_option_widget_lookup_item,
233
g_warning ("Could not read recent languages from gconf: %s",
235
g_error_free (error);
238
gdm_option_widget_add_item (GDM_OPTION_WIDGET (widget),
240
/* translators: This brings up a dialog
241
* with a list of languages to choose from
243
C_("language", "Other..."),
244
_("Choose a language from the "
245
"full list of available languages."),
246
GDM_OPTION_WIDGET_POSITION_BOTTOM);
250
gdm_language_option_widget_finalize (GObject *object)
252
GdmLanguageOptionWidget *language_option_widget;
254
g_return_if_fail (object != NULL);
255
g_return_if_fail (GDM_IS_LANGUAGE_OPTION_WIDGET (object));
257
language_option_widget = GDM_LANGUAGE_OPTION_WIDGET (object);
259
g_return_if_fail (language_option_widget->priv != NULL);
261
if (language_option_widget->priv->dialog != NULL) {
262
gtk_widget_destroy (language_option_widget->priv->dialog);
265
G_OBJECT_CLASS (gdm_language_option_widget_parent_class)->finalize (object);
269
gdm_language_option_widget_new (void)
273
object = g_object_new (GDM_TYPE_LANGUAGE_OPTION_WIDGET,
274
"label-text", _("_Language:"),
275
"icon-name", "preferences-desktop-locale",
279
return GTK_WIDGET (object);
283
gdm_language_option_widget_get_current_language_name (GdmLanguageOptionWidget *widget)
285
char *active_item_id;
287
active_item_id = gdm_option_widget_get_active_item (GDM_OPTION_WIDGET (widget));
288
if (active_item_id == NULL) {
292
if (strcmp (active_item_id, "__other") == 0) {
293
g_free (active_item_id);
297
return active_item_id;
301
gdm_language_option_widget_set_current_language_name (GdmLanguageOptionWidget *widget,
302
const char *language_name)
304
char *normalized_language_name;
306
g_return_if_fail (GDM_IS_LANGUAGE_OPTION_WIDGET (widget));
308
if (language_name != NULL) {
309
normalized_language_name = gdm_normalize_language_name (language_name);
311
normalized_language_name = NULL;
314
if (normalized_language_name != NULL &&
315
!gdm_option_widget_lookup_item (GDM_OPTION_WIDGET (widget),
316
normalized_language_name, NULL, NULL, NULL)) {
317
gdm_recent_option_widget_add_item (GDM_RECENT_OPTION_WIDGET (widget),
318
normalized_language_name);
321
gdm_option_widget_set_active_item (GDM_OPTION_WIDGET (widget), normalized_language_name);
322
g_free (normalized_language_name);