From a5b7be9fb6a5127fcaeaeac27d516283da2efcda Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 31 Oct 2010 15:58:40 +1100 Subject: [PATCH] Add configuration for default language/layout --- NEWS | 1 + data/lightdm.conf | 4 +++ doc/ldmgreeter-sections.txt | 5 ++-- doc/tmpl/greeter.sgml | 15 ++++++++--- greeters/ldm-gtk-greeter.c | 2 +- greeters/ldm-webkit-greeter.c | 27 +++++++++++++++----- libldmgreeter/greeter.c | 44 ++++++++++++++++++++++++-------- libldmgreeter/greeter.h | 4 ++- src/display-manager.c | 8 ++++++ src/display.c | 47 ++++++++++++++++++++++++++++++++--- src/display.h | 10 +++++++- src/display.xml | 2 ++ 12 files changed, 141 insertions(+), 28 deletions(-) diff --git a/NEWS b/NEWS index 402cb29a..be6fc43e 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,7 @@ Overview of changes in lightdm 0.1.3 * Do cross fade for sessions that support it (set X-LightDM-Supports-Transitions=true in their xsession file) * Load user settings from ~/.dmrc + * Add configuration for default language/layout Overview of changes in lightdm 0.1.2 diff --git a/data/lightdm.conf b/data/lightdm.conf index fc22e8b6..af0771f9 100644 --- a/data/lightdm.conf +++ b/data/lightdm.conf @@ -15,6 +15,8 @@ displays=default-display # # Display configuration # +# language = Default language to use in greeter and in sessions +# layout = Default keyboard layout to use in greeter and in sessions # session = Default session # default-user = Username of default user to log in as # default-user-timeout = Delay before logging in in seconds (use 0 for automatic login) @@ -24,6 +26,8 @@ displays=default-display # key = Authentication key to use # [default-display] +#language=en_US.utf8 +#layout=us #session=gnome #default-user=bob #default-user-timeout=5 diff --git a/doc/ldmgreeter-sections.txt b/doc/ldmgreeter-sections.txt index 2588b3a2..898dcbcb 100644 --- a/doc/ldmgreeter-sections.txt +++ b/doc/ldmgreeter-sections.txt @@ -99,10 +99,11 @@ ldm_greeter_get_integer_property ldm_greeter_get_boolean_property ldm_greeter_get_num_users ldm_greeter_get_users +ldm_greeter_get_default_language ldm_greeter_get_languages -ldm_greeter_get_language -ldm_greeter_get_layout +ldm_greeter_get_default_layout ldm_greeter_get_layouts +ldm_greeter_get_layout ldm_greeter_set_layout ldm_greeter_get_sessions ldm_greeter_get_default_session diff --git a/doc/tmpl/greeter.sgml b/doc/tmpl/greeter.sgml index 7e9a54a4..603a62df 100644 --- a/doc/tmpl/greeter.sgml +++ b/doc/tmpl/greeter.sgml @@ -270,7 +270,7 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @Returns: - + @@ -279,7 +279,7 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @Returns: - + @@ -288,7 +288,7 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @Returns: - + @@ -306,6 +306,15 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @Returns: + + + + + +@greeter: +@Returns: + + diff --git a/greeters/ldm-gtk-greeter.c b/greeters/ldm-gtk-greeter.c index 2b23ec38..6c538ba8 100644 --- a/greeters/ldm-gtk-greeter.c +++ b/greeters/ldm-gtk-greeter.c @@ -568,7 +568,7 @@ main(int argc, char **argv) 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))) + if (g_str_equal (ldm_language_get_code (language), ldm_greeter_get_default_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))); diff --git a/greeters/ldm-webkit-greeter.c b/greeters/ldm-webkit-greeter.c index 2b26a243..11a9f439 100644 --- a/greeters/ldm-webkit-greeter.c +++ b/greeters/ldm-webkit-greeter.c @@ -342,15 +342,29 @@ get_languages_cb (JSContextRef context, } static JSValueRef -get_language_cb (JSContextRef context, - JSObjectRef thisObject, - JSStringRef propertyName, - JSValueRef *exception) +get_default_language_cb (JSContextRef context, + JSObjectRef thisObject, + JSStringRef propertyName, + JSValueRef *exception) +{ + LdmGreeter *greeter = JSObjectGetPrivate (thisObject); + JSStringRef string; + + string = JSStringCreateWithUTF8CString (ldm_greeter_get_default_language (greeter)); + + return JSValueMakeString (context, string); +} + +static JSValueRef +get_default_layout_cb (JSContextRef context, + JSObjectRef thisObject, + JSStringRef propertyName, + JSValueRef *exception) { LdmGreeter *greeter = JSObjectGetPrivate (thisObject); JSStringRef string; - string = JSStringCreateWithUTF8CString (ldm_greeter_get_language (greeter)); + string = JSStringCreateWithUTF8CString (ldm_greeter_get_default_layout (greeter)); return JSValueMakeString (context, string); } @@ -916,8 +930,9 @@ static const JSStaticValue ldm_greeter_values[] = { { "hostname", get_hostname_cb, NULL, kJSPropertyAttributeReadOnly }, { "users", get_users_cb, NULL, kJSPropertyAttributeReadOnly }, + { "default_language", get_default_language_cb, NULL, kJSPropertyAttributeReadOnly }, { "languages", get_languages_cb, NULL, kJSPropertyAttributeReadOnly }, - { "language", get_language_cb, NULL, kJSPropertyAttributeReadOnly }, + { "default_layout", get_default_layout_cb, NULL, kJSPropertyAttributeReadOnly }, { "layouts", get_layouts_cb, NULL, kJSPropertyAttributeReadOnly }, { "layout", get_layout_cb, set_layout_cb, kJSPropertyAttributeReadOnly }, { "sessions", get_sessions_cb, NULL, kJSPropertyAttributeReadOnly }, diff --git a/libldmgreeter/greeter.c b/libldmgreeter/greeter.c index 7a638126..589092fa 100644 --- a/libldmgreeter/greeter.c +++ b/libldmgreeter/greeter.c @@ -26,6 +26,7 @@ enum { PROP_HOSTNAME, PROP_NUM_USERS, PROP_USERS, + PROP_DEFAULT_LANGUAGE, PROP_LAYOUTS, PROP_LAYOUT, PROP_SESSIONS, @@ -68,10 +69,12 @@ struct _LdmGreeterPrivate gboolean have_users; GList *users; - + + gchar *default_language; gboolean have_languages; GList *languages; + gchar *default_layout; XklEngine *xkl_engine; XklConfigRec *xkl_config; gboolean have_layouts; @@ -184,6 +187,8 @@ ldm_greeter_connect (LdmGreeter *greeter) result = dbus_g_proxy_call (greeter->priv->display_proxy, "Connect", &error, G_TYPE_INVALID, G_TYPE_STRING, &greeter->priv->theme, + G_TYPE_STRING, &greeter->priv->default_language, + G_TYPE_STRING, &greeter->priv->default_layout, G_TYPE_STRING, &greeter->priv->default_session, G_TYPE_STRING, &greeter->priv->timed_user, G_TYPE_INT, &greeter->priv->login_delay, @@ -460,6 +465,21 @@ update_languages (LdmGreeter *greeter) greeter->priv->have_languages = TRUE; } +/** + * ldm_greeter_get_default_language: + * @greeter: A #LdmGreeter + * + * Get the default language. + * + * Return value: The default language. + **/ +const gchar * +ldm_greeter_get_default_language (LdmGreeter *greeter) +{ + g_return_val_if_fail (greeter != NULL, NULL); + return greeter->priv->default_language; +} + /** * ldm_greeter_get_languages: * @greeter: A #LdmGreeter @@ -476,19 +496,11 @@ ldm_greeter_get_languages (LdmGreeter *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) +ldm_greeter_get_default_layout (LdmGreeter *greeter) { g_return_val_if_fail (greeter != NULL, NULL); - return setlocale (LC_ALL, NULL); + return greeter->priv->default_layout; } static void @@ -1196,6 +1208,9 @@ ldm_greeter_get_property (GObject *object, break; case PROP_USERS: break; + case PROP_DEFAULT_LANGUAGE: + g_value_set_string (value, ldm_greeter_get_default_language (self)); + break; case PROP_LAYOUTS: break; case PROP_LAYOUT: @@ -1265,6 +1280,13 @@ ldm_greeter_class_init (LdmGreeterClass *klass) g_param_spec_list ("users", "users", "Users that can login")); + g_object_class_install_property (object_class, + PROP_DEFAULT_LANGUAGE, + g_param_spec_string ("default-language", + "default-language", + "Default language", + NULL, + G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_LAYOUTS, g_param_spec_list ("layouts", diff --git a/libldmgreeter/greeter.h b/libldmgreeter/greeter.h index c40abd58..93a89a26 100644 --- a/libldmgreeter/greeter.h +++ b/libldmgreeter/greeter.h @@ -70,9 +70,11 @@ gint ldm_greeter_get_num_users (LdmGreeter *greeter); const GList *ldm_greeter_get_users (LdmGreeter *greeter); +const gchar *ldm_greeter_get_default_language (LdmGreeter *greeter); + const GList *ldm_greeter_get_languages (LdmGreeter *greeter); -const gchar *ldm_greeter_get_language (LdmGreeter *greeter); +const gchar *ldm_greeter_get_default_layout (LdmGreeter *greeter); const GList *ldm_greeter_get_layouts (LdmGreeter *greeter); diff --git a/src/display-manager.c b/src/display-manager.c index a5103a83..41453eb9 100644 --- a/src/display-manager.c +++ b/src/display-manager.c @@ -332,6 +332,14 @@ add_display (DisplayManager *manager) if (manager->priv->test_mode) display_set_greeter_user (display, NULL); + value = g_key_file_get_string (manager->priv->config, "Greeter", "language", NULL); + if (value) + display_set_default_language (display, value); + g_free (value); + value = g_key_file_get_string (manager->priv->config, "Greeter", "layout", NULL); + if (value) + display_set_default_layout (display, value); + g_free (value); value = g_key_file_get_string (manager->priv->config, "Greeter", "session", NULL); if (value) display_set_default_session (display, value); diff --git a/src/display.c b/src/display.c index 165a8bb5..9323b508 100644 --- a/src/display.c +++ b/src/display.c @@ -63,6 +63,12 @@ struct DisplayPrivate /* Number of times have logged in */ gint login_count; + /* Language to use in greeter/sessions */ + gchar *default_language; + + /* Layout to use in greeter/sessions */ + gchar *default_layout; + /* User to run greeter as */ gchar *greeter_user; @@ -180,6 +186,32 @@ display_get_greeter_theme (Display *display) return display->priv->greeter_theme; } +void +display_set_default_language (Display *display, const gchar *language) +{ + g_free (display->priv->default_language); + display->priv->default_language = g_strdup (language); +} + +const gchar * +display_get_default_language (Display *display) +{ + return display->priv->default_language; +} + +void +display_set_default_layout (Display *display, const gchar *layout) +{ + g_free (display->priv->default_layout); + display->priv->default_layout = g_strdup (layout); +} + +const gchar * +display_get_default_layout (Display *display) +{ + return display->priv->default_layout; +} + void display_set_default_session (Display *display, const gchar *session) { @@ -350,9 +382,9 @@ start_user_session (Display *display, const gchar *session, const gchar *languag if (language) g_key_file_set_string (dmrc_file, "Desktop", "Language", language); else if (!g_key_file_has_key (dmrc_file, "Desktop", "Language", NULL)) - g_key_file_set_string (dmrc_file, "Desktop", "Language", "C"); + g_key_file_set_string (dmrc_file, "Desktop", "Language", display->priv->default_language); if (!g_key_file_has_key (dmrc_file, "Desktop", "Layout", NULL)) - g_key_file_set_string (dmrc_file, "Desktop", "Layout", "us"); + g_key_file_set_string (dmrc_file, "Desktop", "Layout", display->priv->default_layout); filename = g_strdup_printf ("%s.desktop", session); path = g_build_filename (XSESSIONS_DIR, filename, NULL); @@ -603,7 +635,10 @@ session_started_cb (PAMSession *session, Display *display) } gboolean -display_connect (Display *display, const gchar **theme, const gchar **session, const gchar **username, gint *delay, GError *error) +display_connect (Display *display, + const gchar **theme, + const gchar **language, const gchar **layout, const gchar **session, + const gchar **username, gint *delay, GError *error) { if (!display->priv->greeter_connected) { @@ -612,6 +647,8 @@ display_connect (Display *display, const gchar **theme, const gchar **session, c } *theme = g_build_filename (THEME_DIR, display->priv->greeter_theme, "index.theme", NULL); + *language = g_strdup (display->priv->default_language); + *layout = g_strdup (display->priv->default_layout); *session = g_strdup (display->priv->default_session); *username = g_strdup (display->priv->default_user); *delay = display->priv->timeout; @@ -842,6 +879,8 @@ display_init (Display *display) display->priv = G_TYPE_INSTANCE_GET_PRIVATE (display, DISPLAY_TYPE, DisplayPrivate); display->priv->greeter_user = g_strdup (GREETER_USER); display->priv->greeter_theme = g_strdup (GREETER_THEME); + display->priv->default_language = getenv ("LANG") ? getenv ("LANG") : g_strdup ("C"); + display->priv->default_layout = g_strdup ("us"); // FIXME: Is there a better default to get? display->priv->default_session = g_strdup (DEFAULT_SESSION); } @@ -869,6 +908,8 @@ display_finalize (GObject *object) g_free (self->priv->greeter_user); g_free (self->priv->greeter_theme); g_free (self->priv->default_user); + g_free (self->priv->default_language); + g_free (self->priv->default_layout); g_free (self->priv->default_session); } diff --git a/src/display.h b/src/display.h index 92b6999b..f0aae666 100644 --- a/src/display.h +++ b/src/display.h @@ -67,6 +67,14 @@ void display_set_greeter_theme (Display *display, const gchar *greeter_theme); const gchar *display_get_greeter_theme (Display *display); +void display_set_default_language (Display *display, const gchar *language); + +const gchar *display_get_default_language (Display *display); + +void display_set_default_layout (Display *display, const gchar *layout); + +const gchar *display_get_default_layout (Display *display); + void display_set_default_session (Display *display, const gchar *session); const gchar *display_get_default_session (Display *display); @@ -79,7 +87,7 @@ gboolean display_start (Display *display); // FIXME: Make greeter its own object? -gboolean display_connect (Display *display, const gchar **theme, const gchar **session, const gchar **username, gint *delay, GError *error); +gboolean display_connect (Display *display, const gchar **theme, const gchar **language, const gchar **layout, const gchar **session, const gchar **username, gint *delay, GError *error); gboolean display_start_authentication (Display *display, const gchar *username, DBusGMethodInvocation *context); diff --git a/src/display.xml b/src/display.xml index 24687a00..abcc595b 100644 --- a/src/display.xml +++ b/src/display.xml @@ -8,6 +8,8 @@ + + -- 2.39.2