source: proiecte/PPPP/gdm/gui/simple-greeter/gdm-language-option-widget.c @ 134

Last change on this file since 134 was 134, checked in by (none), 14 years ago

gdm sources with the modifications for webcam

File size: 11.5 KB
Line 
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2008 Red Hat, Inc.
4 *
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.
9 *
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.
14 *
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.
18 *
19 * Written by: Ray Strode <rstrode@redhat.com>
20 *
21 */
22
23#include "config.h"
24
25#include <stdlib.h>
26#include <stdio.h>
27#include <unistd.h>
28#include <string.h>
29#include <errno.h>
30#include <dirent.h>
31#include <sys/stat.h>
32
33#include <glib.h>
34#include <glib/gi18n.h>
35#include <glib/gstdio.h>
36#include <gtk/gtk.h>
37
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"
43
44#define GDM_LANGUAGE_OPTION_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LANGUAGE_OPTION_WIDGET, GdmLanguageOptionWidgetPrivate))
45
46struct GdmLanguageOptionWidgetPrivate
47{
48        GtkWidget *dialog;
49};
50
51enum {
52        LANGUAGE_ACTIVATED,
53        DIALOG_HIDDEN,
54        NUMBER_OF_SIGNALS
55};
56
57static guint signals [NUMBER_OF_SIGNALS] = { 0, };
58
59static void     gdm_language_option_widget_class_init  (GdmLanguageOptionWidgetClass *klass);
60static void     gdm_language_option_widget_init        (GdmLanguageOptionWidget      *language_option_widget);
61static void     gdm_language_option_widget_finalize    (GObject                      *object);
62static void     gdm_language_option_widget_hide_dialog (GdmLanguageOptionWidget      *widget);
63
64G_DEFINE_TYPE (GdmLanguageOptionWidget, gdm_language_option_widget, GDM_TYPE_RECENT_OPTION_WIDGET)
65
66static void
67gdm_language_option_widget_set_language_from_dialog (GdmLanguageOptionWidget *widget)
68{
69        char *language_name;
70
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);
74}
75
76static void
77on_dialog_response (GtkDialog               *dialog,
78                    int                      response_id,
79                    GdmLanguageOptionWidget *widget)
80{
81        switch (response_id) {
82                case GTK_RESPONSE_OK:
83                        gdm_language_option_widget_set_language_from_dialog (widget);
84                        break;
85
86                default:
87                        break;
88        }
89
90        gdm_language_option_widget_hide_dialog (widget);
91}
92
93static void
94gdm_language_option_widget_hide_dialog (GdmLanguageOptionWidget *widget)
95{
96        gtk_widget_destroy (widget->priv->dialog);
97        widget->priv->dialog = NULL;
98        g_signal_emit (G_OBJECT (widget), signals[DIALOG_HIDDEN], 0);
99}
100
101static void
102create_dialog (GdmLanguageOptionWidget *widget)
103{
104        gdm_profile_start (NULL);
105
106        g_assert (widget->priv->dialog == NULL);
107
108        widget->priv->dialog = gdm_language_chooser_dialog_new ();
109
110        gdm_profile_end (NULL);
111}
112
113static void
114gdm_language_option_widget_show_dialog (GdmLanguageOptionWidget *widget,
115                                        const char              *active_item_id)
116{
117        if (widget->priv->dialog == NULL) {
118                create_dialog (widget);
119        }
120
121        g_signal_connect (GTK_DIALOG (widget->priv->dialog),
122                          "response",
123                          G_CALLBACK (on_dialog_response),
124                          widget);
125
126        gtk_widget_show_all (GTK_WIDGET (widget->priv->dialog));
127
128        gdm_language_chooser_dialog_set_current_language_name (GDM_LANGUAGE_CHOOSER_DIALOG (GDM_LANGUAGE_OPTION_WIDGET (widget)->priv->dialog),
129                                                               active_item_id);
130}
131
132static void
133gdm_language_option_widget_activated (GdmOptionWidget *widget)
134{
135        char *active_item_id;
136
137        active_item_id = gdm_option_widget_get_active_item (GDM_OPTION_WIDGET (widget));
138        if (active_item_id == NULL) {
139                return;
140        }
141
142        if (strcmp (active_item_id, "__other") == 0) {
143                g_free (active_item_id);
144
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);
148        }
149
150        g_signal_emit (G_OBJECT (widget), signals[LANGUAGE_ACTIVATED], 0);
151
152        g_free (active_item_id);
153}
154
155static void
156gdm_language_option_widget_class_init (GdmLanguageOptionWidgetClass *klass)
157{
158        GObjectClass         *object_class = G_OBJECT_CLASS (klass);
159        GdmOptionWidgetClass *option_widget_class = GDM_OPTION_WIDGET_CLASS (klass);
160
161        object_class->finalize = gdm_language_option_widget_finalize;
162
163        option_widget_class->activated = gdm_language_option_widget_activated;
164
165        signals[LANGUAGE_ACTIVATED] = g_signal_new ("language-activated",
166                                                     G_TYPE_FROM_CLASS (object_class),
167                                                     G_SIGNAL_RUN_FIRST,
168                                                     G_STRUCT_OFFSET (GdmLanguageOptionWidgetClass, language_activated),
169                                                     NULL,
170                                                     NULL,
171                                                     g_cclosure_marshal_VOID__VOID,
172                                                     G_TYPE_NONE,
173                                                     0);
174
175        signals[DIALOG_HIDDEN] = g_signal_new ("dialog-hidden",
176                                               G_TYPE_FROM_CLASS (object_class),
177                                               G_SIGNAL_RUN_FIRST,
178                                               G_STRUCT_OFFSET (GdmLanguageOptionWidgetClass, dialog_hidden),
179                                               NULL,
180                                               NULL,
181                                               g_cclosure_marshal_VOID__VOID,
182                                               G_TYPE_NONE,
183                                               0);
184
185        g_type_class_add_private (klass, sizeof (GdmLanguageOptionWidgetPrivate));
186}
187
188static char *
189gdm_language_option_widget_lookup_item (GdmRecentOptionWidget *widget,
190                                        const char            *locale,
191                                        char                 **name,
192                                        char                 **comment)
193{
194        char *language;
195        char *readable_language;
196        char *lang_tag;
197        char *normalized_locale;
198
199        normalized_locale = gdm_normalize_language_name (locale);
200
201        language = gdm_get_language_from_name (locale, normalized_locale);
202
203        if (language == NULL) {
204                g_free (normalized_locale);
205                return NULL;
206        }
207
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;
212
213        g_free (language);
214        g_free (lang_tag);
215
216        return normalized_locale;
217}
218
219static void
220gdm_language_option_widget_init (GdmLanguageOptionWidget *widget)
221{
222        GError *error;
223
224        widget->priv = GDM_LANGUAGE_OPTION_WIDGET_GET_PRIVATE (widget);
225
226        error = NULL;
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,
230                                                &error);
231
232        if (error != NULL) {
233                g_warning ("Could not read recent languages from gconf: %s",
234                           error->message);
235                g_error_free (error);
236        }
237
238        gdm_option_widget_add_item (GDM_OPTION_WIDGET (widget),
239                                    "__other",
240                                    /* translators: This brings up a dialog
241                                     * with a list of languages to choose from
242                                     */
243                                    C_("language", "Other..."),
244                                    _("Choose a language from the "
245                                      "full list of available languages."),
246                                    GDM_OPTION_WIDGET_POSITION_BOTTOM);
247}
248
249static void
250gdm_language_option_widget_finalize (GObject *object)
251{
252        GdmLanguageOptionWidget *language_option_widget;
253
254        g_return_if_fail (object != NULL);
255        g_return_if_fail (GDM_IS_LANGUAGE_OPTION_WIDGET (object));
256
257        language_option_widget = GDM_LANGUAGE_OPTION_WIDGET (object);
258
259        g_return_if_fail (language_option_widget->priv != NULL);
260
261        if (language_option_widget->priv->dialog != NULL) {
262                gtk_widget_destroy (language_option_widget->priv->dialog);
263        }
264
265        G_OBJECT_CLASS (gdm_language_option_widget_parent_class)->finalize (object);
266}
267
268GtkWidget *
269gdm_language_option_widget_new (void)
270{
271        GObject *object;
272
273        object = g_object_new (GDM_TYPE_LANGUAGE_OPTION_WIDGET,
274                               "label-text", _("_Language:"),
275                               "icon-name", "preferences-desktop-locale",
276                               "max-item-count", 8,
277                               NULL);
278
279        return GTK_WIDGET (object);
280}
281
282char *
283gdm_language_option_widget_get_current_language_name (GdmLanguageOptionWidget *widget)
284{
285        char *active_item_id;
286
287        active_item_id = gdm_option_widget_get_active_item (GDM_OPTION_WIDGET (widget));
288        if (active_item_id == NULL) {
289                return NULL;
290        }
291
292        if (strcmp (active_item_id, "__other") == 0) {
293                g_free (active_item_id);
294                return NULL;
295        }
296
297        return active_item_id;
298}
299
300void
301gdm_language_option_widget_set_current_language_name (GdmLanguageOptionWidget *widget,
302                                                      const char              *language_name)
303{
304        char *normalized_language_name;
305
306        g_return_if_fail (GDM_IS_LANGUAGE_OPTION_WIDGET (widget));
307
308        if (language_name != NULL) {
309                normalized_language_name = gdm_normalize_language_name (language_name);
310        } else {
311                normalized_language_name = NULL;
312        }
313
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);
319        }
320
321        gdm_option_widget_set_active_item (GDM_OPTION_WIDGET (widget), normalized_language_name);
322        g_free (normalized_language_name);
323}
Note: See TracBrowser for help on using the repository browser.