source: proiecte/PPPP/gdm/gui/simple-greeter/gdm-language-chooser-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: 8.7 KB
Line 
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
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 */
20
21#include "config.h"
22
23#include <stdlib.h>
24#include <stdio.h>
25#include <unistd.h>
26#include <string.h>
27#include <errno.h>
28#include <dirent.h>
29#include <locale.h>
30#include <sys/stat.h>
31
32#include <fontconfig/fontconfig.h>
33
34#include <glib.h>
35#include <glib/gi18n.h>
36#include <glib/gstdio.h>
37#include <gtk/gtk.h>
38
39#include "gdm-language-chooser-widget.h"
40#include "gdm-chooser-widget.h"
41#include "gdm-languages.h"
42
43#define GDM_LANGUAGE_CHOOSER_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LANGUAGE_CHOOSER_WIDGET, GdmLanguageChooserWidgetPrivate))
44
45struct GdmLanguageChooserWidgetPrivate
46{
47        guint               languages_added : 1;
48};
49
50static void     gdm_language_chooser_widget_class_init  (GdmLanguageChooserWidgetClass *klass);
51static void     gdm_language_chooser_widget_init        (GdmLanguageChooserWidget      *language_chooser_widget);
52static void     gdm_language_chooser_widget_finalize    (GObject                       *object);
53
54G_DEFINE_TYPE (GdmLanguageChooserWidget, gdm_language_chooser_widget, GDM_TYPE_CHOOSER_WIDGET)
55
56enum {
57        CHOOSER_LIST_TITLE_COLUMN = 0,
58        CHOOSER_LIST_TRANSLATED_COLUMN,
59        CHOOSER_LIST_LOCALE_COLUMN
60};
61
62char *
63gdm_language_chooser_widget_get_current_language_name (GdmLanguageChooserWidget *widget)
64{
65        char *language_name;
66
67        g_return_val_if_fail (GDM_IS_LANGUAGE_CHOOSER_WIDGET (widget), NULL);
68
69        language_name = gdm_chooser_widget_get_selected_item (GDM_CHOOSER_WIDGET (widget));
70
71        if (language_name == NULL) {
72                language_name = g_strdup (setlocale (LC_MESSAGES, NULL));
73        }
74
75        return language_name;
76}
77
78void
79gdm_language_chooser_widget_set_current_language_name (GdmLanguageChooserWidget *widget,
80                                                       const char               *lang_name)
81{
82        char *name;
83
84        g_return_if_fail (GDM_IS_LANGUAGE_CHOOSER_WIDGET (widget));
85
86        if (lang_name == NULL) {
87                gdm_chooser_widget_set_selected_item (GDM_CHOOSER_WIDGET (widget),
88                                                      NULL);
89                return;
90        }
91
92        name = gdm_normalize_language_name (lang_name);
93        gdm_chooser_widget_set_selected_item (GDM_CHOOSER_WIDGET (widget),
94                                              name);
95
96        g_free (name);
97}
98
99static void
100gdm_language_chooser_widget_add_language (GdmLanguageChooserWidget *widget,
101                                          const char               *name)
102{
103        char *language;
104        char *normalized_name;
105        char *readable_language;
106        char *lang_tag;
107        char *tagged;
108
109        normalized_name = gdm_normalize_language_name (name);
110        gdm_parse_language_name (name, &lang_tag, NULL, NULL, NULL);
111        language = gdm_get_language_from_name (normalized_name, normalized_name);
112        readable_language = gdm_get_language_from_name (normalized_name, NULL);
113
114        tagged = g_strdup_printf ("<span lang=\"%s\">%s</span>", lang_tag, language);
115
116        if (language != NULL) {
117                gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
118                                             normalized_name,
119                                             NULL,
120                                             tagged,
121                                             readable_language,
122                                             0,
123                                             FALSE,
124                                             FALSE);
125                g_free (language);
126        }
127        g_free (readable_language);
128        g_free (tagged);
129        g_free (lang_tag);
130        g_free (normalized_name);
131}
132
133static gboolean
134language_has_font (const char *locale)
135{
136        const FcCharSet *charset;
137        FcPattern       *pattern;
138        FcObjectSet     *object_set;
139        FcFontSet       *font_set;
140        char            *language_code;
141        gboolean         is_displayable;
142
143        is_displayable = FALSE;
144        pattern = NULL;
145        object_set = NULL;
146        font_set = NULL;
147
148        gdm_parse_language_name (locale, &language_code, NULL, NULL, NULL);
149
150        charset = FcLangGetCharSet ((FcChar8 *) language_code);
151        if (!charset) {
152                /* fontconfig does not know about this language */
153                is_displayable = TRUE;
154        } else {
155                /* see if any fonts support rendering it */
156                pattern = FcPatternBuild (NULL, FC_LANG, FcTypeString, language_code, NULL);
157
158                if (pattern == NULL)
159                        goto done;
160
161                object_set = FcObjectSetCreate ();
162
163                if (object_set == NULL)
164                        goto done;
165
166                font_set = FcFontList (NULL, pattern, object_set);
167
168                if (font_set == NULL)
169                        goto done;
170
171                is_displayable = (font_set->nfont > 0);
172        }
173
174 done:
175
176        if (font_set != NULL)
177                FcFontSetDestroy (font_set);
178
179        if (object_set != NULL)
180                FcObjectSetDestroy (object_set);
181
182        if (pattern != NULL)
183                FcPatternDestroy (pattern);
184
185        g_free (language_code);
186        return is_displayable;
187}
188
189static void
190add_available_languages (GdmLanguageChooserWidget *widget)
191{
192        char **language_names;
193        int    i;
194
195        language_names = gdm_get_all_language_names ();
196
197        for (i = 0; language_names[i] != NULL; i++) {
198                if (!language_has_font (language_names[i])) {
199                        continue;
200                }
201                gdm_language_chooser_widget_add_language (widget,
202                                                          language_names[i]);
203        }
204
205        g_strfreev (language_names);
206}
207
208static void
209gdm_language_chooser_widget_dispose (GObject *object)
210{
211        G_OBJECT_CLASS (gdm_language_chooser_widget_parent_class)->dispose (object);
212}
213
214static void
215gdm_language_chooser_widget_realize (GtkWidget *widget)
216{
217        GdmLanguageChooserWidget *chooser;
218
219        chooser = GDM_LANGUAGE_CHOOSER_WIDGET (widget);
220
221        GTK_WIDGET_CLASS (gdm_language_chooser_widget_parent_class)->realize (widget);
222
223        if (!chooser->priv->languages_added) {
224                add_available_languages (chooser);
225                chooser->priv->languages_added = TRUE;
226        }
227}
228
229static void
230gdm_language_chooser_widget_class_init (GdmLanguageChooserWidgetClass *klass)
231{
232        GObjectClass   *object_class = G_OBJECT_CLASS (klass);
233        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
234
235        object_class->dispose = gdm_language_chooser_widget_dispose;
236        object_class->finalize = gdm_language_chooser_widget_finalize;
237        widget_class->realize = gdm_language_chooser_widget_realize;
238
239        g_type_class_add_private (klass, sizeof (GdmLanguageChooserWidgetPrivate));
240}
241
242static void
243gdm_language_chooser_widget_init (GdmLanguageChooserWidget *widget)
244{
245        widget->priv = GDM_LANGUAGE_CHOOSER_WIDGET_GET_PRIVATE (widget);
246
247        gdm_chooser_widget_set_separator_position (GDM_CHOOSER_WIDGET (widget),
248                                                   GDM_CHOOSER_WIDGET_POSITION_TOP);
249}
250
251static void
252gdm_language_chooser_widget_finalize (GObject *object)
253{
254        GdmLanguageChooserWidget *language_chooser_widget;
255
256        g_return_if_fail (object != NULL);
257        g_return_if_fail (GDM_IS_LANGUAGE_CHOOSER_WIDGET (object));
258
259        language_chooser_widget = GDM_LANGUAGE_CHOOSER_WIDGET (object);
260
261        g_return_if_fail (language_chooser_widget->priv != NULL);
262
263        G_OBJECT_CLASS (gdm_language_chooser_widget_parent_class)->finalize (object);
264}
265
266GtkWidget *
267gdm_language_chooser_widget_new (void)
268{
269        GObject *object;
270
271        object = g_object_new (GDM_TYPE_LANGUAGE_CHOOSER_WIDGET,
272                               "inactive-text", _("_Languages:"),
273                               "active-text", _("_Language:"),
274                               NULL);
275
276        return GTK_WIDGET (object);
277}
Note: See TracBrowser for help on using the repository browser.