Fall back to libinput if the module is missing

This commit is contained in:
Peter Hutterer 2016-09-01 17:01:16 +10:00
parent 6f968ef6a9
commit d6e8cd83fc
2 changed files with 163 additions and 1 deletions

View File

@ -0,0 +1,155 @@
From a3922cf7f02feac88a80995cef5e843aafdd970b Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Wed, 1 Jun 2016 14:38:54 +1000
Subject: [PATCH xserver] Allow compile-time selection of a fallback input
driver
A new --with-fallback-input-driver=foo option allows selecting a
fallback driver for the server if the driver configured for the device
is not found. Note that this only applies when the device has a driver
assigned and that module fails to load, devices without a driver are
ignored as usual.
This avoids the situation where a configuration assigns e.g. the
synaptics driver but that driver is not available on the system,
resulting in a dead device. A fallback driver can at least provides some
functionality.
This becomes more important as we move towards making other driver true
leaf nodes that can be installed/uninstalled as requested. Specifically,
wacom and synaptics, a config that assigns either driver should be
viable even when the driver itself is not (yet) installed on the system.
It is up to the distributions to make sure that the fallback driver is
always installed. The fallback driver can be disabled with
--without-fallback-input-driver and is disabled by default on non-Linux
systems because we don't have generic drivers on those platforms.
Default driver on Linux is libinput, evdev is the only other serious
candidate here.
Sample log output:
[ 3274.421] (II) config/udev: Adding input device SynPS/2 Synaptics TouchPad (/dev/input/event4)
[ 3274.421] (**) SynPS/2 Synaptics TouchPad: Applying InputClass "touchpad weird driver"
[ 3274.421] (II) LoadModule: "banana"
[ 3274.422] (WW) Warning, couldn't open module banana
[ 3274.422] (II) UnloadModule: "banana"
[ 3274.422] (II) Unloading banana
[ 3274.422] (EE) Failed to load module "banana" (module does not exist, 0)
[ 3274.422] (EE) No input driver matching `banana'
[ 3274.422] (II) Falling back to input driver `libinput'
.. server proceeds to assign libinput, init the device, world peace and rainbows
everywhere, truly what a sight. Shame about the banana though.
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit c69bd15e00aea2610834d05f63777f9bf20eca34)
---
configure.ac | 19 +++++++++++++++++++
hw/xfree86/common/xf86Xinput.c | 39 +++++++++++++++++++++++++++++++--------
include/xorg-config.h.in | 3 +++
3 files changed, 53 insertions(+), 8 deletions(-)
diff --git a/configure.ac b/configure.ac
index 868e859..dea8edd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -493,6 +493,25 @@ AC_ARG_ENABLE(listen-local, AS_HELP_STRING([--disable-listen-local],
[Listen on local by default (default:enabled)]),
[LISTEN_LOCAL=$enableval], [LISTEN_LOCAL=yes])
+case $host_os in
+ linux*)
+ FALLBACK_INPUT_DRIVER="libinput"
+ ;;
+ *)
+ FALLBACK_INPUT_DRIVER=""
+ ;;
+esac
+AC_ARG_WITH(fallback-input-driver,
+ AC_HELP_STRING([--with-fallback-input-driver=$FALLBACK_INPUT_DRIVER],
+ [Input driver fallback if the requested driver for a device is unavailable]),
+ [ FALLBACK_INPUT_DRIVER=$withval ], [])
+if test "x$FALLBACK_INPUT_DRIVER" = "xno"; then
+ FALLBACK_INPUT_DRIVER=""
+fi
+AC_MSG_CHECKING([for fallback input driver])
+AC_MSG_RESULT([$FALLBACK_INPUT_DRIVER])
+AC_DEFINE_UNQUOTED(FALLBACK_INPUT_DRIVER, ["$FALLBACK_INPUT_DRIVER"], [ Fallback input driver ])
+
dnl Determine font path
XORG_FONTROOTDIR
XORG_FONTSUBDIR(FONTMISCDIR, fontmiscdir, misc)
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index c56a2b9..44f4818 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -819,6 +819,22 @@ xf86stat(const char *path, int *maj, int *min)
*min = minor(st.st_rdev);
}
+static inline InputDriverPtr
+xf86LoadInputDriver(const char *driver_name)
+{
+ InputDriverPtr drv = NULL;
+
+ /* Memory leak for every attached device if we don't
+ * test if the module is already loaded first */
+ drv = xf86LookupInputDriver(driver_name);
+ if (!drv) {
+ if (xf86LoadOneModule(driver_name, NULL))
+ drv = xf86LookupInputDriver(driver_name);
+ }
+
+ return drv;
+}
+
/**
* Create a new input device, activate and enable it.
*
@@ -845,16 +861,23 @@ xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL enable)
int rval;
char *path = NULL;
- /* Memory leak for every attached device if we don't
- * test if the module is already loaded first */
- drv = xf86LookupInputDriver(pInfo->driver);
- if (!drv)
- if (xf86LoadOneModule(pInfo->driver, NULL))
- drv = xf86LookupInputDriver(pInfo->driver);
+ drv = xf86LoadInputDriver(pInfo->driver);
if (!drv) {
xf86Msg(X_ERROR, "No input driver matching `%s'\n", pInfo->driver);
- rval = BadName;
- goto unwind;
+
+ if (strlen(FALLBACK_INPUT_DRIVER) > 0) {
+ xf86Msg(X_INFO, "Falling back to input driver `%s'\n",
+ FALLBACK_INPUT_DRIVER);
+ drv = xf86LoadInputDriver(FALLBACK_INPUT_DRIVER);
+ if (drv) {
+ free(pInfo->driver);
+ pInfo->driver = strdup(FALLBACK_INPUT_DRIVER);
+ }
+ }
+ if (!drv) {
+ rval = BadName;
+ goto unwind;
+ }
}
path = xf86CheckStrOption(pInfo->options, "Device", NULL);
diff --git a/include/xorg-config.h.in b/include/xorg-config.h.in
index 7c03126..2e2da45 100644
--- a/include/xorg-config.h.in
+++ b/include/xorg-config.h.in
@@ -151,4 +151,7 @@
/* Support APM/ACPI power management in the server */
#undef XF86PM
+/* Fallback input driver if the assigned driver fails */
+#undef FALLBACK_INPUT_DRIVER
+
#endif /* _XORG_CONFIG_H_ */
--
2.7.4

View File

@ -45,7 +45,7 @@
Summary: X.Org X11 X server
Name: xorg-x11-server
Version: 1.18.4
Release: 4%{?gitdate:.%{gitdate}}%{dist}
Release: 5%{?gitdate:.%{gitdate}}%{dist}
URL: http://www.x.org
License: MIT
Group: User Interface/X
@ -90,9 +90,13 @@ Patch7025: 0001-Always-install-vbe-and-int10-sdk-headers.patch
# do not upstream - do not even use here yet
Patch7027: xserver-autobind-hotplug.patch
# Pick libinput as driver when the assigned module is missing
Patch7028: 0001-Allow-compile-time-selection-of-a-fallback-input-dri.patch
# because the display-managers are not ready yet, do not upstream
Patch10000: 0001-Fedora-hack-Make-the-suid-root-wrapper-always-start-.patch
%global moduledir %{_libdir}/xorg/modules
%global drimoduledir %{_libdir}/dri
%global sdkdir %{_includedir}/xorg
@ -630,6 +634,9 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete
%changelog
* Thu Sep 01 2016 Peter Hutterer <peter.hutterer@redhat.com> 1.18.4-5
- Fall back to libinput if the module is missing
* Thu Aug 25 2016 Hans de Goede <hdegoede@redhat.com> - 1.18.4-4
- Fix (undo) server ABI breakage from 1.18.4-3