diff --git a/U_config-udev-distinguish-between-real-keyboards-and-o.patch b/U_config-udev-distinguish-between-real-keyboards-and-o.patch new file mode 100644 index 0000000..78c75cf --- /dev/null +++ b/U_config-udev-distinguish-between-real-keyboards-and-o.patch @@ -0,0 +1,123 @@ +From daa6d2d58f65b9301b1b1f3c6df07719ecb5c03d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= + +Date: Fri, 12 Feb 2016 14:18:02 -0200 +Subject: [PATCH 56/56] config/udev: distinguish between real keyboards and + other key devices +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch introduces a new flag ATTR_KEY for hotplugged input devices, +so we can better distinguish between real keyboards (i.e. devices with +udev property ID_INPUT_KEYBOARD="1") and other key input devices like +lid switches, power buttons, etc. + +All supported hotplug backends (udev, hal, and wscons) will set both +flags ATTR_KEY and ATTR_KEYBOARD for real keyboards, but udev backend +will set ATTR_KEY, but not ATTR_KEYBOARD, for non-keyboard key input +devices (hal and wscons will set both flags in any case). With this +distinction, kdrive input hotplugging mechanism will be allowed to only +grab real keyboards, as other key input devices are currently not +supported. + +In order to don't break current behaviour, this patch will replace all +ATTR_KEYBOARD occurrences with ATTR_KEY in hw/xfree86/common/xf86Xinput.c. + +[ajax: Just add ATTR_KEY, don't re-number the other attributes] + +Reviewed-by: Adam Jackson +Signed-off-by: Laércio de Sousa +--- + config/hal.c | 2 +- + config/udev.c | 4 ++++ + config/wscons.c | 2 +- + hw/kdrive/src/kinput.c | 4 +++- + hw/xfree86/common/xf86Xinput.c | 2 +- + include/input.h | 1 + + 6 files changed, 11 insertions(+), 4 deletions(-) + +diff --git a/config/hal.c b/config/hal.c +index ea574ca..c76eced 100644 +--- a/config/hal.c ++++ b/config/hal.c +@@ -170,7 +170,7 @@ device_added(LibHalContext * hal_ctx, const char *udi) + free(hal_tags); + + if (libhal_device_query_capability(hal_ctx, udi, "input.keys", NULL)) +- attrs.flags |= ATTR_KEYBOARD; ++ attrs.flags |= ATTR_KEY | ATTR_KEYBOARD; + if (libhal_device_query_capability(hal_ctx, udi, "input.mouse", NULL)) + attrs.flags |= ATTR_POINTER; + if (libhal_device_query_capability(hal_ctx, udi, "input.joystick", NULL)) +diff --git a/config/udev.c b/config/udev.c +index 08a954b..1a6e82a 100644 +--- a/config/udev.c ++++ b/config/udev.c +@@ -240,6 +240,10 @@ device_added(struct udev_device *udev_device) + } + else if (!strcmp(key, "ID_INPUT_KEY")) { + LOG_PROPERTY(path, key, value); ++ attrs.flags |= ATTR_KEY; ++ } ++ else if (!strcmp(key, "ID_INPUT_KEYBOARD")) { ++ LOG_PROPERTY(path, key, value); + attrs.flags |= ATTR_KEYBOARD; + } + else if (!strcmp(key, "ID_INPUT_MOUSE")) { +diff --git a/config/wscons.c b/config/wscons.c +index fb114bd..ee45675 100644 +--- a/config/wscons.c ++++ b/config/wscons.c +@@ -163,7 +163,7 @@ wscons_add_keyboard(void) + } + + kbd_config_done: +- attrs.flags |= ATTR_KEYBOARD; ++ attrs.flags |= ATTR_KEY | ATTR_KEYBOARD; + rc = NewInputDeviceRequest(input_options, &attrs, &dev); + if (rc != Success) + goto unwind; +diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c +index 836db79..ae19a9d 100644 +--- a/hw/kdrive/src/kinput.c ++++ b/hw/kdrive/src/kinput.c +@@ -2343,7 +2343,9 @@ NewInputDeviceRequest(InputOption *options, InputAttributes * attrs, + *pdev = ki->dixdev; + } + else { +- ErrorF("unrecognised device identifier!\n"); ++ ErrorF("unrecognised device identifier: %s\n", ++ input_option_get_value(input_option_find(optionsdup, ++ "device"))); + input_option_free_list(&optionsdup); + return BadValue; + } +diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c +index a9ce62a..4f2e6c8 100644 +--- a/hw/xfree86/common/xf86Xinput.c ++++ b/hw/xfree86/common/xf86Xinput.c +@@ -635,7 +635,7 @@ InputClassMatches(const XF86ConfInputClassPtr iclass, const InputInfoPtr idev, + + /* MatchIs* booleans */ + if (iclass->is_keyboard.set && +- iclass->is_keyboard.val != ! !(attrs->flags & ATTR_KEYBOARD)) ++ iclass->is_keyboard.val != ! !(attrs->flags & ATTR_KEY)) + return FALSE; + if (iclass->is_pointer.set && + iclass->is_pointer.val != ! !(attrs->flags & ATTR_POINTER)) +diff --git a/include/input.h b/include/input.h +index d8bd9c6..9662123 100644 +--- a/include/input.h ++++ b/include/input.h +@@ -236,6 +236,7 @@ typedef struct _InputAttributes { + #define ATTR_TABLET (1<<3) + #define ATTR_TOUCHPAD (1<<4) + #define ATTR_TOUCHSCREEN (1<<5) ++#define ATTR_KEY (1<<6) + + /* Key/Button has been run through all input processing and events sent to clients. */ + #define KEY_PROCESSED 1 +-- +2.6.2 + diff --git a/U_ephyr-don-t-load-ephyr-input-driver-if-seat-option-i.patch b/U_ephyr-don-t-load-ephyr-input-driver-if-seat-option-i.patch new file mode 100644 index 0000000..7073119 --- /dev/null +++ b/U_ephyr-don-t-load-ephyr-input-driver-if-seat-option-i.patch @@ -0,0 +1,75 @@ +From da69f2f15a9917c3ed04e305061683c41338126e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= + +Date: Fri, 11 Dec 2015 11:43:14 -0200 +Subject: [PATCH 04/56] ephyr: don't load ephyr input driver if -seat option is + passed +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When used for single-GPU multi-seat purposes, there's no need to enable +ephyr virtual input devices, since Xephyr is supposed to handle its own +hardware devices. + +Reviewed-by: Adam Jackson +Signed-off-by: Laércio de Sousa +--- + hw/kdrive/ephyr/ephyrinit.c | 35 ++++++++++++++++++----------------- + 1 file changed, 18 insertions(+), 17 deletions(-) + +diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c +index 9ddf86e..849a4e1 100644 +--- a/hw/kdrive/ephyr/ephyrinit.c ++++ b/hw/kdrive/ephyr/ephyrinit.c +@@ -91,29 +91,30 @@ InitInput(int argc, char **argv) + KdKeyboardInfo *ki; + KdPointerInfo *pi; + +- KdAddKeyboardDriver(&EphyrKeyboardDriver); + #ifdef KDRIVE_EVDEV + KdAddKeyboardDriver(&LinuxEvdevKeyboardDriver); +-#endif +- KdAddPointerDriver(&EphyrMouseDriver); +-#ifdef KDRIVE_EVDEV + KdAddPointerDriver(&LinuxEvdevMouseDriver); + #endif + +- if (!kdHasKbd) { +- ki = KdNewKeyboard(); +- if (!ki) +- FatalError("Couldn't create Xephyr keyboard\n"); +- ki->driver = &EphyrKeyboardDriver; +- KdAddKeyboard(ki); +- } ++ if (!SeatId) { ++ KdAddKeyboardDriver(&EphyrKeyboardDriver); ++ KdAddPointerDriver(&EphyrMouseDriver); + +- if (!kdHasPointer) { +- pi = KdNewPointer(); +- if (!pi) +- FatalError("Couldn't create Xephyr pointer\n"); +- pi->driver = &EphyrMouseDriver; +- KdAddPointer(pi); ++ if (!kdHasKbd) { ++ ki = KdNewKeyboard(); ++ if (!ki) ++ FatalError("Couldn't create Xephyr keyboard\n"); ++ ki->driver = &EphyrKeyboardDriver; ++ KdAddKeyboard(ki); ++ } ++ ++ if (!kdHasPointer) { ++ pi = KdNewPointer(); ++ if (!pi) ++ FatalError("Couldn't create Xephyr pointer\n"); ++ pi->driver = &EphyrMouseDriver; ++ KdAddPointer(pi); ++ } + } + + KdInitInput(); +-- +2.6.2 + diff --git a/U_ephyr-enable-option-sw-cursor-by-default-in-multi-se.patch b/U_ephyr-enable-option-sw-cursor-by-default-in-multi-se.patch new file mode 100644 index 0000000..d3c106d --- /dev/null +++ b/U_ephyr-enable-option-sw-cursor-by-default-in-multi-se.patch @@ -0,0 +1,37 @@ +From 851ff9ec04b73412c7dbad7b4911a1feac21f354 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= + +Date: Fri, 12 Feb 2016 14:18:01 -0200 +Subject: [PATCH 55/56] ephyr: enable option -sw-cursor by default in + multi-seat mode +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Option -seat passed to Xephyr requires -sw-cursor to be passed as well, +otherwise the mouse cursor will remain invisible for the given seat. +This patch takes care of enabling -sw-cursor if -seat is passed. + +Reviewed-by: Adam Jackson +Signed-off-by: Laércio de Sousa +--- + hw/kdrive/ephyr/ephyrinit.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c +index 849a4e1..149ea98 100644 +--- a/hw/kdrive/ephyr/ephyrinit.c ++++ b/hw/kdrive/ephyr/ephyrinit.c +@@ -373,6 +373,9 @@ OsVendorInit(void) + { + EPHYR_DBG("mark"); + ++ if (SeatId) ++ hostx_use_sw_cursor(); ++ + if (hostx_want_host_cursor()) + ephyrFuncs.initCursor = &ephyrCursorInit; + +-- +2.6.2 + diff --git a/U_ephyr-ignore-Xorg-multiseat-command-line-options.patch b/U_ephyr-ignore-Xorg-multiseat-command-line-options.patch new file mode 100644 index 0000000..8d3c566 --- /dev/null +++ b/U_ephyr-ignore-Xorg-multiseat-command-line-options.patch @@ -0,0 +1,43 @@ +From 7213e99cbc38a60f0076bc2115b144798ea4c3ba Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= + +Date: Fri, 11 Dec 2015 11:43:13 -0200 +Subject: [PATCH 03/56] ephyr: ignore Xorg multiseat command line options +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Multi-seat-capable display managers commonly pass command-line options +like "-novtswitch", "-sharevts", or "-layout seatXXXX" to Xorg server, +but Xephyr currently refuses to start if these options are passed to it, +which may break Xephyr-based single-GPU multiseat setups. + +[ajax: shortened summary] + +Reviewed-by: Adam Jackson +Signed-off-by: Laércio de Sousa +--- + hw/kdrive/ephyr/ephyrinit.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c +index 6b6c4b1..9ddf86e 100644 +--- a/hw/kdrive/ephyr/ephyrinit.c ++++ b/hw/kdrive/ephyr/ephyrinit.c +@@ -356,6 +356,13 @@ ddxProcessArgument(int argc, char **argv, int i) + EphyrWantNoHostGrab = 1; + return 1; + } ++ else if (!strcmp(argv[i], "-sharevts") || ++ !strcmp(argv[i], "-novtswitch")) { ++ return 1; ++ } ++ else if (!strcmp(argv[i], "-layout")) { ++ return 2; ++ } + + return KdProcessArgument(argc, argv, i); + } +-- +2.6.2 + diff --git a/U_kdrive-add-options-to-set-default-XKB-properties.patch b/U_kdrive-add-options-to-set-default-XKB-properties.patch new file mode 100644 index 0000000..70dae54 --- /dev/null +++ b/U_kdrive-add-options-to-set-default-XKB-properties.patch @@ -0,0 +1,138 @@ +From 40e32e9fc9f3a1bd8287ee03dd399d8161cb98dd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= + +Date: Fri, 12 Feb 2016 14:18:00 -0200 +Subject: [PATCH 54/56] kdrive: add options to set default XKB properties +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch introduces convenient command-line options -xkb-rules, +-xkb-model, -xkb-layout, -xkb-variant, and -xkb-options, to set default +values for these properties. + +These options can be handful for cases in which compile-time default +values don't match user locale, since kdrive doesn't support InputClass +matching rules yet and not all Linux distros provide default rules to +store these values in udev properties (which by the way is a discouraged +practice). + +Reviewed-by: Adam Jackson +Signed-off-by: Laércio de Sousa +--- + hw/kdrive/src/kdrive.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ + hw/kdrive/src/kinput.c | 16 +++++++++++----- + 2 files changed, 61 insertions(+), 5 deletions(-) + +diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c +index 269b609..52bea5a 100644 +--- a/hw/kdrive/src/kdrive.c ++++ b/hw/kdrive/src/kdrive.c +@@ -89,6 +89,11 @@ char *kdSwitchCmd; + DDXPointRec kdOrigin; + Bool kdHasPointer = FALSE; + Bool kdHasKbd = FALSE; ++const char *kdGlobalXkbRules = NULL; ++const char *kdGlobalXkbModel = NULL; ++const char *kdGlobalXkbLayout = NULL; ++const char *kdGlobalXkbVariant = NULL; ++const char *kdGlobalXkbOptions = NULL; + + static Bool kdCaughtSignal = FALSE; + +@@ -455,6 +460,11 @@ KdUseMsg(void) + ("-mouse driver [,n,,options] Specify the pointer driver and its options (n is the number of buttons)\n"); + ErrorF + ("-keybd driver [,,options] Specify the keyboard driver and its options\n"); ++ ErrorF("-xkb-rules Set default XkbRules value (can be overriden by -keybd options)\n"); ++ ErrorF("-xkb-model Set default XkbModel value (can be overriden by -keybd options)\n"); ++ ErrorF("-xkb-layout Set default XkbLayout value (can be overriden by -keybd options)\n"); ++ ErrorF("-xkb-variant Set default XkbVariant value (can be overriden by -keybd options)\n"); ++ ErrorF("-xkb-options Set default XkbOptions value (can be overriden by -keybd options)\n"); + ErrorF("-zaphod Disable cursor screen switching\n"); + ErrorF("-2button Emulate 3 button mouse\n"); + ErrorF("-3button Disable 3 button mouse emulation\n"); +@@ -563,6 +573,46 @@ KdProcessArgument(int argc, char **argv, int i) + sscanf(argv[i], "vt%2d", &kdVirtualTerminal) == 1) { + return 1; + } ++ if (!strcmp(argv[i], "-xkb-rules")) { ++ if (i + 1 >= argc) { ++ UseMsg(); ++ FatalError("Missing argument for option -xkb-rules.\n"); ++ } ++ kdGlobalXkbRules = argv[i + 1]; ++ return 2; ++ } ++ if (!strcmp(argv[i], "-xkb-model")) { ++ if (i + 1 >= argc) { ++ UseMsg(); ++ FatalError("Missing argument for option -xkb-model.\n"); ++ } ++ kdGlobalXkbModel = argv[i + 1]; ++ return 2; ++ } ++ if (!strcmp(argv[i], "-xkb-layout")) { ++ if (i + 1 >= argc) { ++ UseMsg(); ++ FatalError("Missing argument for option -xkb-layout.\n"); ++ } ++ kdGlobalXkbLayout = argv[i + 1]; ++ return 2; ++ } ++ if (!strcmp(argv[i], "-xkb-variant")) { ++ if (i + 1 >= argc) { ++ UseMsg(); ++ FatalError("Missing argument for option -xkb-variant.\n"); ++ } ++ kdGlobalXkbVariant = argv[i + 1]; ++ return 2; ++ } ++ if (!strcmp(argv[i], "-xkb-options")) { ++ if (i + 1 >= argc) { ++ UseMsg(); ++ FatalError("Missing argument for option -xkb-options.\n"); ++ } ++ kdGlobalXkbOptions = argv[i + 1]; ++ return 2; ++ } + if (!strcmp(argv[i], "-mouse") || !strcmp(argv[i], "-pointer")) { + if (i + 1 >= argc) + UseMsg(); +diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c +index fd6a952..836db79 100644 +--- a/hw/kdrive/src/kinput.c ++++ b/hw/kdrive/src/kinput.c +@@ -102,6 +102,12 @@ static int kdNumInputFds; + + extern Bool kdRawPointerCoordinates; + ++extern const char *kdGlobalXkbRules; ++extern const char *kdGlobalXkbModel; ++extern const char *kdGlobalXkbLayout; ++extern const char *kdGlobalXkbVariant; ++extern const char *kdGlobalXkbOptions; ++ + static void + KdSigio(int sig) + { +@@ -909,11 +915,11 @@ KdNewKeyboard(void) + ki->options = NULL; + ki->name = strdup("Generic Keyboard"); + ki->path = NULL; +- ki->xkbRules = strdup(XKB_DFLT_RULES); +- ki->xkbModel = strdup(XKB_DFLT_MODEL); +- ki->xkbLayout = strdup(XKB_DFLT_LAYOUT); +- ki->xkbVariant = strdup(XKB_DFLT_VARIANT); +- ki->xkbOptions = strdup(XKB_DFLT_OPTIONS); ++ ki->xkbRules = strdup(kdGlobalXkbRules ? kdGlobalXkbRules : XKB_DFLT_RULES); ++ ki->xkbModel = strdup(kdGlobalXkbModel ? kdGlobalXkbModel : XKB_DFLT_MODEL); ++ ki->xkbLayout = strdup(kdGlobalXkbLayout ? kdGlobalXkbLayout : XKB_DFLT_LAYOUT); ++ ki->xkbVariant = strdup(kdGlobalXkbVariant ? kdGlobalXkbVariant :XKB_DFLT_VARIANT); ++ ki->xkbOptions = strdup(kdGlobalXkbOptions ? kdGlobalXkbOptions : XKB_DFLT_OPTIONS); + + return ki; + } +-- +2.6.2 + diff --git a/U_kdrive-don-t-let-evdev-driver-overwrite-existing-dev.patch b/U_kdrive-don-t-let-evdev-driver-overwrite-existing-dev.patch new file mode 100644 index 0000000..76b4bee --- /dev/null +++ b/U_kdrive-don-t-let-evdev-driver-overwrite-existing-dev.patch @@ -0,0 +1,47 @@ +From edd443f69ea385a957b8eae0b066ad8e77fb947b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= + +Date: Fri, 11 Dec 2015 11:43:11 -0200 +Subject: [PATCH 02/56] kdrive: don't let evdev driver overwrite existing + device names +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +KDrive evdev driver deliberately name grabbed devices as "Evdev mouse" +or "Evdev keyboard". This patch will make it skip this step if grabbed +devices are already named (i.e. from udev). + +Reviewed-by: Adam Jackson +Signed-off-by: Laércio de Sousa +--- + hw/kdrive/linux/evdev.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/hw/kdrive/linux/evdev.c b/hw/kdrive/linux/evdev.c +index 63e8409..cdd45e7 100644 +--- a/hw/kdrive/linux/evdev.c ++++ b/hw/kdrive/linux/evdev.c +@@ -220,7 +220,8 @@ EvdevPtrInit(KdPointerInfo * pi) + + close(fd); + +- pi->name = strdup("Evdev mouse"); ++ if (!pi->name) ++ pi->name = strdup("Evdev mouse"); + + return Success; + } +@@ -390,7 +391,8 @@ EvdevKbdInit(KdKeyboardInfo * ki) + + close(fd); + +- ki->name = strdup("Evdev keyboard"); ++ if (!ki->name) ++ ki->name = strdup("Evdev keyboard"); + + readMapping(ki); + +-- +2.6.2 + diff --git a/U_kdrive-evdev-update-keyboard-LEDs-22302.patch b/U_kdrive-evdev-update-keyboard-LEDs-22302.patch new file mode 100644 index 0000000..aa6aff6 --- /dev/null +++ b/U_kdrive-evdev-update-keyboard-LEDs-22302.patch @@ -0,0 +1,56 @@ +From 0461bca0cb2f7918c77ed45d2cbc756cf65021be Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= + +Date: Mon, 22 Feb 2016 16:04:12 -0300 +Subject: [PATCH 17/56] kdrive/evdev: update keyboard LEDs (#22302) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Implement missing parts in kdrive evdev driver for +correct update of evdev keyboard LEDs. + +Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=22302 + +[ajax: Fixed deref-before-null-check bug] + +Reviewed-by: Adam Jackson +Signed-off-by: Laércio de Sousa +--- + hw/kdrive/linux/evdev.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/hw/kdrive/linux/evdev.c b/hw/kdrive/linux/evdev.c +index cdd45e7..8415772 100644 +--- a/hw/kdrive/linux/evdev.c ++++ b/hw/kdrive/linux/evdev.c +@@ -442,10 +442,16 @@ EvdevKbdEnable(KdKeyboardInfo * ki) + static void + EvdevKbdLeds(KdKeyboardInfo * ki, int leds) + { +-/* struct input_event event; ++ struct input_event event; + Kevdev *ke; + +- ki->driverPrivate = ke; ++ if (!ki) ++ return; ++ ++ ke = ki->driverPrivate; ++ ++ if (!ke) ++ return; + + memset(&event, 0, sizeof(event)); + +@@ -468,7 +474,6 @@ EvdevKbdLeds(KdKeyboardInfo * ki, int leds) + event.code = LED_COMPOSE; + event.value = leds & (1 << 3) ? 1 : 0; + write(ke->fd, (char *) &event, sizeof(event)); +-*/ + } + + static void +-- +2.6.2 + diff --git a/U_kdrive-fix-up-NewInputDeviceRequest-implementation.patch b/U_kdrive-fix-up-NewInputDeviceRequest-implementation.patch new file mode 100644 index 0000000..d1ed7de --- /dev/null +++ b/U_kdrive-fix-up-NewInputDeviceRequest-implementation.patch @@ -0,0 +1,151 @@ +From 6d6fd688ecf95f2e84f2af276d681ff42f9d5610 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= + +Date: Fri, 11 Dec 2015 11:43:06 -0200 +Subject: [PATCH 01/58] kdrive: fix up NewInputDeviceRequest() implementation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch simplifies NewInputDeviceRequest() implementation in +kinput.c, making use of improved KdParseKbdOptions() / +KdParsePointerOptions() and merging several "if (ki)"/"if (pi)" clauses. + +Reviewed-by: Adam Jackson +Signed-off-by: Laércio de Sousa +--- + hw/kdrive/src/kinput.c | 76 ++++++++++++++++++++------------------------------ + 1 file changed, 30 insertions(+), 46 deletions(-) + +diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c +index 1fdaa52..980fd3e 100644 +--- a/hw/kdrive/src/kinput.c ++++ b/hw/kdrive/src/kinput.c +@@ -1091,6 +1091,8 @@ KdParseKbdOptions(KdKeyboardInfo * ki) + ki->xkbOptions = strdup(value); + else if (!strcasecmp(key, "device")) + ki->path = strdup(value); ++ else if (!strcasecmp(key, "driver")) ++ ki->driver = KdFindKeyboardDriver(value); + else + ErrorF("Kbd option key (%s) of value (%s) not assigned!\n", + key, value); +@@ -1171,18 +1173,20 @@ KdParsePointerOptions(KdPointerInfo * pi) + const char *key = input_option_get_key(option); + const char *value = input_option_get_value(option); + +- if (!strcmp(key, "emulatemiddle")) ++ if (!strcasecmp(key, "emulatemiddle")) + pi->emulateMiddleButton = TRUE; +- else if (!strcmp(key, "noemulatemiddle")) ++ else if (!strcasecmp(key, "noemulatemiddle")) + pi->emulateMiddleButton = FALSE; +- else if (!strcmp(key, "transformcoord")) ++ else if (!strcasecmp(key, "transformcoord")) + pi->transformCoordinates = TRUE; +- else if (!strcmp(key, "rawcoord")) ++ else if (!strcasecmp(key, "rawcoord")) + pi->transformCoordinates = FALSE; + else if (!strcasecmp(key, "device")) + pi->path = strdup(value); + else if (!strcasecmp(key, "protocol")) + pi->protocol = strdup(value); ++ else if (!strcasecmp(key, "driver")) ++ pi->driver = KdFindPointerDriver(value); + else + ErrorF("Pointer option key (%s) of value (%s) not assigned!\n", + key, value); +@@ -2152,68 +2156,48 @@ NewInputDeviceRequest(InputOption *options, InputAttributes * attrs, + #endif + } + +- if (!ki && !pi) { +- ErrorF("unrecognised device identifier!\n"); +- return BadValue; +- } +- +- /* FIXME: change this code below to use KdParseKbdOptions and +- * KdParsePointerOptions */ +- nt_list_for_each_entry(option, options, list.next) { +- const char *key = input_option_get_key(option); +- const char *value = input_option_get_value(option); ++ if (pi) { ++ pi->options = options; ++ KdParsePointerOptions(pi); + +- if (strcmp(key, "device") == 0) { +- if (pi && value) +- pi->path = strdup(value); +- else if (ki && value) +- ki->path = strdup(value); +- } +- else if (strcmp(key, "driver") == 0) { +- if (pi) { +- pi->driver = KdFindPointerDriver(value); +- if (!pi->driver) { +- ErrorF("couldn't find driver!\n"); +- KdFreePointer(pi); +- return BadValue; +- } +- pi->options = options; +- } +- else if (ki) { +- ki->driver = KdFindKeyboardDriver(value); +- if (!ki->driver) { +- ErrorF("couldn't find driver!\n"); +- KdFreeKeyboard(ki); +- return BadValue; +- } +- ki->options = options; +- } ++ if (!pi->driver) { ++ ErrorF("couldn't find driver!\n"); ++ KdFreePointer(pi); ++ return BadValue; + } +- } + +- if (pi) { + if (KdAddPointer(pi) != Success || + ActivateDevice(pi->dixdev, TRUE) != Success || + EnableDevice(pi->dixdev, TRUE) != TRUE) { + ErrorF("couldn't add or enable pointer\n"); + return BadImplementation; + } ++ ++ *pdev = pi->dixdev; + } + else if (ki) { ++ ki->options = options; ++ KdParseKbdOptions(ki); ++ ++ if (!ki->driver) { ++ ErrorF("couldn't find driver!\n"); ++ KdFreeKeyboard(ki); ++ return BadValue; ++ } ++ + if (KdAddKeyboard(ki) != Success || + ActivateDevice(ki->dixdev, TRUE) != Success || + EnableDevice(ki->dixdev, TRUE) != TRUE) { + ErrorF("couldn't add or enable keyboard\n"); + return BadImplementation; + } +- } + +- if (pi) { +- *pdev = pi->dixdev; +- } +- else if (ki) { + *pdev = ki->dixdev; + } ++ else { ++ ErrorF("unrecognised device identifier!\n"); ++ return BadValue; ++ } + + return Success; + } +-- +2.6.2 + diff --git a/U_kdrive-introduce-input-hot-plugging-support-for-udev.patch b/U_kdrive-introduce-input-hot-plugging-support-for-udev.patch new file mode 100644 index 0000000..c767488 --- /dev/null +++ b/U_kdrive-introduce-input-hot-plugging-support-for-udev.patch @@ -0,0 +1,437 @@ +From 0cf3d72be6bd99cd2c66b7885339322c7e5bf73d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= + +Date: Fri, 12 Feb 2016 14:17:59 -0200 +Subject: [PATCH 53/56] kdrive: introduce input hot-plugging support for udev + and hal backends (#33140) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch introduces input hot-plugging support for kdrive-based +applications in multi-seat context. This feature is enabled by passing +-seat option with desired seat name. All keyboard/mouse devices assigned +to that seat will be automatically grabbed by kdrive. + +It supports udev and hal backends for input hot-plugging support. +Another patches may be required for wscons backend. + +Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=33140 + +Reviewed-by: Adam Jackson +Signed-off-by: Laércio de Sousa +--- + hw/kdrive/src/Makefile.am | 8 +++ + hw/kdrive/src/kdrive.c | 46 +++++++++++++ + hw/kdrive/src/kinfo.c | 4 ++ + hw/kdrive/src/kinput.c | 162 +++++++++++++++++++++++++++++++++++++++------- + 4 files changed, 198 insertions(+), 22 deletions(-) + +diff --git a/hw/kdrive/src/Makefile.am b/hw/kdrive/src/Makefile.am +index d69f0dd..b7f94b0 100644 +--- a/hw/kdrive/src/Makefile.am ++++ b/hw/kdrive/src/Makefile.am +@@ -23,3 +23,11 @@ libkdrive_la_SOURCES = \ + kshadow.c \ + $(KDRIVE_XV_SOURCES) \ + $(top_srcdir)/mi/miinitext.c ++ ++if CONFIG_UDEV ++libkdrive_la_LIBADD = $(top_builddir)/config/libconfig.la ++else ++if CONFIG_HAL ++libkdrive_la_LIBADD = $(top_builddir)/config/libconfig.la ++endif ++endif +diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c +index 582ff66..269b609 100644 +--- a/hw/kdrive/src/kdrive.c ++++ b/hw/kdrive/src/kdrive.c +@@ -45,6 +45,14 @@ + + #include + ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++#include ++#endif ++ ++/* This stub can be safely removed once we can ++ * split input and GPU parts in hotplug.h et al. */ ++#include ++ + typedef struct _kdDepths { + CARD8 depth; + CARD8 bpp; +@@ -1125,6 +1133,11 @@ KdInitOutput(ScreenInfo * pScreenInfo, int argc, char **argv) + KdAddScreen(pScreenInfo, screen, argc, argv); + + OsRegisterSigWrapper(KdSignalWrapper); ++ ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++ if (SeatId) /* Enable input hot-plugging */ ++ config_pre_init(); ++#endif + } + + void +@@ -1143,3 +1156,36 @@ DPMSSupported(void) + { + return FALSE; + } ++ ++/* These stubs can be safely removed once we can ++ * split input and GPU parts in hotplug.h et al. */ ++#ifdef CONFIG_UDEV_KMS ++void ++NewGPUDeviceRequest(struct OdevAttributes *attribs) ++{ ++} ++ ++void ++DeleteGPUDeviceRequest(struct OdevAttributes *attribs) ++{ ++} ++#endif ++ ++struct xf86_platform_device * ++xf86_find_platform_device_by_devnum(int major, int minor) ++{ ++ return NULL; ++} ++ ++#ifdef SYSTEMD_LOGIND ++void ++systemd_logind_vtenter(void) ++{ ++} ++ ++void ++systemd_logind_release_fd(int major, int minor, int fd) ++{ ++ close(fd); ++} ++#endif +diff --git a/hw/kdrive/src/kinfo.c b/hw/kdrive/src/kinfo.c +index 01ae1e4..f91d575 100644 +--- a/hw/kdrive/src/kinfo.c ++++ b/hw/kdrive/src/kinfo.c +@@ -134,6 +134,7 @@ KdFreePointer(KdPointerInfo * pi) + free(pi->name); + free(pi->path); + input_option_free_list(&pi->options); ++ pi->next = NULL; + free(pi); + } + +@@ -145,6 +146,9 @@ KdFreeKeyboard(KdKeyboardInfo * ki) + free(ki->xkbRules); + free(ki->xkbModel); + free(ki->xkbLayout); ++ free(ki->xkbVariant); ++ free(ki->xkbOptions); ++ input_option_free_list(&ki->options); + ki->next = NULL; + free(ki); + } +diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c +index 3a1c6a0..fd6a952 100644 +--- a/hw/kdrive/src/kinput.c ++++ b/hw/kdrive/src/kinput.c +@@ -51,6 +51,10 @@ + #include "inpututils.h" + #include "optionstr.h" + ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++#include ++#endif ++ + #ifdef KDRIVE_EVDEV + #define DEV_INPUT_EVENT_PREFIX "/dev/input/event" + #define DEV_INPUT_EVENT_PREFIX_LEN (sizeof(DEV_INPUT_EVENT_PREFIX) - 1) +@@ -407,7 +411,8 @@ KdPointerProc(DeviceIntPtr pDevice, int onoff) + #endif + if (!pi->driver) { + if (!pi->driverPrivate) { +- ErrorF("no driver specified for %s\n", pi->name); ++ ErrorF("no driver specified for pointer device \"%s\" (%s)\n", ++ pi->name ? pi->name : "(unnamed)", pi->path); + return BadImplementation; + } + +@@ -727,7 +732,8 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff) + #endif + if (!ki->driver) { + if (!ki->driverPrivate) { +- ErrorF("no driver specified!\n"); ++ ErrorF("no driver specified for keyboard device \"%s\" (%s)\n", ++ ki->name ? ki->name : "(unnamed)", ki->path); + return BadImplementation; + } + +@@ -901,6 +907,8 @@ KdNewKeyboard(void) + ki->bellDuration = 200; + ki->next = NULL; + ki->options = NULL; ++ ki->name = strdup("Generic Keyboard"); ++ ki->path = NULL; + ki->xkbRules = strdup(XKB_DFLT_RULES); + ki->xkbModel = strdup(XKB_DFLT_MODEL); + ki->xkbLayout = strdup(XKB_DFLT_LAYOUT); +@@ -1084,18 +1092,52 @@ KdParseKbdOptions(KdKeyboardInfo * ki) + const char *key = input_option_get_key(option); + const char *value = input_option_get_value(option); + +- if (strcasecmp(key, "XkbRules") == 0) ++ if ( ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++ strcasecmp(key, "xkb_rules") == 0 || ++#endif ++ strcasecmp(key, "XkbRules") == 0) + ki->xkbRules = strdup(value); +- else if (strcasecmp(key, "XkbModel") == 0) ++ else if ( ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++ strcasecmp(key, "xkb_model") == 0 || ++#endif ++ strcasecmp(key, "XkbModel") == 0) + ki->xkbModel = strdup(value); +- else if (strcasecmp(key, "XkbLayout") == 0) ++ else if ( ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++ strcasecmp(key, "xkb_layout") == 0 || ++#endif ++ strcasecmp(key, "XkbLayout") == 0) + ki->xkbLayout = strdup(value); +- else if (strcasecmp(key, "XkbVariant") == 0) ++ else if ( ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++ strcasecmp(key, "xkb_variant") == 0 || ++#endif ++ strcasecmp(key, "XkbVariant") == 0) + ki->xkbVariant = strdup(value); +- else if (strcasecmp(key, "XkbOptions") == 0) ++ else if ( ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++ strcasecmp(key, "xkb_options") == 0 || ++#endif ++ strcasecmp(key, "XkbOptions") == 0) + ki->xkbOptions = strdup(value); +- else if (!strcasecmp(key, "device")) ++ else if (!strcasecmp(key, "device")) { ++ if (ki->path != NULL) ++ free(ki->path); + ki->path = strdup(value); ++ } ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++ else if (!strcasecmp(key, "path")) { ++ if (ki->path != NULL) ++ free(ki->path); ++ ki->path = strdup(value); ++ } ++ else if (!strcasecmp(key, "name")) { ++ free(ki->name); ++ ki->name = strdup(value); ++ } ++#endif + else if (!strcasecmp(key, "driver")) + ki->driver = KdFindKeyboardDriver(value); + else +@@ -1196,8 +1238,22 @@ KdParsePointerOptions(KdPointerInfo * pi) + pi->transformCoordinates = TRUE; + else if (!strcasecmp(key, "rawcoord")) + pi->transformCoordinates = FALSE; +- else if (!strcasecmp(key, "device")) ++ else if (!strcasecmp(key, "device")) { ++ if (pi->path != NULL) ++ free(pi->path); ++ pi->path = strdup(value); ++ } ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++ else if (!strcasecmp(key, "path")) { ++ if (pi->path != NULL) ++ free(pi->path); + pi->path = strdup(value); ++ } ++ else if (!strcasecmp(key, "name")) { ++ free(pi->name); ++ pi->name = strdup(value); ++ } ++#endif + else if (!strcasecmp(key, "protocol")) + pi->protocol = strdup(value); + else if (!strcasecmp(key, "driver")) +@@ -1320,11 +1376,21 @@ KdInitInput(void) + } + + mieqInit(); ++ ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++ if (SeatId) /* Enable input hot-plugging */ ++ config_init(); ++#endif + } + + void + KdCloseInput(void) + { ++#if defined(CONFIG_UDEV) || defined(CONFIG_HAL) ++ if (SeatId) /* Input hot-plugging is enabled */ ++ config_fini(); ++#endif ++ + mieqFini(); + } + +@@ -2141,24 +2207,29 @@ int + NewInputDeviceRequest(InputOption *options, InputAttributes * attrs, + DeviceIntPtr *pdev) + { +- InputOption *option = NULL; ++ InputOption *option = NULL, *optionsdup = NULL; + KdPointerInfo *pi = NULL; + KdKeyboardInfo *ki = NULL; + + nt_list_for_each_entry(option, options, list.next) { + const char *key = input_option_get_key(option); + const char *value = input_option_get_value(option); ++ optionsdup = input_option_new(optionsdup, key, value); + + if (strcmp(key, "type") == 0) { + if (strcmp(value, "pointer") == 0) { + pi = KdNewPointer(); +- if (!pi) ++ if (!pi) { ++ input_option_free_list(&optionsdup); + return BadAlloc; ++ } + } + else if (strcmp(value, "keyboard") == 0) { + ki = KdNewKeyboard(); +- if (!ki) ++ if (!ki) { ++ input_option_free_list(&optionsdup); + return BadAlloc; ++ } + } + else { + ErrorF("unrecognised device type!\n"); +@@ -2168,25 +2239,66 @@ NewInputDeviceRequest(InputOption *options, InputAttributes * attrs, + #ifdef CONFIG_HAL + else if (strcmp(key, "_source") == 0 && + strcmp(value, "server/hal") == 0) { +- ErrorF("Ignoring device from HAL.\n"); +- return BadValue; ++ if (SeatId) { ++ /* Input hot-plugging is enabled */ ++ if (attrs->flags & ATTR_POINTER) { ++ pi = KdNewPointer(); ++ if (!pi) { ++ input_option_free_list(&optionsdup); ++ return BadAlloc; ++ } ++ } ++ else if (attrs->flags & ATTR_KEYBOARD) { ++ ki = KdNewKeyboard(); ++ if (!ki) { ++ input_option_free_list(&optionsdup); ++ return BadAlloc; ++ } ++ } ++ } ++ else { ++ ErrorF("Ignoring device from HAL.\n"); ++ input_option_free_list(&optionsdup); ++ return BadValue; ++ } + } + #endif + #ifdef CONFIG_UDEV + else if (strcmp(key, "_source") == 0 && + strcmp(value, "server/udev") == 0) { +- ErrorF("Ignoring device from udev.\n"); +- return BadValue; ++ if (SeatId) { ++ /* Input hot-plugging is enabled */ ++ if (attrs->flags & ATTR_POINTER) { ++ pi = KdNewPointer(); ++ if (!pi) { ++ input_option_free_list(&optionsdup); ++ return BadAlloc; ++ } ++ } ++ else if (attrs->flags & ATTR_KEYBOARD) { ++ ki = KdNewKeyboard(); ++ if (!ki) { ++ input_option_free_list(&optionsdup); ++ return BadAlloc; ++ } ++ } ++ } ++ else { ++ ErrorF("Ignoring device from udev.\n"); ++ input_option_free_list(&optionsdup); ++ return BadValue; ++ } + } + #endif + } + + if (pi) { +- pi->options = options; ++ pi->options = optionsdup; + KdParsePointerOptions(pi); + + if (!pi->driver) { +- ErrorF("couldn't find driver!\n"); ++ ErrorF("couldn't find driver for pointer device \"%s\" (%s)\n", ++ pi->name ? pi->name : "(unnamed)", pi->path); + KdFreePointer(pi); + return BadValue; + } +@@ -2194,18 +2306,21 @@ NewInputDeviceRequest(InputOption *options, InputAttributes * attrs, + if (KdAddPointer(pi) != Success || + ActivateDevice(pi->dixdev, TRUE) != Success || + EnableDevice(pi->dixdev, TRUE) != TRUE) { +- ErrorF("couldn't add or enable pointer\n"); ++ ErrorF("couldn't add or enable pointer \"%s\" (%s)\n", ++ pi->name ? pi->name : "(unnamed)", pi->path); ++ KdFreePointer(pi); + return BadImplementation; + } + + *pdev = pi->dixdev; + } + else if (ki) { +- ki->options = options; ++ ki->options = optionsdup; + KdParseKbdOptions(ki); + + if (!ki->driver) { +- ErrorF("couldn't find driver!\n"); ++ ErrorF("couldn't find driver for keyboard device \"%s\" (%s)\n", ++ ki->name ? ki->name : "(unnamed)", ki->path); + KdFreeKeyboard(ki); + return BadValue; + } +@@ -2213,7 +2328,9 @@ NewInputDeviceRequest(InputOption *options, InputAttributes * attrs, + if (KdAddKeyboard(ki) != Success || + ActivateDevice(ki->dixdev, TRUE) != Success || + EnableDevice(ki->dixdev, TRUE) != TRUE) { +- ErrorF("couldn't add or enable keyboard\n"); ++ ErrorF("couldn't add or enable keyboard \"%s\" (%s)\n", ++ ki->name ? ki->name : "(unnamed)", ki->path); ++ KdFreeKeyboard(ki); + return BadImplementation; + } + +@@ -2221,6 +2338,7 @@ NewInputDeviceRequest(InputOption *options, InputAttributes * attrs, + } + else { + ErrorF("unrecognised device identifier!\n"); ++ input_option_free_list(&optionsdup); + return BadValue; + } + +-- +2.6.2 + diff --git a/U_kdrive-set-evdev-driver-for-input-devices-automatica.patch b/U_kdrive-set-evdev-driver-for-input-devices-automatica.patch new file mode 100644 index 0000000..601eb00 --- /dev/null +++ b/U_kdrive-set-evdev-driver-for-input-devices-automatica.patch @@ -0,0 +1,74 @@ +From 0b80da0d18713df4712c05973388b6226bb0227f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?= + +Date: Fri, 11 Dec 2015 11:43:07 -0200 +Subject: [PATCH 01/56] kdrive: set "evdev" driver for input devices + automatically, if available. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If kdrive input driver "evdev" is available, no other driver was +explicitly set for a given input device, and its kernel device node is +/dev/input/event*, this patch will make kdrive set "evdev" driver +automatically for such device. + +Reviewed-by: Adam Jackson +Signed-off-by: Laércio de Sousa +--- + hw/kdrive/src/kinput.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c +index 980fd3e..3a1c6a0 100644 +--- a/hw/kdrive/src/kinput.c ++++ b/hw/kdrive/src/kinput.c +@@ -51,6 +51,11 @@ + #include "inpututils.h" + #include "optionstr.h" + ++#ifdef KDRIVE_EVDEV ++#define DEV_INPUT_EVENT_PREFIX "/dev/input/event" ++#define DEV_INPUT_EVENT_PREFIX_LEN (sizeof(DEV_INPUT_EVENT_PREFIX) - 1) ++#endif ++ + #define AtomFromName(x) MakeAtom(x, strlen(x), 1) + + struct KdConfigDevice { +@@ -1097,6 +1102,16 @@ KdParseKbdOptions(KdKeyboardInfo * ki) + ErrorF("Kbd option key (%s) of value (%s) not assigned!\n", + key, value); + } ++ ++#ifdef KDRIVE_EVDEV ++ if (!ki->driver && ki->path != NULL && ++ strncasecmp(ki->path, ++ DEV_INPUT_EVENT_PREFIX, ++ DEV_INPUT_EVENT_PREFIX_LEN) == 0) { ++ ki->driver = KdFindKeyboardDriver("evdev"); ++ ki->options = input_option_new(ki->options, "driver", "evdev"); ++ } ++#endif + } + + KdKeyboardInfo * +@@ -1191,6 +1206,16 @@ KdParsePointerOptions(KdPointerInfo * pi) + ErrorF("Pointer option key (%s) of value (%s) not assigned!\n", + key, value); + } ++ ++#ifdef KDRIVE_EVDEV ++ if (!pi->driver && pi->path != NULL && ++ strncasecmp(pi->path, ++ DEV_INPUT_EVENT_PREFIX, ++ DEV_INPUT_EVENT_PREFIX_LEN) == 0) { ++ pi->driver = KdFindPointerDriver("evdev"); ++ pi->options = input_option_new(pi->options, "driver", "evdev"); ++ } ++#endif + } + + KdPointerInfo * +-- +2.6.2 + diff --git a/xorg-x11-server.changes b/xorg-x11-server.changes index 75be409..87a65e8 100644 --- a/xorg-x11-server.changes +++ b/xorg-x11-server.changes @@ -1,3 +1,19 @@ +------------------------------------------------------------------- +Mon Mar 7 11:06:53 UTC 2016 - lbsousajr@gmail.com + +- Backport upstream patches for Xephyr input hot-plugging / + single-GPU multi-seat support: + * U_kdrive-fix-up-NewInputDeviceRequest-implementation.patch + * U_kdrive-set-evdev-driver-for-input-devices-automatica.patch + * U_ephyr-don-t-load-ephyr-input-driver-if-seat-option-i.patch + * U_kdrive-don-t-let-evdev-driver-overwrite-existing-dev.patch + * U_ephyr-ignore-Xorg-multiseat-command-line-options.patch + * U_ephyr-enable-option-sw-cursor-by-default-in-multi-se.patch + * U_kdrive-introduce-input-hot-plugging-support-for-udev.patch + * U_kdrive-add-options-to-set-default-XKB-properties.patch + * U_kdrive-evdev-update-keyboard-LEDs-22302.patch + * U_config-udev-distinguish-between-real-keyboards-and-o.patch + ------------------------------------------------------------------- Fri Mar 4 18:42:10 UTC 2016 - eich@suse.com diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 4f43f61..dfecb62 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -191,6 +191,17 @@ Patch1162: b_cache-xkbcomp-output-for-fast-start-up.patch Patch1211: b_0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch Patch1222: b_sync-fix.patch +Patch1223: U_kdrive-fix-up-NewInputDeviceRequest-implementation.patch +Patch1224: U_kdrive-set-evdev-driver-for-input-devices-automatica.patch +Patch1225: U_ephyr-don-t-load-ephyr-input-driver-if-seat-option-i.patch +Patch1226: U_kdrive-don-t-let-evdev-driver-overwrite-existing-dev.patch +Patch1227: U_ephyr-ignore-Xorg-multiseat-command-line-options.patch +Patch1228: U_ephyr-enable-option-sw-cursor-by-default-in-multi-se.patch +Patch1229: U_kdrive-introduce-input-hot-plugging-support-for-udev.patch +Patch1230: U_kdrive-add-options-to-set-default-XKB-properties.patch +Patch1231: U_kdrive-evdev-update-keyboard-LEDs-22302.patch +Patch1232: U_config-udev-distinguish-between-real-keyboards-and-o.patch + %description This package contains the X.Org Server. @@ -300,6 +311,17 @@ sh %{SOURCE92} --verify . %{SOURCE91} ### patch222 might not be applicable anymore #%patch1222 -p1 +%patch1223 -p1 +%patch1224 -p1 +%patch1225 -p1 +%patch1226 -p1 +%patch1227 -p1 +%patch1228 -p1 +%patch1229 -p1 +%patch1230 -p1 +%patch1231 -p1 +%patch1232 -p1 + %build test -e source-file-list || \ find . -type f \! -name '*.orig' \! -path ./source-file-list > \