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: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
95772598b5
commit
159b03e137
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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).
|
||||
|
|
10
os/utils.c
10
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");
|
||||
|
@ -802,6 +805,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)
|
||||
|
|
Loading…
Reference in New Issue
Block a user