]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Add language information
authorunknown <robert.ancell@gmail.com>
Sat, 10 Jul 2010 03:42:39 +0000 (13:42 +1000)
committerunknown <robert.ancell@gmail.com>
Sat, 10 Jul 2010 03:42:39 +0000 (13:42 +1000)
doc/ldmgreeter-sections.txt
doc/tmpl/greeter.sgml
doc/tmpl/language.sgml
greeters/ldm-gtk-greeter.c
libldmgreeter/Makefile.am
libldmgreeter/greeter.c
libldmgreeter/greeter.h
libldmgreeter/language.c [new file with mode: 0644]
libldmgreeter/language.h [new file with mode: 0644]

index 7f3b08296d0693dc4151942e955f56332b476f2a..480b85c62387a5a855d4c4dbb6227590e375b132 100644 (file)
@@ -95,6 +95,7 @@ ldm_greeter_connect
 ldm_greeter_get_num_users
 ldm_greeter_get_users
 ldm_greeter_get_languages
+ldm_greeter_get_language
 ldm_greeter_get_layout
 ldm_greeter_get_layouts
 ldm_greeter_set_layout
index 1c7e89692309869cdd9d735840df9168385656b4..c62f6d3cfa6530867a06a91f61dedab76887aec4 100644 (file)
@@ -221,6 +221,15 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
 @Returns: 
 
 
+<!-- ##### FUNCTION ldm_greeter_get_language ##### -->
+<para>
+
+</para>
+
+@greeter: 
+@Returns: 
+
+
 <!-- ##### FUNCTION ldm_greeter_get_layout ##### -->
 <para>
 
index 5ddf9723137c42410bf80de916f9fe406357629f..3f646bb5360bf54ddd37cced592baa76fb5b3f80 100644 (file)
@@ -26,7 +26,7 @@ LightDM language object
 </para>
 
 
-<!-- ##### ARG LdmLanguage:id ##### -->
+<!-- ##### ARG LdmLanguage:code ##### -->
 <para>
 
 </para>
index 24e4a61dffee23748795bda12580be8ac829735d..5b81d87d8f46379e78f6119920fc5d9e6407d747 100644 (file)
@@ -110,7 +110,7 @@ main(int argc, char **argv)
 {
     GdkWindow *root;
     const GList *items, *item;
-    GSList *session_radio_list = NULL, *layout_radio_list = NULL;
+    GSList *session_radio_list = NULL, *language_radio_list = NULL, *layout_radio_list = NULL;
     GtkCellRenderer *renderer;
     GdkDisplay *display;
     GdkScreen *screen;
@@ -256,6 +256,27 @@ main(int argc, char **argv)
     gtk_menu_shell_append (GTK_MENU_SHELL (option_menu), menu_item);
     menu = gtk_menu_new ();
     gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), menu);
+    items = ldm_greeter_get_languages (greeter);
+    for (item = items; item; item = item->next)
+    {
+        LdmLanguage *language = item->data;
+        gchar *label;
+      
+        if (ldm_language_get_name (language)[0] == '\0')
+            label = g_strdup (ldm_language_get_code (language));
+        else
+            label = g_strdup_printf ("%s - %s", ldm_language_get_name (language), ldm_language_get_territory (language));
+
+        menu_item = gtk_radio_menu_item_new_with_label (language_radio_list, label);
+        language_radio_list = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menu_item));
+        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+
+        if (g_str_equal (ldm_language_get_code (language), ldm_greeter_get_language (greeter)))
+            gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
+
+        //g_object_set_data (G_OBJECT (menu_item), "language", g_strdup (ldm_language_get_code (language)));
+        //g_signal_connect (menu_item, "toggled", G_CALLBACK (language_changed_cb), NULL);
+    }
 
     menu_item = gtk_menu_item_new_with_label (_("Keyboard Layout"));
     gtk_menu_shell_append (GTK_MENU_SHELL (option_menu), menu_item);
index a9eb001fc6f444dd114cdb5f061b9e015da9e35b..d4a61da058c18835bfb15b916528d368f867ee29 100644 (file)
@@ -2,6 +2,7 @@ lib_LTLIBRARIES = libldmgreeter.la
 
 libldmgreeterinclude_HEADERS = \
        greeter.h \
+       language.h \
        layout.h \
        session.h \
        user.h
@@ -11,6 +12,7 @@ libldmgreeter_la_CFLAGS = $(LIBLDMGREETER_CFLAGS)
 
 libldmgreeter_la_SOURCES= \
        greeter.c \
+       language.c \
        layout.c \
        session.c \
        user.c
index 9790c6248ed52803a3be0d71d0833ac98bc386df..bfc2d14d6046a5a82ee8a537bc12c7f6f8fd36e2 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <locale.h>
 
 #include <dbus/dbus-glib.h>
 #include <security/pam_appl.h>
@@ -54,10 +55,13 @@ struct _LdmGreeterPrivate
 
     DBusGProxy *display_proxy, *session_proxy, *user_proxy;
 
+    Display *display;
+
     gboolean have_users;
     GList *users;
-
-    Display *display;
+  
+    gboolean have_languages;
+    GList *languages;
 
     XklEngine *xkl_engine;
     XklConfigRec *xkl_config;
@@ -217,6 +221,78 @@ ldm_greeter_get_users (LdmGreeter *greeter)
     return greeter->priv->users;
 }
 
+static void
+update_languages (LdmGreeter *greeter)
+{
+    gchar *stdout_text = NULL, *stderr_text = NULL;
+    gint exit_status;
+    gboolean result;
+    GError *error = NULL;
+
+    if (greeter->priv->have_languages)
+        return;
+
+    result = g_spawn_command_line_sync ("locale -a", &stdout_text, &stderr_text, &exit_status, &error);
+    if (!result || exit_status != 0)
+        g_warning ("Failed to get languages, locale -a returned %d: %s", exit_status, error->message);
+    else
+    {
+        gchar **tokens;
+        int i;
+
+        tokens = g_strsplit_set (stdout_text, "\n\r", -1);
+        for (i = 0; tokens[i]; i++)
+        {
+            LdmLanguage *language;
+            gchar *code;
+
+            code = g_strchug (tokens[i]);
+            if (code[0] == '\0')
+                continue;
+
+            language = ldm_language_new (code);
+            greeter->priv->languages = g_list_append (greeter->priv->languages, language);
+        }
+
+        g_strfreev (tokens);
+    }
+
+    g_clear_error (&error);
+    g_free (stdout_text);
+    g_free (stderr_text);
+
+    greeter->priv->have_languages = TRUE;
+}
+
+/**
+ * ldm_greeter_get_languages:
+ * @greeter: A #LdmGreeter
+ * 
+ * Get a list of languages to present to the user.
+ * 
+ * Return value: A list of #LdmLanguage that should be presented to the user.
+ **/
+const GList *
+ldm_greeter_get_languages (LdmGreeter *greeter)
+{
+    update_languages (greeter);
+    return greeter->priv->languages;
+}
+
+/**
+ * ldm_greeter_get_language:
+ * @greeter: A #LdmGreeter
+ * 
+ * Get the current language.
+ * 
+ * Return value: The current language.
+ **/
+const gchar *
+ldm_greeter_get_language (LdmGreeter *greeter)
+{
+    return setlocale (LC_ALL, NULL);
+}
+
 static void
 layout_cb (XklConfigRegistry *config,
            const XklConfigItem *item,
index 3e83f469423c308de20af8a75916bbca54df992d..addfe9841c1e01a88b7976a6f0b14daf7eca3d36 100644 (file)
@@ -15,6 +15,7 @@
 #include <glib-object.h>
 
 #include "user.h"
+#include "language.h"
 #include "layout.h"
 #include "session.h"
 
@@ -59,6 +60,10 @@ gint ldm_greeter_get_num_users (LdmGreeter *greeter);
 
 const GList *ldm_greeter_get_users (LdmGreeter *greeter);
 
+const GList *ldm_greeter_get_languages (LdmGreeter *greeter);
+
+const gchar *ldm_greeter_get_language (LdmGreeter *greeter);
+
 const GList *ldm_greeter_get_layouts (LdmGreeter *greeter);
 
 void ldm_greeter_set_layout (LdmGreeter *greeter, const gchar *layout);
diff --git a/libldmgreeter/language.c b/libldmgreeter/language.c
new file mode 100644 (file)
index 0000000..2564d69
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2010 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ * 
+ * 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 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#include <locale.h>
+#include <langinfo.h>
+
+#include "language.h"
+
+enum {
+    PROP_0,
+    PROP_CODE,
+    PROP_NAME,
+    PROP_TERRITORY
+};
+
+struct _LdmLanguagePrivate
+{
+    gchar *code;
+    gchar *name;
+    gchar *territory;
+};
+
+G_DEFINE_TYPE (LdmLanguage, ldm_language, G_TYPE_OBJECT);
+
+/**
+ * ldm_language_new:
+ * 
+ * Create a new language.
+ * @code: The language code
+ * 
+ * Return value: the new #LdmLanguage
+ **/
+LdmLanguage *
+ldm_language_new (const gchar *code)
+{
+    return g_object_new (LDM_TYPE_LANGUAGE, "code", code, NULL);
+}
+
+/**
+ * ldm_language_get_code:
+ * @language: A #LdmLanguage
+ * 
+ * Get the code of a language.
+ * 
+ * Return value: The code of the language
+ **/
+const gchar *
+ldm_language_get_code (LdmLanguage *language)
+{
+    return language->priv->code;
+}
+
+/**
+ * ldm_language_get_name:
+ * @language: A #LdmLanguage
+ * 
+ * Get the name of a language.
+ *
+ * Return value: The name of the language
+ **/
+const gchar *
+ldm_language_get_name (LdmLanguage *language)
+{
+    if (!language->priv->name)
+    {
+        char *current = setlocale(LC_ALL, NULL);
+        setlocale(LC_ALL, language->priv->code);
+        language->priv->name = g_strdup (nl_langinfo (_NL_IDENTIFICATION_LANGUAGE));
+        setlocale(LC_ALL, current);
+    }
+
+    return language->priv->name;
+}
+
+/**
+ * ldm_language_get_territory:
+ * @language: A #LdmLanguage
+ * 
+ * Get the territory the language is used in.
+ * 
+ * Return value: The territory the language is used in.
+ **/
+const gchar *
+ldm_language_get_territory (LdmLanguage *language)
+{
+    if (!language->priv->territory)
+    {
+        char *current = setlocale(LC_ALL, NULL);
+        setlocale(LC_ALL, language->priv->code);
+        language->priv->territory = g_strdup (nl_langinfo (_NL_IDENTIFICATION_TERRITORY));
+        setlocale(LC_ALL, current);
+    }
+
+    return language->priv->territory;
+}
+
+static void
+ldm_language_init (LdmLanguage *language)
+{
+    language->priv = G_TYPE_INSTANCE_GET_PRIVATE (language, LDM_TYPE_LANGUAGE, LdmLanguagePrivate);
+}
+
+static void
+ldm_language_set_property(GObject      *object,
+                          guint         prop_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
+{
+    LdmLanguage *self;
+    gint i, n_pages;
+
+    self = LDM_LANGUAGE (object);
+
+    switch (prop_id) {
+    case PROP_CODE:
+        g_free (self->priv->name);
+        self->priv->code = g_strdup (g_value_get_string (value));
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+ldm_language_get_property(GObject    *object,
+                          guint       prop_id,
+                          GValue     *value,
+                          GParamSpec *pspec)
+{
+    LdmLanguage *self;
+
+    self = LDM_LANGUAGE (object);
+
+    switch (prop_id) {
+    case PROP_CODE:
+        g_value_set_string (value, ldm_language_get_code (self));
+        break;
+    case PROP_NAME:
+        g_value_set_string (value, ldm_language_get_name (self));
+        break;
+    case PROP_TERRITORY:
+        g_value_set_string (value, ldm_language_get_territory (self));
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+ldm_language_class_init (LdmLanguageClass *klass)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  
+    g_type_class_add_private (klass, sizeof (LdmLanguagePrivate));
+
+    object_class->set_property = ldm_language_set_property;
+    object_class->get_property = ldm_language_get_property;
+
+    g_object_class_install_property(object_class,
+                                    PROP_CODE,
+                                    g_param_spec_string("code",
+                                                        "code",
+                                                        "Language code",
+                                                        NULL,
+                                                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+    g_object_class_install_property(object_class,
+                                    PROP_NAME,
+                                    g_param_spec_string("name",
+                                                        "name",
+                                                        "Name of the language",
+                                                        NULL,
+                                                        G_PARAM_READABLE));
+    g_object_class_install_property(object_class,
+                                    PROP_TERRITORY,
+                                    g_param_spec_string("territory",
+                                                        "territory",
+                                                        "Territory the language is from",
+                                                        NULL,
+                                                        G_PARAM_READABLE));
+}
diff --git a/libldmgreeter/language.h b/libldmgreeter/language.h
new file mode 100644 (file)
index 0000000..6b8bd99
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2010 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ * 
+ * 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 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#ifndef _LDM_LANGUAGE_H_
+#define _LDM_LANGUAGE_H_
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define LDM_TYPE_LANGUAGE            (ldm_language_get_type())
+#define LDM_LANGUAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), LDM_TYPE_LANGUAGE, LdmLanguage));
+#define LDM_LANGUAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), LDM_TYPE_LANGUAGE, LdmLanguageClass))
+#define LDM_IS_LANGUAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LDM_TYPE_LANGUAGE))
+#define LDM_IS_LANGUAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LDM_TYPE_LANGUAGE))
+#define LDM_LANGUAGE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), LDM_TYPE_LANGUAGE, LdmLanguageClass))
+
+typedef struct _LdmLanguage        LdmLanguage;
+typedef struct _LdmLanguageClass   LdmLanguageClass;
+typedef struct _LdmLanguagePrivate LdmLanguagePrivate;
+
+struct _LdmLanguage
+{
+    GObject         parent_instance;
+    LdmLanguagePrivate *priv;
+};
+
+struct _LdmLanguageClass
+{
+    GObjectClass parent_class;
+};
+
+GType ldm_language_get_type (void);
+
+LdmLanguage *ldm_language_new (const gchar *code);
+
+const gchar *ldm_language_get_code (LdmLanguage *language);
+
+const gchar *ldm_language_get_name (LdmLanguage *language);
+
+const gchar *ldm_language_get_territory (LdmLanguage *language);
+
+G_END_DECLS
+
+#endif /* _LDM_LANGUAGE_H_ */