diff options
-rw-r--r-- | configure.ac | 6 | ||||
-rw-r--r-- | daemon/gdm-server.c | 50 |
2 files changed, 54 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac index dec31a94..855948d2 100644 --- a/configure.ac +++ b/configure.ac @@ -939,7 +939,7 @@ use_systemd=no if test "x$with_systemd" != "xno" ; then PKG_CHECK_MODULES(SYSTEMD, libsystemd-daemon - libsystemd-login + libsystemd-login >= 39 ) AC_SUBST(SYSTEMD_CFLAGS) AC_SUBST(SYSTEMD_LIBS) @@ -950,6 +950,10 @@ fi AM_CONDITIONAL(WITH_SYSTEMD, test x$use_systemd = xyes) AC_SUBST(WITH_SYSTEMD) +AC_PATH_PROG(SYSTEMD_X_SERVER, systemd-multi-seat-x, [/lib/systemd/systemd-multi-seat-x], [/lib/systemd:/usr/lib/systemd:$PATH]) +AC_SUBST(SYSTEMD_X_SERVER) +AC_DEFINE_UNQUOTED(SYSTEMD_X_SERVER,"$SYSTEMD_X_SERVER",[Path to systemd X server wrapper]) + dnl --------------------------------------------------------------------------- dnl - Check for D-Bus dnl --------------------------------------------------------------------------- diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c index 9a11ba0d..54bf8b38 100644 --- a/daemon/gdm-server.c +++ b/daemon/gdm-server.c @@ -260,6 +260,52 @@ connect_to_parent (GdmServer *server) } #endif +static void +gdm_server_init_command (GdmServer *server) +{ + + if (server->priv->command != NULL) { + return; + } + +#ifdef WITH_SYSTEMD + + /* This is a temporary hack to work around the fact that XOrg + * currently lacks support for multi-seat hotplugging for + * display devices. This bit should be removed as soon as XOrg + * gains native support for automatically enumerating usb + * based graphics adapters at start-up via udev. */ + + /* systemd ships an X server wrapper tool which simply invokes + * the usual X but ensures it only uses the display devices of + * the seat. */ + + /* We do not rely on this wrapper server if, a) the machine + * wasn't booted using systemd, or b) the wrapper tool is + * missing, or c) we are running for the main seat 'seat0'. */ + + if (sd_booted () <= 0) { + goto fallback; + } + + if (g_access (SYSTEMD_X_SERVER, X_OK) < 0) { + goto fallback; + } + + if (server->priv->display_seat_id == NULL || + strcmp (server->priv->display_seat_id, "seat0") == 0) { + goto fallback; + } + + server->priv->command = g_strdup (SYSTEMD_X_SERVER " -br -verbose -logverbose 7"); + return; + +fallback: +#endif + + server->priv->command = g_strdup (X_SERVER " -br -verbose -logverbose 7"); +} + static gboolean gdm_server_resolve_command_line (GdmServer *server, const char *vtarg, @@ -273,6 +319,8 @@ gdm_server_resolve_command_line (GdmServer *server, gboolean gotvtarg = FALSE; gboolean query_in_arglist = FALSE; + gdm_server_init_command (server); + g_shell_parse_argv (server->priv->command, &argc, &argv, NULL); for (len = 0; argv != NULL && argv[len] != NULL; len++) { @@ -959,7 +1007,7 @@ gdm_server_init (GdmServer *server) server->priv = GDM_SERVER_GET_PRIVATE (server); server->priv->pid = -1; - server->priv->command = g_strdup (X_SERVER " -br -verbose -logverbose 7"); + server->priv->log_dir = g_strdup (LOGDIR); add_ready_handler (server); |