summaryrefslogtreecommitdiff
path: root/daemon
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
parent4404c50fc8e954c36044be49449d9881ea829fa3 (diff)
downloadgdm-500d2c5f233e126f666de934900b25dfd690764d.tar.gz
Add a keyboard chooser
svn path=/trunk/; revision=6212
Diffstat (limited to 'daemon')
-rw-r--r--daemon/gdm-factory-slave.c12
-rw-r--r--daemon/gdm-greeter-server.c52
-rw-r--r--daemon/gdm-greeter-server.h4
-rw-r--r--daemon/gdm-product-slave.c24
-rw-r--r--daemon/gdm-session-direct.c93
-rw-r--r--daemon/gdm-session-private.h2
-rw-r--r--daemon/gdm-session-relay.c12
-rw-r--r--daemon/gdm-session-settings.c59
-rw-r--r--daemon/gdm-session-settings.h3
-rw-r--r--daemon/gdm-session-worker.c49
-rw-r--r--daemon/gdm-session.c30
-rw-r--r--daemon/gdm-session.h6
-rw-r--r--daemon/gdm-simple-slave.c27
13 files changed, 372 insertions, 1 deletions
diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c
index 95ed5bdf..799d5013 100644
--- a/daemon/gdm-factory-slave.c
+++ b/daemon/gdm-factory-slave.c
@@ -416,6 +416,14 @@ on_greeter_language_selected (GdmGreeterServer *greeter_server,
}
static void
+on_greeter_layout_selected (GdmGreeterServer *greeter_server,
+ const char *text,
+ GdmFactorySlave *slave)
+{
+ gdm_session_select_layout (GDM_SESSION (slave->priv->session), text);
+}
+
+static void
on_greeter_user_selected (GdmGreeterServer *greeter_server,
const char *text,
GdmFactorySlave *slave)
@@ -505,6 +513,10 @@ run_greeter (GdmFactorySlave *slave)
G_CALLBACK (on_greeter_language_selected),
slave);
g_signal_connect (slave->priv->greeter_server,
+ "layout-selected",
+ G_CALLBACK (on_greeter_layout_selected),
+ slave);
+ g_signal_connect (slave->priv->greeter_server,
"user-selected",
G_CALLBACK (on_greeter_user_selected),
slave);
diff --git a/daemon/gdm-greeter-server.c b/daemon/gdm-greeter-server.c
index 0768a4a4..45376223 100644
--- a/daemon/gdm-greeter-server.c
+++ b/daemon/gdm-greeter-server.c
@@ -76,6 +76,7 @@ enum {
SESSION_SELECTED,
HOSTNAME_SELECTED,
LANGUAGE_SELECTED,
+ LAYOUT_SELECTED,
USER_SELECTED,
CANCELLED,
CONNECTED,
@@ -266,6 +267,13 @@ gdm_greeter_server_default_language_name_changed (GdmGreeterServer *greeter_serv
}
void
+gdm_greeter_server_default_layout_name_changed (GdmGreeterServer *greeter_server,
+ const char *layout_name)
+{
+ send_dbus_string_signal (greeter_server, "DefaultLayoutNameChanged", layout_name);
+}
+
+void
gdm_greeter_server_default_session_name_changed (GdmGreeterServer *greeter_server,
const char *session_name)
{
@@ -496,6 +504,33 @@ handle_select_language (GdmGreeterServer *greeter_server,
}
static DBusHandlerResult
+handle_select_layout (GdmGreeterServer *greeter_server,
+ DBusConnection *connection,
+ DBusMessage *message)
+{
+ DBusMessage *reply;
+ DBusError error;
+ const char *text;
+
+ dbus_error_init (&error);
+ if (! dbus_message_get_args (message, &error,
+ DBUS_TYPE_STRING, &text,
+ DBUS_TYPE_INVALID)) {
+ g_warning ("ERROR: %s", error.message);
+ }
+
+ g_debug ("GreeterServer: SelectLayout: %s", text);
+
+ reply = dbus_message_new_method_return (message);
+ dbus_connection_send (connection, reply, NULL);
+ dbus_message_unref (reply);
+
+ g_signal_emit (greeter_server, signals [LAYOUT_SELECTED], 0, text);
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusHandlerResult
handle_select_user (GdmGreeterServer *greeter_server,
DBusConnection *connection,
DBusMessage *message)
@@ -624,6 +659,8 @@ greeter_handle_child_message (DBusConnection *connection,
return handle_select_hostname (greeter_server, connection, message);
} else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "SelectLanguage")) {
return handle_select_language (greeter_server, connection, message);
+ } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "SelectLayout")) {
+ return handle_select_layout (greeter_server, connection, message);
} else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "SelectUser")) {
return handle_select_user (greeter_server, connection, message);
} else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "Cancel")) {
@@ -711,6 +748,10 @@ do_introspect (DBusConnection *connection,
" <signal name=\"DefaultLanguageNameChanged\">\n"
" <arg name=\"language_name\" type=\"s\"/>\n"
" </signal>\n"
+ " <signal name=\"DefaultLayoutNameChanged\">\n"
+ " <arg name=\"layout_name\" type=\"s\"/>\n"
+ " </signal>\n"
+ " <signal name=\"DefaultSessionNameChanged\">\n"
" <signal name=\"DefaultSessionNameChanged\">\n"
" <arg name=\"session_name\" type=\"s\"/>\n"
" </signal>\n"
@@ -1157,6 +1198,17 @@ gdm_greeter_server_class_init (GdmGreeterServerClass *klass)
G_TYPE_NONE,
1,
G_TYPE_STRING);
+ signals [LAYOUT_SELECTED] =
+ g_signal_new ("layout-selected",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmGreeterServerClass, layout_selected),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
signals [USER_SELECTED] =
g_signal_new ("user-selected",
G_OBJECT_CLASS_TYPE (object_class),
diff --git a/daemon/gdm-greeter-server.h b/daemon/gdm-greeter-server.h
index e6b33032..6e921006 100644
--- a/daemon/gdm-greeter-server.h
+++ b/daemon/gdm-greeter-server.h
@@ -57,6 +57,8 @@ typedef struct
const char *hostname);
void (* language_selected) (GdmGreeterServer *greeter_server,
const char *name);
+ void (* layout_selected) (GdmGreeterServer *greeter_server,
+ const char *name);
void (* user_selected) (GdmGreeterServer *greeter_server,
const char *name);
void (* cancelled) (GdmGreeterServer *greeter_server);
@@ -88,6 +90,8 @@ void gdm_greeter_server_selected_user_changed (GdmGreeterServer *
const char *text);
void gdm_greeter_server_default_language_name_changed (GdmGreeterServer *greeter_server,
const char *text);
+void gdm_greeter_server_default_layout_name_changed (GdmGreeterServer *greeter_server,
+ const char *text);
void gdm_greeter_server_default_session_name_changed (GdmGreeterServer *greeter_server,
const char *text);
diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
index 60711c49..9adcb09d 100644
--- a/daemon/gdm-product-slave.c
+++ b/daemon/gdm-product-slave.c
@@ -755,6 +755,28 @@ on_relay_language_selected (GdmProductSlave *slave,
}
static void
+on_relay_layout_selected (GdmProductSlave *slave,
+ DBusMessage *message)
+{
+ DBusError error;
+ const char *text;
+ dbus_bool_t res;
+
+ dbus_error_init (&error);
+ res = dbus_message_get_args (message,
+ &error,
+ DBUS_TYPE_STRING, &text,
+ DBUS_TYPE_INVALID);
+ if (res) {
+ g_debug ("GdmProductSlave: Layout selected %s", text);
+ gdm_session_select_layout (GDM_SESSION (slave->priv->session), text);
+ } else {
+ g_warning ("Unable to get arguments: %s", error.message);
+ dbus_error_free (&error);
+ }
+}
+
+static void
on_relay_user_selected (GdmProductSlave *slave,
DBusMessage *message)
{
@@ -963,6 +985,8 @@ relay_dbus_handle_message (DBusConnection *connection,
on_relay_session_selected (slave, message);
} else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "LanguageSelected")) {
on_relay_language_selected (slave, message);
+ } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "LayoutSelected")) {
+ on_relay_layout_selected (slave, message);
} else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "UserSelected")) {
on_relay_user_selected (slave, message);
} else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "StartSession")) {
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;
}
diff --git a/daemon/gdm-session-private.h b/daemon/gdm-session-private.h
index 175fa4d6..6a6fcfc8 100644
--- a/daemon/gdm-session-private.h
+++ b/daemon/gdm-session-private.h
@@ -56,6 +56,8 @@ void _gdm_session_closed (GdmSession *sessio
/* user settings read from ~/.dmrc / system defaults */
void _gdm_session_default_language_name_changed (GdmSession *session,
const char *language_name);
+void _gdm_session_default_layout_name_changed (GdmSession *session,
+ const char *layout_name);
void _gdm_session_default_session_name_changed (GdmSession *session,
const char *session_name);
/* user is selected/changed internally */
diff --git a/daemon/gdm-session-relay.c b/daemon/gdm-session-relay.c
index 8fa97f9a..b57bf893 100644
--- a/daemon/gdm-session-relay.c
+++ b/daemon/gdm-session-relay.c
@@ -267,6 +267,14 @@ gdm_session_relay_select_language (GdmSession *session,
}
static void
+gdm_session_relay_select_layout (GdmSession *session,
+ const char *text)
+{
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
+ send_dbus_string_signal (impl, "LayoutSelected", text);
+}
+
+static void
gdm_session_relay_select_user (GdmSession *session,
const char *text)
{
@@ -814,6 +822,9 @@ do_introspect (DBusConnection *connection,
" <signal name=\"LanguageSelected\">\n"
" <arg name=\"language\" type=\"s\"/>\n"
" </signal>\n"
+ " <signal name=\"LayoutSelected\">\n"
+ " <arg name=\"layout\" type=\"s\"/>\n"
+ " </signal>\n"
" <signal name=\"SessionSelected\">\n"
" <arg name=\"session\" type=\"s\"/>\n"
" </signal>\n"
@@ -1108,6 +1119,7 @@ gdm_session_iface_init (GdmSessionIface *iface)
iface->answer_query = gdm_session_relay_answer_query;
iface->select_session = gdm_session_relay_select_session;
iface->select_language = gdm_session_relay_select_language;
+ iface->select_layout = gdm_session_relay_select_layout;
iface->select_user = gdm_session_relay_select_user;
}
diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c
index 1534949c..b6c04f7c 100644
--- a/daemon/gdm-session-settings.c
+++ b/daemon/gdm-session-settings.c
@@ -36,6 +36,7 @@ struct _GdmSessionSettingsPrivate
{
char *session_name;
char *language_name;
+ char *layout_name;
};
static void gdm_session_settings_finalize (GObject *object);
@@ -55,6 +56,7 @@ enum {
PROP_0 = 0,
PROP_SESSION_NAME,
PROP_LANGUAGE_NAME,
+ PROP_LAYOUT_NAME,
};
G_DEFINE_TYPE (GdmSessionSettings, gdm_session_settings, G_TYPE_OBJECT)
@@ -93,6 +95,11 @@ gdm_session_settings_class_install_properties (GdmSessionSettingsClass *settings
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property (object_class, PROP_LANGUAGE_NAME, param_spec);
+ param_spec = g_param_spec_string ("layout-name", "Keyboard Layout Name",
+ "The name of the keyboard layout",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_LAYOUT_NAME, param_spec);
}
static void
@@ -114,6 +121,7 @@ gdm_session_settings_finalize (GObject *object)
g_free (settings->priv->session_name);
g_free (settings->priv->language_name);
+ g_free (settings->priv->layout_name);
parent_class = G_OBJECT_CLASS (gdm_session_settings_parent_class);
@@ -136,6 +144,19 @@ gdm_session_settings_set_language_name (GdmSessionSettings *settings,
}
void
+gdm_session_settings_set_layout_name (GdmSessionSettings *settings,
+ const char *layout_name)
+{
+ g_return_if_fail (GDM_IS_SESSION_SETTINGS (settings));
+
+ if (settings->priv->layout_name == NULL ||
+ strcmp (settings->priv->layout_name, layout_name) != 0) {
+ settings->priv->layout_name = g_strdup (layout_name);
+ g_object_notify (G_OBJECT (settings), "layout-name");
+ }
+}
+
+void
gdm_session_settings_set_session_name (GdmSessionSettings *settings,
const char *session_name)
{
@@ -156,6 +177,13 @@ gdm_session_settings_get_language_name (GdmSessionSettings *settings)
}
char *
+gdm_session_settings_get_layout_name (GdmSessionSettings *settings)
+{
+ g_return_val_if_fail (GDM_IS_SESSION_SETTINGS (settings), NULL);
+ return g_strdup (settings->priv->layout_name);
+}
+
+char *
gdm_session_settings_get_session_name (GdmSessionSettings *settings)
{
g_return_val_if_fail (GDM_IS_SESSION_SETTINGS (settings), NULL);
@@ -177,6 +205,10 @@ gdm_session_settings_set_property (GObject *object,
gdm_session_settings_set_language_name (settings, g_value_get_string (value));
break;
+ case PROP_LAYOUT_NAME:
+ gdm_session_settings_set_layout_name (settings, g_value_get_string (value));
+ break;
+
case PROP_SESSION_NAME:
gdm_session_settings_set_session_name (settings, g_value_get_string (value));
break;
@@ -205,6 +237,10 @@ gdm_session_settings_get_property (GObject *object,
g_value_set_string (value, settings->priv->language_name);
break;
+ case PROP_LAYOUT_NAME:
+ g_value_set_string (value, settings->priv->layout_name);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -225,7 +261,8 @@ gboolean
gdm_session_settings_is_loaded (GdmSessionSettings *settings)
{
return settings->priv->session_name != NULL ||
- settings->priv->language_name != NULL;
+ settings->priv->language_name != NULL ||
+ settings->priv->layout_name != NULL;
}
gboolean
@@ -238,6 +275,7 @@ gdm_session_settings_load (GdmSessionSettings *settings,
gboolean is_loaded;
char *session_name;
char *language_name;
+ char *layout_name;
char *filename;
g_return_val_if_fail (settings != NULL, FALSE);
@@ -283,6 +321,20 @@ gdm_session_settings_load (GdmSessionSettings *settings,
goto out;
}
+ layout_name = g_key_file_get_string (key_file, "Desktop", "Layout",
+ &load_error);
+
+ if (layout_name != NULL) {
+ gdm_session_settings_set_layout_name (settings, layout_name);
+ g_free (layout_name);
+ } else if (g_error_matches (load_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
+ g_error_free (load_error);
+ load_error = NULL;
+ } else {
+ g_propagate_error (error, load_error);
+ goto out;
+ }
+
is_loaded = TRUE;
out:
g_key_file_free (key_file);
@@ -327,6 +379,11 @@ gdm_session_settings_save (GdmSessionSettings *settings,
settings->priv->language_name);
}
+ if (settings->priv->layout_name != NULL) {
+ g_key_file_set_string (key_file, "Desktop", "Layout",
+ settings->priv->layout_name);
+ }
+
contents = g_key_file_to_data (key_file, &length, &file_error);
if (contents == NULL) {
diff --git a/daemon/gdm-session-settings.h b/daemon/gdm-session-settings.h
index 46438f33..a5465984 100644
--- a/daemon/gdm-session-settings.h
+++ b/daemon/gdm-session-settings.h
@@ -61,9 +61,12 @@ gboolean gdm_session_settings_save (GdmSessionSettings
GError **error);
gboolean gdm_session_settings_is_loaded (GdmSessionSettings *settings);
char *gdm_session_settings_get_language_name (GdmSessionSettings *settings);
+char *gdm_session_settings_get_layout_name (GdmSessionSettings *settings);
char *gdm_session_settings_get_session_name (GdmSessionSettings *settings);
void gdm_session_settings_set_language_name (GdmSessionSettings *settings,
const char *language_name);
+void gdm_session_settings_set_layout_name (GdmSessionSettings *settings,
+ const char *layout_name);
void gdm_session_settings_set_session_name (GdmSessionSettings *settings,
const char *session_name);
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index b83e912c..e0ce9fe6 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -1785,6 +1785,14 @@ gdm_session_worker_set_language_name (GdmSessionWorker *worker,
}
static void
+gdm_session_worker_set_layout_name (GdmSessionWorker *worker,
+ const char *layout_name)
+{
+ gdm_session_settings_set_layout_name (worker->priv->user_settings,
+ layout_name);
+}
+
+static void
on_set_language_name (GdmSessionWorker *worker,
DBusMessage *message)
{
@@ -1807,6 +1815,28 @@ on_set_language_name (GdmSessionWorker *worker,
}
static void
+on_set_layout_name (GdmSessionWorker *worker,
+ DBusMessage *message)
+{
+ DBusError error;
+ const char *layout_name;
+ dbus_bool_t res;
+
+ dbus_error_init (&error);
+ res = dbus_message_get_args (message,
+ &error,
+ DBUS_TYPE_STRING, &layout_name,
+ DBUS_TYPE_INVALID);
+ if (res) {
+ g_debug ("GdmSessionWorker: layout name set to %s", layout_name);
+ gdm_session_worker_set_layout_name (worker, layout_name);
+ } else {
+ g_warning ("Unable to get arguments: %s", error.message);
+ dbus_error_free (&error);
+ }
+}
+
+static void
on_saved_language_name_read (GdmSessionWorker *worker)
{
char *language_name;
@@ -1819,6 +1849,18 @@ on_saved_language_name_read (GdmSessionWorker *worker)
}
static void
+on_saved_layout_name_read (GdmSessionWorker *worker)
+{
+ char *layout_name;
+
+ layout_name = gdm_session_settings_get_layout_name (worker->priv->user_settings);
+ send_dbus_string_method (worker->priv->connection,
+ "SavedLayoutNameRead",
+ layout_name);
+ g_free (layout_name);
+}
+
+static void
on_saved_session_name_read (GdmSessionWorker *worker)
{
char *session_name;
@@ -1844,6 +1886,11 @@ do_setup (GdmSessionWorker *worker)
worker);
g_signal_connect_swapped (worker->priv->user_settings,
+ "notify::layout-name",
+ G_CALLBACK (on_saved_layout_name_read),
+ worker);
+
+ g_signal_connect_swapped (worker->priv->user_settings,
"notify::session-name",
G_CALLBACK (on_saved_session_name_read),
worker);
@@ -2300,6 +2347,8 @@ worker_dbus_handle_message (DBusConnection *connection,
on_set_environment_variable (worker, message);
} else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetLanguageName")) {
on_set_language_name (worker, message);
+ } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetLayoutName")) {
+ on_set_layout_name (worker, message);
} else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetSessionName")) {
on_set_session_name (worker, message);
} else {
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 2a4c7bd4..feb79385 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -50,6 +50,7 @@ enum {
SESSION_DIED,
SELECTED_USER_CHANGED,
DEFAULT_LANGUAGE_NAME_CHANGED,
+ DEFAULT_LAYOUT_NAME_CHANGED,
DEFAULT_SESSION_NAME_CHANGED,
LAST_SIGNAL
};
@@ -164,6 +165,15 @@ gdm_session_select_language (GdmSession *session,
}
void
+gdm_session_select_layout (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->select_layout (session, text);
+}
+
+void
gdm_session_select_user (GdmSession *session,
const char *text)
{
@@ -429,6 +439,17 @@ gdm_session_class_init (gpointer g_iface)
G_TYPE_NONE,
1,
G_TYPE_STRING);
+ signals [DEFAULT_LAYOUT_NAME_CHANGED] =
+ g_signal_new ("default-layout-name-changed",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, default_layout_name_changed),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
signals [DEFAULT_SESSION_NAME_CHANGED] =
g_signal_new ("default-session-name-changed",
iface_type,
@@ -610,6 +631,15 @@ _gdm_session_default_language_name_changed (GdmSession *session,
}
void
+_gdm_session_default_layout_name_changed (GdmSession *session,
+ const char *layout_name)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ g_signal_emit (session, signals [DEFAULT_LAYOUT_NAME_CHANGED], 0, layout_name);
+}
+
+void
_gdm_session_default_session_name_changed (GdmSession *session,
const char *session_name)
{
diff --git a/daemon/gdm-session.h b/daemon/gdm-session.h
index 2a9abe01..dfb7e273 100644
--- a/daemon/gdm-session.h
+++ b/daemon/gdm-session.h
@@ -60,6 +60,8 @@ struct _GdmSessionIface
const char *text);
void (* select_language) (GdmSession *session,
const char *text);
+ void (* select_layout) (GdmSession *session,
+ const char *text);
void (* select_session) (GdmSession *session,
const char *text);
void (* select_user) (GdmSession *session,
@@ -108,6 +110,8 @@ struct _GdmSessionIface
void (* default_language_name_changed) (GdmSession *session,
const char *text);
+ void (* default_layout_name_changed) (GdmSession *session,
+ const char *text);
void (* default_session_name_changed) (GdmSession *session,
const char *text);
};
@@ -134,6 +138,8 @@ void gdm_session_select_session (GdmSession *session,
const char *session_name);
void gdm_session_select_language (GdmSession *session,
const char *language);
+void gdm_session_select_layout (GdmSession *session,
+ const char *language);
void gdm_session_select_user (GdmSession *session,
const char *username);
void gdm_session_cancel (GdmSession *session);
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index a0650e36..42f4a1b0 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -485,6 +485,16 @@ on_default_language_name_changed (GdmSession *session,
}
static void
+on_default_layout_name_changed (GdmSession *session,
+ const char *text,
+ GdmSimpleSlave *slave)
+{
+ g_debug ("GdmSimpleSlave: Default layout name changed: %s", text);
+
+ gdm_greeter_server_default_layout_name_changed (slave->priv->greeter_server, text);
+}
+
+static void
on_default_session_name_changed (GdmSession *session,
const char *text,
GdmSimpleSlave *slave)
@@ -619,6 +629,11 @@ create_new_session (GdmSimpleSlave *slave)
slave);
g_signal_connect (slave->priv->session,
+ "default-layout-name-changed",
+ G_CALLBACK (on_default_layout_name_changed),
+ slave);
+
+ g_signal_connect (slave->priv->session,
"default-session-name-changed",
G_CALLBACK (on_default_session_name_changed),
slave);
@@ -713,6 +728,14 @@ on_greeter_language_selected (GdmGreeterServer *greeter_server,
}
static void
+on_greeter_layout_selected (GdmGreeterServer *greeter_server,
+ const char *text,
+ GdmSimpleSlave *slave)
+{
+ gdm_session_select_layout (GDM_SESSION (slave->priv->session), text);
+}
+
+static void
on_greeter_user_selected (GdmGreeterServer *greeter_server,
const char *text,
GdmSimpleSlave *slave)
@@ -847,6 +870,10 @@ run_greeter (GdmSimpleSlave *slave)
G_CALLBACK (on_greeter_language_selected),
slave);
g_signal_connect (slave->priv->greeter_server,
+ "layout-selected",
+ G_CALLBACK (on_greeter_layout_selected),
+ slave);
+ g_signal_connect (slave->priv->greeter_server,
"user-selected",
G_CALLBACK (on_greeter_user_selected),
slave);