From 51a27a199e36fcb5e90e8332c1f025e8a282fbd5 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 27 Jul 2011 04:06:10 +0200 Subject: server: pass seat id to server When we spawn a new X server, let's pass the seat id to it via the "-seat" parameter, which has been available since a while in upstream Xorg. -seat causes the X server to only make use of hardware that is assigned to the seat specified, and leave all other hardware untouched. --- daemon/gdm-server.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'daemon/gdm-server.c') diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c index 62ffca13..9a11ba0d 100644 --- a/daemon/gdm-server.c +++ b/daemon/gdm-server.c @@ -38,6 +38,10 @@ #include #endif +#ifdef WITH_SYSTEMD +#include +#endif + #include #include #include @@ -77,6 +81,7 @@ struct GdmServerPrivate char *log_dir; char *display_name; char *display_device; + char *display_seat_id; char *auth_file; gboolean is_parented; @@ -90,6 +95,7 @@ struct GdmServerPrivate enum { PROP_0, PROP_DISPLAY_NAME, + PROP_DISPLAY_SEAT_ID, PROP_DISPLAY_DEVICE, PROP_AUTH_FILE, PROP_IS_PARENTED, @@ -284,7 +290,7 @@ gdm_server_resolve_command_line (GdmServer *server, query_in_arglist = TRUE; } - argv = g_renew (char *, argv, len + 10); + argv = g_renew (char *, argv, len + 12); /* shift args down one */ for (i = len - 1; i >= 1; i--) { argv[i+1] = argv[i]; @@ -299,6 +305,11 @@ gdm_server_resolve_command_line (GdmServer *server, argv[len++] = g_strdup (server->priv->auth_file); } + if (sd_booted () > 0 && server->priv->display_seat_id != NULL) { + argv[len++] = g_strdup ("-seat"); + argv[len++] = g_strdup (server->priv->display_seat_id); + } + if (server->priv->chosen_hostname) { /* run just one session */ argv[len++] = g_strdup ("-terminate"); @@ -752,6 +763,14 @@ _gdm_server_set_display_name (GdmServer *server, server->priv->display_name = g_strdup (name); } +static void +_gdm_server_set_display_seat_id (GdmServer *server, + const char *name) +{ + g_free (server->priv->display_seat_id); + server->priv->display_seat_id = g_strdup (name); +} + static void _gdm_server_set_auth_file (GdmServer *server, const char *auth_file) @@ -789,6 +808,9 @@ gdm_server_set_property (GObject *object, case PROP_DISPLAY_NAME: _gdm_server_set_display_name (self, g_value_get_string (value)); break; + case PROP_DISPLAY_SEAT_ID: + _gdm_server_set_display_seat_id (self, g_value_get_string (value)); + break; case PROP_AUTH_FILE: _gdm_server_set_auth_file (self, g_value_get_string (value)); break; @@ -818,6 +840,9 @@ gdm_server_get_property (GObject *object, case PROP_DISPLAY_NAME: g_value_set_string (value, self->priv->display_name); break; + case PROP_DISPLAY_SEAT_ID: + g_value_set_string (value, self->priv->display_seat_id); + break; case PROP_DISPLAY_DEVICE: g_value_take_string (value, gdm_server_get_display_device (self)); @@ -888,6 +913,13 @@ gdm_server_class_init (GdmServerClass *klass) "name", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (object_class, + PROP_DISPLAY_SEAT_ID, + g_param_spec_string ("display-seat-id", + "Seat ID", + "ID of the seat this display is running on", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, PROP_DISPLAY_DEVICE, g_param_spec_string ("display-device", @@ -954,6 +986,7 @@ gdm_server_finalize (GObject *object) g_free (server->priv->session_args); g_free (server->priv->log_dir); g_free (server->priv->display_name); + g_free (server->priv->display_seat_id); g_free (server->priv->display_device); g_free (server->priv->auth_file); g_free (server->priv->parent_display_name); @@ -965,12 +998,14 @@ gdm_server_finalize (GObject *object) GdmServer * gdm_server_new (const char *display_name, + const char *seat_id, const char *auth_file) { GObject *object; object = g_object_new (GDM_TYPE_SERVER, "display-name", display_name, + "display-seat-id", seat_id, "auth-file", auth_file, NULL); -- cgit v1.2.1