summaryrefslogtreecommitdiff
path: root/daemon/gdm-session-direct.c
diff options
context:
space:
mode:
authorMatthias Clasen <matthiasc@src.gnome.org>2008-05-05 15:21:26 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2008-05-05 15:21:26 +0000
commit500d2c5f233e126f666de934900b25dfd690764d (patch)
treed606a000905301d68c866cde7143664998e49963 /daemon/gdm-session-direct.c
parent4404c50fc8e954c36044be49449d9881ea829fa3 (diff)
downloadgdm-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.c93
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;
}