[gdm] server: pass seat id to server
- From: Lennart Poettering <lpoetter src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm] server: pass seat id to server
- Date: Tue, 7 Feb 2012 22:33:44 +0000 (UTC)
commit 51a27a199e36fcb5e90e8332c1f025e8a282fbd5
Author: Lennart Poettering <lennart poettering net>
Date: Wed Jul 27 04:06:10 2011 +0200
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-factory-slave.c | 4 +++-
daemon/gdm-product-slave.c | 4 +++-
daemon/gdm-server.c | 37 ++++++++++++++++++++++++++++++++++++-
daemon/gdm-server.h | 1 +
daemon/gdm-simple-slave.c | 4 +++-
5 files changed, 46 insertions(+), 4 deletions(-)
---
diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c
index 6154cd3..3538627 100644
--- a/daemon/gdm-factory-slave.c
+++ b/daemon/gdm-factory-slave.c
@@ -674,12 +674,14 @@ static gboolean
gdm_factory_slave_run (GdmFactorySlave *slave)
{
char *display_name;
+ char *seat_id;
char *auth_file;
gboolean display_is_local;
g_object_get (slave,
"display-is-local", &display_is_local,
"display-name", &display_name,
+ "display-seat-id", &seat_id,
"display-x11-authority-file", &auth_file,
NULL);
@@ -688,7 +690,7 @@ gdm_factory_slave_run (GdmFactorySlave *slave)
if (display_is_local) {
gboolean res;
- slave->priv->server = gdm_server_new (display_name, auth_file);
+ slave->priv->server = gdm_server_new (display_name, seat_id, auth_file);
g_signal_connect (slave->priv->server,
"exited",
G_CALLBACK (on_server_exited),
diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
index 629c6e7..844af48 100644
--- a/daemon/gdm-product-slave.c
+++ b/daemon/gdm-product-slave.c
@@ -479,11 +479,13 @@ gdm_product_slave_create_server (GdmProductSlave *slave)
{
char *display_name;
char *auth_file;
+ char *seat_id;
gboolean display_is_local;
g_object_get (slave,
"display-is-local", &display_is_local,
"display-name", &display_name,
+ "display-seat-id", &seat_id,
"display-x11-authority-file", &auth_file,
NULL);
@@ -492,7 +494,7 @@ gdm_product_slave_create_server (GdmProductSlave *slave)
if (display_is_local) {
gboolean res;
- slave->priv->server = gdm_server_new (display_name, auth_file);
+ slave->priv->server = gdm_server_new (display_name, seat_id, auth_file);
g_signal_connect (slave->priv->server,
"exited",
G_CALLBACK (on_server_exited),
diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c
index 62ffca1..9a11ba0 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);
diff --git a/daemon/gdm-server.h b/daemon/gdm-server.h
index 535a69a..b53d68e 100644
--- a/daemon/gdm-server.h
+++ b/daemon/gdm-server.h
@@ -54,6 +54,7 @@ typedef struct
GType gdm_server_get_type (void);
GdmServer * gdm_server_new (const char *display_id,
+ const char *seat_id,
const char *auth_file);
gboolean gdm_server_start (GdmServer *server);
gboolean gdm_server_stop (GdmServer *server);
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index 873b7f9..9d1347a 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -1437,11 +1437,13 @@ gdm_simple_slave_run (GdmSimpleSlave *slave)
{
char *display_name;
char *auth_file;
+ char *seat_id;
gboolean display_is_local;
g_object_get (slave,
"display-is-local", &display_is_local,
"display-name", &display_name,
+ "display-seat-id", &seat_id,
"display-x11-authority-file", &auth_file,
NULL);
@@ -1451,7 +1453,7 @@ gdm_simple_slave_run (GdmSimpleSlave *slave)
gboolean res;
gboolean disable_tcp;
- slave->priv->server = gdm_server_new (display_name, auth_file);
+ slave->priv->server = gdm_server_new (display_name, seat_id, auth_file);
disable_tcp = TRUE;
if (gdm_settings_client_get_boolean (GDM_KEY_DISALLOW_TCP,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]