Add support for multi-seat support from the config/udev backend.
This commit is contained in:
parent
06dd782b5d
commit
37aa2d689a
@ -30,7 +30,7 @@
|
|||||||
Summary: X.Org X11 X server
|
Summary: X.Org X11 X server
|
||||||
Name: xorg-x11-server
|
Name: xorg-x11-server
|
||||||
Version: 1.10.99.1
|
Version: 1.10.99.1
|
||||||
Release: 8%{?gitdate:.%{gitdate}}%{dist}
|
Release: 9%{?gitdate:.%{gitdate}}%{dist}
|
||||||
URL: http://www.x.org
|
URL: http://www.x.org
|
||||||
License: MIT
|
License: MIT
|
||||||
Group: User Interface/X
|
Group: User Interface/X
|
||||||
@ -86,6 +86,11 @@ Patch7006: xserver-1.10-pointer-barriers.patch
|
|||||||
# tests require Xorg
|
# tests require Xorg
|
||||||
Patch7007: xserver-1.10.99.1-test.patch
|
Patch7007: xserver-1.10.99.1-test.patch
|
||||||
|
|
||||||
|
# Multi-seat support through config/udev backend.
|
||||||
|
# Submitted to upstream but not merged for 1.11
|
||||||
|
Patch7009: xserver-1.10.99-config-add-udev-systemd-multi-seat-support.patch
|
||||||
|
|
||||||
|
|
||||||
%define moduledir %{_libdir}/xorg/modules
|
%define moduledir %{_libdir}/xorg/modules
|
||||||
%define drimoduledir %{_libdir}/dri
|
%define drimoduledir %{_libdir}/dri
|
||||||
%define sdkdir %{_includedir}/xorg
|
%define sdkdir %{_includedir}/xorg
|
||||||
@ -553,6 +558,9 @@ rm -rf $RPM_BUILD_ROOT
|
|||||||
%{xserver_source_dir}
|
%{xserver_source_dir}
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Jul 27 2011 Peter Hutterer <peter.hutterer@redhat.com> 1.10.99.1-9.20110511
|
||||||
|
- Add support for multi-seat support from the config/udev backend.
|
||||||
|
|
||||||
* Wed Jun 29 2011 Dan Horák <dan[at]danny.cz> 1.10.99.1-8.20110511
|
* Wed Jun 29 2011 Dan Horák <dan[at]danny.cz> 1.10.99.1-8.20110511
|
||||||
- don't build tests when --disable-xorg is used like on s390(x)
|
- don't build tests when --disable-xorg is used like on s390(x)
|
||||||
|
|
||||||
|
223
xserver-1.10.99-config-add-udev-systemd-multi-seat-support.patch
Normal file
223
xserver-1.10.99-config-add-udev-systemd-multi-seat-support.patch
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
From 8d9371f9035654cbb694ad51cf384a78b044bb9f 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 | 19 +++++++++++++++++++
|
||||||
|
doc/man/Xserver.man | 6 ++++++
|
||||||
|
hw/xfree86/common/xf86Init.c | 19 +++++++++++++++++++
|
||||||
|
include/globals.h | 2 +-
|
||||||
|
include/xserver-properties.h | 3 +++
|
||||||
|
os/utils.c | 10 ++++++++++
|
||||||
|
6 files changed, 58 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/config/udev.c b/config/udev.c
|
||||||
|
index 9ac34ee..ca978b0 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 "
|
||||||
|
@@ -283,6 +295,9 @@ config_udev_init(void)
|
||||||
|
if (!udev_monitor)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
+ 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;
|
||||||
|
@@ -291,6 +306,10 @@ config_udev_init(void)
|
||||||
|
enumerate = udev_enumerate_new(udev);
|
||||||
|
if (!enumerate)
|
||||||
|
return 0;
|
||||||
|
+
|
||||||
|
+ 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/doc/man/Xserver.man b/doc/man/Xserver.man
|
||||||
|
index b725949..8d23894 100644
|
||||||
|
--- a/doc/man/Xserver.man
|
||||||
|
+++ b/doc/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/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
|
||||||
|
index 0b36163..6dbbd77 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 c6259ae..a0936a5 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/os/utils.c b/os/utils.c
|
||||||
|
index 36cb46f..e8ecb71 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");
|
||||||
|
@@ -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)
|
||||||
|
--
|
||||||
|
1.7.6
|
||||||
|
|
Loading…
Reference in New Issue
Block a user