summaryrefslogtreecommitdiff
path: root/daemon/gdm-server.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-07-27 04:06:10 +0200
committerLennart Poettering <lennart@poettering.net>2012-02-07 22:57:11 +0100
commit51a27a199e36fcb5e90e8332c1f025e8a282fbd5 (patch)
treeb07707ab08c8ccbd9e39b651caa9bca9da1c2dfc /daemon/gdm-server.c
parent6e9fb3fb4df7d05c803cc01fe638eb9cf88c4beb (diff)
downloadgdm-51a27a199e36fcb5e90e8332c1f025e8a282fbd5.tar.gz
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.
Diffstat (limited to 'daemon/gdm-server.c')
-rw-r--r--daemon/gdm-server.c37
1 files changed, 36 insertions, 1 deletions
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 <sys/prctl.h>
#endif
+#ifdef WITH_SYSTEMD
+#include <systemd/sd-daemon.h>
+#endif
+
#include <glib.h>
#include <glib/gi18n.h>
#include <glib/gstdio.h>
@@ -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");
@@ -753,6 +764,14 @@ _gdm_server_set_display_name (GdmServer *server,
}
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));
@@ -889,6 +914,13 @@ gdm_server_class_init (GdmServerClass *klass)
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",
"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);