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
@Returns:
+<!-- ##### FUNCTION ldm_greeter_get_language ##### -->
+<para>
+
+</para>
+
+@greeter:
+@Returns:
+
+
<!-- ##### FUNCTION ldm_greeter_get_layout ##### -->
<para>
</para>
-<!-- ##### ARG LdmLanguage:id ##### -->
+<!-- ##### ARG LdmLanguage:code ##### -->
<para>
</para>
{
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;
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);
libldmgreeterinclude_HEADERS = \
greeter.h \
+ language.h \
layout.h \
session.h \
user.h
libldmgreeter_la_SOURCES= \
greeter.c \
+ language.c \
layout.c \
session.c \
user.c
#include <stdlib.h>
#include <string.h>
+#include <locale.h>
#include <dbus/dbus-glib.h>
#include <security/pam_appl.h>
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;
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,
#include <glib-object.h>
#include "user.h"
+#include "language.h"
#include "layout.h"
#include "session.h"
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);
--- /dev/null
+/*
+ * 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));
+}
--- /dev/null
+/*
+ * 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_ */