With systemd-logind support, the xserver, rather then the drivers will be responsible for opening/closing the fd for input devices.
This commit adds a new XI86_SERVER_FD flag to indicate to drivers when the server is managing the fd and they should not open/close it. This commit also bumps the input ABI major, as drivers which don't know about the XI86_SERVER_FD flag cannot be used when server managed fds are used. systemd-logind tracks devices by their chardev major + minor numbers, since we are breaking ABI anyways also add major and minor fields for easy storage / retreival of these. Signed-off-by: Hans de Goede <[email protected]> --- hw/xfree86/common/xf86Module.h | 2 +- hw/xfree86/common/xf86Xinput.c | 16 ++++++++++++++++ hw/xfree86/common/xf86Xinput.h | 3 +++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h index b6ec19d..96ac3b0 100644 --- a/hw/xfree86/common/xf86Module.h +++ b/hw/xfree86/common/xf86Module.h @@ -81,7 +81,7 @@ typedef enum { */ #define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4) #define ABI_VIDEODRV_VERSION SET_ABI_VERSION(15, 0) -#define ABI_XINPUT_VERSION SET_ABI_VERSION(20, 0) +#define ABI_XINPUT_VERSION SET_ABI_VERSION(21, 0) #define ABI_EXTENSION_VERSION SET_ABI_VERSION(8, 0) #define ABI_FONT_VERSION SET_ABI_VERSION(0, 6) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 3a01513..3a9e8ae 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -80,6 +80,7 @@ #include <stdarg.h> #include <stdint.h> /* for int64_t */ +#include <unistd.h> #include "mi.h" @@ -773,6 +774,9 @@ xf86DeleteInput(InputInfoPtr pInp, int flags) /* Else the entry wasn't in the xf86InputDevs list (ignore this). */ } + if (pInp->flags & XI86_SERVER_FD) + close(pInp->fd); + free((void *) pInp->driver); free((void *) pInp->name); xf86optionListFree(pInp->options); @@ -949,6 +953,15 @@ NewInputDeviceRequest(InputOption *options, InputAttributes * attrs, goto unwind; } } + + if (strcmp(key, "fd") == 0) + pInfo->fd = atoi(value); + + if (strcmp(key, "major") == 0) + pInfo->major = atoi(value); + + if (strcmp(key, "minor") == 0) + pInfo->minor = atoi(value); } nt_list_for_each_entry(option, options, list.next) { @@ -986,6 +999,9 @@ NewInputDeviceRequest(InputOption *options, InputAttributes * attrs, goto unwind; } + if (pInfo->fd != -1) + pInfo->flags |= XI86_SERVER_FD; + rval = xf86NewInputDevice(pInfo, pdev, (!is_auto || (is_auto && xf86Info.autoEnableDevices))); diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h index f94261a..fb1ad23 100644 --- a/hw/xfree86/common/xf86Xinput.h +++ b/hw/xfree86/common/xf86Xinput.h @@ -64,6 +64,7 @@ /* 0x08 is reserved for legacy XI86_SEND_DRAG_EVENTS, do not use for now */ /* server-internal only */ #define XI86_DEVICE_DISABLED 0x10 /* device was disabled before vt switch */ +#define XI86_SERVER_FD 0x20 /* fd is managed by xserver */ /* This holds the input driver entry and module information. */ typedef struct _InputDriverRec { @@ -96,6 +97,8 @@ typedef struct _InputInfoRec { int *valuators, int first_valuator, int num_valuators); int fd; + int major; + int minor; DeviceIntPtr dev; void *private; const char *type_name; -- 1.8.4.2 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
