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