diff options
author | Matthias Clasen <matthiasc@src.gnome.org> | 2008-05-05 15:21:26 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2008-05-05 15:21:26 +0000 |
commit | 500d2c5f233e126f666de934900b25dfd690764d (patch) | |
tree | d606a000905301d68c866cde7143664998e49963 /daemon/gdm-session-direct.c | |
parent | 4404c50fc8e954c36044be49449d9881ea829fa3 (diff) | |
download | gdm-500d2c5f233e126f666de934900b25dfd690764d.tar.gz |
Add a keyboard chooser
svn path=/trunk/; revision=6212
Diffstat (limited to 'daemon/gdm-session-direct.c')
-rw-r--r-- | daemon/gdm-session-direct.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c index b566879c..76722882 100644 --- a/daemon/gdm-session-direct.c +++ b/daemon/gdm-session-direct.c @@ -70,6 +70,8 @@ struct _GdmSessionDirectPrivate char *saved_session; char *selected_language; char *saved_language; + char *selected_layout; + char *saved_layout; char *selected_user; char *user_x11_authority_file; @@ -596,6 +598,16 @@ get_default_language_name (GdmSessionDirect *session) return setlocale (LC_MESSAGES, NULL); } +static const char * +get_default_layout_name (GdmSessionDirect *session) +{ + if (session->priv->saved_layout != NULL) { + return session->priv->saved_layout; + } + + return "us"; +} + static char * get_fallback_session_name (void) { @@ -661,6 +673,8 @@ gdm_session_direct_defaults_changed (GdmSessionDirect *session) { _gdm_session_default_language_name_changed (GDM_SESSION (session), get_default_language_name (session)); + _gdm_session_default_layout_name_changed (GDM_SESSION (session), + get_default_layout_name (session)); _gdm_session_default_session_name_changed (GDM_SESSION (session), get_default_session_name (session)); } @@ -681,6 +695,9 @@ gdm_session_direct_select_user (GdmSession *session, g_free (impl->priv->saved_language); impl->priv->saved_language = NULL; + + g_free (impl->priv->saved_layout); + impl->priv->saved_layout = NULL; } static DBusHandlerResult @@ -1035,6 +1052,39 @@ gdm_session_direct_handle_saved_language_name_read (GdmSessionDirect *session, } static DBusHandlerResult +gdm_session_direct_handle_saved_layout_name_read (GdmSessionDirect *session, + DBusConnection *connection, + DBusMessage *message) +{ + DBusMessage *reply; + DBusError error; + const char *layout_name; + + dbus_error_init (&error); + if (! dbus_message_get_args (message, &error, + DBUS_TYPE_STRING, &layout_name, + DBUS_TYPE_INVALID)) { + g_warning ("ERROR: %s", error.message); + } + + reply = dbus_message_new_method_return (message); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + + if (strcmp (layout_name, + get_default_layout_name (session)) != 0) { + g_free (session->priv->saved_layout); + session->priv->saved_layout = g_strdup (layout_name); + + _gdm_session_default_layout_name_changed (GDM_SESSION (session), + layout_name); + } + + + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult gdm_session_direct_handle_saved_session_name_read (GdmSessionDirect *session, DBusConnection *connection, DBusMessage *message) @@ -1135,6 +1185,8 @@ session_worker_message (DBusConnection *connection, return gdm_session_direct_handle_session_died (session, connection, message); } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SavedLanguageNameRead")) { return gdm_session_direct_handle_saved_language_name_read (session, connection, message); + } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SavedLayoutNameRead")) { + return gdm_session_direct_handle_saved_layout_name_read (session, connection, message); } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SavedSessionNameRead")) { return gdm_session_direct_handle_saved_session_name_read (session, connection, message); } @@ -1834,6 +1886,16 @@ get_language_name (GdmSessionDirect *session) } static const char * +get_layout_name (GdmSessionDirect *session) +{ + if (session->priv->selected_layout != NULL) { + return session->priv->selected_layout; + } + + return get_default_layout_name (session); +} + +static const char * get_session_name (GdmSessionDirect *session) { /* FIXME: test the session names before we use them? */ @@ -1975,6 +2037,10 @@ setup_session_environment (GdmSessionDirect *session) get_language_name (session)); gdm_session_direct_set_environment_variable (session, + "GDM_KEYBOARD_LAYOUT", + get_layout_name (session)); + + gdm_session_direct_set_environment_variable (session, "DISPLAY", session->priv->display_name); if (session_cookie != NULL) { @@ -2063,6 +2129,12 @@ gdm_session_direct_close (GdmSession *session) g_free (impl->priv->saved_language); impl->priv->saved_language = NULL; + g_free (impl->priv->selected_layout); + impl->priv->selected_layout = NULL; + + g_free (impl->priv->saved_layout); + impl->priv->saved_layout = NULL; + g_free (impl->priv->user_x11_authority_file); impl->priv->user_x11_authority_file = NULL; @@ -2139,6 +2211,24 @@ gdm_session_direct_select_language (GdmSession *session, } static void +gdm_session_direct_select_layout (GdmSession *session, + const char *text) +{ + GdmSessionDirect *impl = GDM_SESSION_DIRECT (session); + + g_free (impl->priv->selected_layout); + + if (strcmp (text, "__previous") == 0) { + impl->priv->selected_layout = NULL; + } else { + impl->priv->selected_layout = g_strdup (text); + } + + send_dbus_string_signal (impl, "SetLayoutName", + get_layout_name (impl)); +} + +static void _gdm_session_direct_set_display_id (GdmSessionDirect *session, const char *id) { @@ -2330,6 +2420,8 @@ gdm_session_direct_finalize (GObject *object) g_free (session->priv->saved_session); g_free (session->priv->selected_language); g_free (session->priv->saved_language); + g_free (session->priv->selected_layout); + g_free (session->priv->saved_layout); parent_class = G_OBJECT_CLASS (gdm_session_direct_parent_class); @@ -2405,6 +2497,7 @@ gdm_session_iface_init (GdmSessionIface *iface) iface->answer_query = gdm_session_direct_answer_query; iface->select_session = gdm_session_direct_select_session; iface->select_language = gdm_session_direct_select_language; + iface->select_layout = gdm_session_direct_select_layout; iface->select_user = gdm_session_direct_select_user; } |