[gdm] server: pass seat id to server



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]