223 lines
7.5 KiB
Diff
223 lines
7.5 KiB
Diff
From 5a555338bf11afb5942daabfdae8638e7aab2ac6 Mon Sep 17 00:00:00 2001
|
|
From: Lennart Poettering <lennart@poettering.net>
|
|
Date: Mon, 18 Jul 2011 21:19:23 +0200
|
|
Subject: [PATCH] config: add udev/systemd multi-seat support
|
|
|
|
Add support for multi-seat-aware input device hotplugging. This
|
|
implements the multi-seat scheme explained here:
|
|
|
|
http://www.freedesktop.org/wiki/Software/systemd/multiseat
|
|
|
|
This introduces a new X server switch "-seat" which allows configuration
|
|
of the seat to enumerate hotplugging devices on. If specified the value
|
|
of this parameter will also be exported as root window property
|
|
Xorg_Seat.
|
|
|
|
To properly support input hotplugging devices need to be tagged in udev
|
|
according to the seat they are on. Untagged devices are assumed to be on
|
|
the default seat "seat0". If no "-seat" parameter is passed only devices
|
|
on "seat0" are used. This means that the new scheme is perfectly
|
|
compatible with existing setups which have no tagged input devices.
|
|
|
|
Note that the -seat switch takes a completely generic identifier, and
|
|
that it has no effect on non-Linux systems. In fact, on other OSes a
|
|
completely different identifier scheme for seats could be used but still
|
|
be exposed with the Xorg_Seat and -seat.
|
|
|
|
I tried to follow the coding style of the surrounding code blocks if
|
|
there was any one could follow.
|
|
|
|
Signed-off-by: Lennart Poettering <lennart@poettering.net>
|
|
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
|
|
|
Conflicts:
|
|
|
|
config/udev.c
|
|
|
|
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
|
---
|
|
config/udev.c | 18 ++++++++++++++++++
|
|
hw/xfree86/common/xf86Init.c | 19 +++++++++++++++++++
|
|
include/globals.h | 2 +-
|
|
include/xserver-properties.h | 3 +++
|
|
man/Xserver.man | 6 ++++++
|
|
os/utils.c | 10 ++++++++++
|
|
6 files changed, 57 insertions(+), 1 deletions(-)
|
|
|
|
diff --git a/config/udev.c b/config/udev.c
|
|
index e7383dc..fc6ee5d 100644
|
|
--- a/config/udev.c
|
|
+++ b/config/udev.c
|
|
@@ -35,6 +35,7 @@
|
|
#include "hotplug.h"
|
|
#include "config-backends.h"
|
|
#include "os.h"
|
|
+#include "globals.h"
|
|
|
|
#define UDEV_XKB_PROP_KEY "xkb"
|
|
|
|
@@ -65,6 +66,7 @@ device_added(struct udev_device *udev_device)
|
|
struct udev_list_entry *set, *entry;
|
|
struct udev_device *parent;
|
|
int rc;
|
|
+ const char *dev_seat;
|
|
|
|
path = udev_device_get_devnode(udev_device);
|
|
|
|
@@ -73,6 +75,16 @@ device_added(struct udev_device *udev_device)
|
|
if (!path || !syspath)
|
|
return;
|
|
|
|
+ dev_seat = udev_device_get_property_value(udev_device, "ID_SEAT");
|
|
+ if (!dev_seat)
|
|
+ dev_seat = "seat0";
|
|
+
|
|
+ if (SeatId && strcmp(dev_seat, SeatId))
|
|
+ return;
|
|
+
|
|
+ if (!SeatId && strcmp(dev_seat, "seat0"))
|
|
+ return;
|
|
+
|
|
if (!udev_device_get_property_value(udev_device, "ID_INPUT")) {
|
|
LogMessageVerb(X_INFO, 10,
|
|
"config/udev: ignoring device %s without "
|
|
@@ -284,6 +296,9 @@ config_udev_init(void)
|
|
udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "input", NULL);
|
|
udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "tty", NULL); /* For Wacom serial devices */
|
|
|
|
+ if (SeatId && strcmp(SeatId, "seat0"))
|
|
+ udev_monitor_filter_add_match_tag(udev_monitor, SeatId);
|
|
+
|
|
if (udev_monitor_enable_receiving(udev_monitor)) {
|
|
ErrorF("config/udev: failed to bind the udev monitor\n");
|
|
return 0;
|
|
@@ -296,6 +311,9 @@ config_udev_init(void)
|
|
udev_enumerate_add_match_subsystem(enumerate, "input");
|
|
udev_enumerate_add_match_subsystem(enumerate, "tty");
|
|
|
|
+ if (SeatId && strcmp(SeatId, "seat0"))
|
|
+ udev_enumerate_add_match_tag(enumerate, SeatId);
|
|
+
|
|
udev_enumerate_scan_devices(enumerate);
|
|
devices = udev_enumerate_get_list_entry(enumerate);
|
|
udev_list_entry_foreach(device, devices) {
|
|
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
|
|
index 71926f8..a268ced 100644
|
|
--- a/hw/xfree86/common/xf86Init.c
|
|
+++ b/hw/xfree86/common/xf86Init.c
|
|
@@ -80,6 +80,7 @@
|
|
#include "xf86Bus.h"
|
|
#include "xf86VGAarbiter.h"
|
|
#include "globals.h"
|
|
+#include "xserver-properties.h"
|
|
|
|
#ifdef DPMSExtension
|
|
#include <X11/extensions/dpmsconst.h>
|
|
@@ -654,6 +655,24 @@ InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
|
|
}
|
|
}
|
|
|
|
+ if (SeatId) {
|
|
+ Atom SeatAtom;
|
|
+
|
|
+ SeatAtom = MakeAtom(SEAT_ATOM_NAME, sizeof(SEAT_ATOM_NAME) - 1, TRUE);
|
|
+
|
|
+ for (i = 0; i < xf86NumScreens; i++) {
|
|
+ int ret;
|
|
+
|
|
+ ret = xf86RegisterRootWindowProperty(xf86Screens[i]->scrnIndex,
|
|
+ SeatAtom, XA_STRING, 8,
|
|
+ strlen(SeatId)+1, SeatId );
|
|
+ if (ret != Success) {
|
|
+ xf86DrvMsg(xf86Screens[i]->scrnIndex, X_WARNING,
|
|
+ "Failed to register seat property\n");
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
/* If a screen uses depth 24, show what the pixmap format is */
|
|
for (i = 0; i < xf86NumScreens; i++) {
|
|
if (xf86Screens[i]->depth == 24) {
|
|
diff --git a/include/globals.h b/include/globals.h
|
|
index 8b80a65..17bca82 100644
|
|
--- a/include/globals.h
|
|
+++ b/include/globals.h
|
|
@@ -21,7 +21,7 @@ extern _X_EXPORT int defaultColorVisualClass;
|
|
|
|
extern _X_EXPORT int GrabInProgress;
|
|
extern _X_EXPORT Bool noTestExtensions;
|
|
-
|
|
+extern _X_EXPORT char *SeatId;
|
|
extern _X_EXPORT char *ConnectionInfo;
|
|
|
|
#ifdef DPMSExtension
|
|
diff --git a/include/xserver-properties.h b/include/xserver-properties.h
|
|
index 2b1feab..bf50042 100644
|
|
--- a/include/xserver-properties.h
|
|
+++ b/include/xserver-properties.h
|
|
@@ -30,6 +30,9 @@
|
|
* byte-ordering. */
|
|
#define XATOM_FLOAT "FLOAT"
|
|
|
|
+/* STRING. Seat name of this display */
|
|
+#define SEAT_ATOM_NAME "Xorg_Seat"
|
|
+
|
|
/* BOOL. 0 - device disabled, 1 - device enabled */
|
|
#define XI_PROP_ENABLED "Device Enabled"
|
|
/* BOOL. If present, device is a virtual XTEST device */
|
|
diff --git a/man/Xserver.man b/man/Xserver.man
|
|
index f743912..1a36b09 100644
|
|
--- a/man/Xserver.man
|
|
+++ b/man/Xserver.man
|
|
@@ -220,6 +220,12 @@ sets screen-saver timeout time in minutes.
|
|
.B \-su
|
|
disables save under support on all screens.
|
|
.TP 8
|
|
+.B \-seat \fIseat\fP
|
|
+seat to run on. Takes a string identifying a seat in a platform
|
|
+specific syntax. On platforms which support this feature this may be
|
|
+used to limit the server to expose only a specific subset of devices
|
|
+connected to the system.
|
|
+.TP 8
|
|
.B \-t \fInumber\fP
|
|
sets pointer acceleration threshold in pixels (i.e. after how many pixels
|
|
pointer acceleration should take effect).
|
|
diff --git a/os/utils.c b/os/utils.c
|
|
index 6338860..db2ae84 100644
|
|
--- a/os/utils.c
|
|
+++ b/os/utils.c
|
|
@@ -201,6 +201,8 @@ Bool PanoramiXExtensionDisabledHack = FALSE;
|
|
|
|
int auditTrailLevel = 1;
|
|
|
|
+char *SeatId = NULL;
|
|
+
|
|
#if defined(SVR4) || defined(__linux__) || defined(CSRG_BASED)
|
|
#define HAS_SAVED_IDS_AND_SETEUID
|
|
#endif
|
|
@@ -511,6 +513,7 @@ void UseMsg(void)
|
|
ErrorF("-render [default|mono|gray|color] set render color alloc policy\n");
|
|
ErrorF("-retro start with classic stipple and cursor\n");
|
|
ErrorF("-s # screen-saver timeout (minutes)\n");
|
|
+ ErrorF("-seat string seat to run on\n");
|
|
ErrorF("-t # default pointer threshold (pixels/t)\n");
|
|
ErrorF("-terminate terminate at server reset\n");
|
|
ErrorF("-to # connection time out\n");
|
|
@@ -813,6 +816,13 @@ ProcessCommandLine(int argc, char *argv[])
|
|
else
|
|
UseMsg();
|
|
}
|
|
+ else if ( strcmp( argv[i], "-seat") == 0)
|
|
+ {
|
|
+ if(++i < argc)
|
|
+ SeatId = argv[i];
|
|
+ else
|
|
+ UseMsg();
|
|
+ }
|
|
else if ( strcmp( argv[i], "-t") == 0)
|
|
{
|
|
if(++i < argc)
|
|
--
|
|
1.7.6
|
|
|