10-evdev.conf | 40 ++ Makefile.am | 1 configure.ac | 21 - debian/changelog | 8 debian/control | 2 debian/xserver-xorg-input-evdev-udeb.install | 1 debian/xserver-xorg-input-evdev.install | 1 man/evdev.man | 6 src/emuThird.c | 10 src/emuWheel.c | 2 src/evdev.c | 501 +++++++++++++-------------- src/evdev.h | 32 - 12 files changed, 328 insertions(+), 297 deletions(-)
New commits: commit d9dd48adfa26b576c42d223448b55143671d4d5b Author: Timo Aaltonen <tjaal...@debian.org> Date: Wed Jan 27 15:48:24 2016 +0200 release to unstable diff --git a/debian/changelog b/debian/changelog index 06adf38..c640633 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,10 +1,10 @@ -xserver-xorg-input-evdev (1:2.10.1-1) UNRELEASED; urgency=medium +xserver-xorg-input-evdev (1:2.10.1-1) unstable; urgency=medium * New upstream release. * control, install: Ship 10-evdev.conf with the driver, breaks/replaces server << 1.18.0-1. - -- Timo Aaltonen <tjaal...@debian.org> Mon, 18 Jan 2016 14:40:32 +0200 + -- Timo Aaltonen <tjaal...@debian.org> Wed, 27 Jan 2016 15:47:54 +0200 xserver-xorg-input-evdev (1:2.9.2-1) unstable; urgency=medium commit 0873ef6e22932959c8757a38fe938c88477446b2 Author: Timo Aaltonen <tjaal...@debian.org> Date: Wed Jan 20 12:57:01 2016 +0200 add xserver epoch to Breaks/Replaces diff --git a/debian/control b/debian/control index b00c181..2196891 100644 --- a/debian/control +++ b/debian/control @@ -30,8 +30,8 @@ Depends: ${xinpdriver:Depends}, Provides: ${xinpdriver:Provides} -Breaks: xserver-xorg-core (<< 1.18.0-1) -Replaces: xserver-xorg-core (<< 1.18.0-1) +Breaks: xserver-xorg-core (<< 2:1.18.0-1) +Replaces: xserver-xorg-core (<< 2:1.18.0-1) Description: X.Org X server -- evdev input driver This package provides the driver for input devices using evdev, the Linux kernel's event delivery mechanism. This driver allows for multiple keyboards commit ca013742a622e8385938bc23547bc605eac75add Author: Timo Aaltonen <tjaal...@debian.org> Date: Mon Jan 18 14:54:13 2016 +0200 control, install: Ship 10-evdev.conf with the driver, breaks/replaces server << 1.18.0-1. diff --git a/debian/changelog b/debian/changelog index 68a973d..06adf38 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,8 @@ xserver-xorg-input-evdev (1:2.10.1-1) UNRELEASED; urgency=medium * New upstream release. + * control, install: Ship 10-evdev.conf with the driver, + breaks/replaces server << 1.18.0-1. -- Timo Aaltonen <tjaal...@debian.org> Mon, 18 Jan 2016 14:40:32 +0200 diff --git a/debian/control b/debian/control index 1411a8d..b00c181 100644 --- a/debian/control +++ b/debian/control @@ -30,6 +30,8 @@ Depends: ${xinpdriver:Depends}, Provides: ${xinpdriver:Provides} +Breaks: xserver-xorg-core (<< 1.18.0-1) +Replaces: xserver-xorg-core (<< 1.18.0-1) Description: X.Org X server -- evdev input driver This package provides the driver for input devices using evdev, the Linux kernel's event delivery mechanism. This driver allows for multiple keyboards diff --git a/debian/xserver-xorg-input-evdev-udeb.install b/debian/xserver-xorg-input-evdev-udeb.install index 4ac2576..2044bb5 100644 --- a/debian/xserver-xorg-input-evdev-udeb.install +++ b/debian/xserver-xorg-input-evdev-udeb.install @@ -1 +1,2 @@ usr/lib/xorg/modules/input/*.so +usr/share/X11/xorg.conf.d/10-evdev.conf diff --git a/debian/xserver-xorg-input-evdev.install b/debian/xserver-xorg-input-evdev.install index 97e3c20..e393ea7 100644 --- a/debian/xserver-xorg-input-evdev.install +++ b/debian/xserver-xorg-input-evdev.install @@ -1,2 +1,3 @@ usr/lib/xorg/modules/input/*.so usr/share/man +usr/share/X11/xorg.conf.d/10-evdev.conf commit 479d37f0768947688ffc98ff32e8c3c884d3ea16 Author: Timo Aaltonen <tjaal...@debian.org> Date: Mon Jan 18 14:47:41 2016 +0200 update the changelog diff --git a/debian/changelog b/debian/changelog index 81c35d2..68a973d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +xserver-xorg-input-evdev (1:2.10.1-1) UNRELEASED; urgency=medium + + * New upstream release. + + -- Timo Aaltonen <tjaal...@debian.org> Mon, 18 Jan 2016 14:40:32 +0200 + xserver-xorg-input-evdev (1:2.9.2-1) unstable; urgency=medium * New upstream release. commit 6a3beab6137b262fc847093ed5fa51ff70df6a21 Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Fri Jan 8 15:11:59 2016 +1000 evdev 2.10.1 Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> diff --git a/configure.ac b/configure.ac index cc60ce7..3fe2012 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) AC_INIT([xf86-input-evdev], - [2.10.0], + [2.10.1], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [xf86-input-evdev]) AC_CONFIG_SRCDIR([Makefile.am]) commit d7e61a7074b802b49f57549530b289bbaa0a4855 Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Tue Nov 10 14:35:51 2015 +1000 Only map x and y to axes 0 and 1 The Logitech G600 has one device with all axes north of ABS_MISC. The current code assigns ABS_MISC as first axis to map to axis 0, i.e. x. On button press, one node sends the BTN_LEFT but the other node sends an ABS_MISC with a 1 0 value. ABS_MISC is mapped to axis 0, this moves the pointer to (0, y) on every button click. Avoid this by simply mapping any axis other than x/y to at least axis 3, and make sure we only override the MT 0/1 axes when we actually have MT axes. https://bugs.freedesktop.org/show_bug.cgi?id=92856 Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> Reviewed-by: Keith Packard <kei...@keithp.com> diff --git a/src/evdev.c b/src/evdev.c index 17d9d61..3176660 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1377,7 +1377,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes) } atoms = malloc((pEvdev->num_vals + num_mt_axes) * sizeof(Atom)); - i = 0; + i = 2; for (axis = ABS_X; i < MAX_VALUATORS && axis <= ABS_MAX; axis++) { int j; pEvdev->abs_axis_map[axis] = -1; @@ -1385,9 +1385,14 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes) is_blacklisted_axis(axis)) continue; - mapping = i; + if (axis == ABS_X) + mapping = 0; + else if (axis == ABS_Y) + mapping = 1; + else + mapping = i; - for (j = 0; j < ArrayLength(mt_axis_mappings); j++) + for (j = 0; !pEvdev->fake_mt && j < ArrayLength(mt_axis_mappings); j++) { if (mt_axis_mappings[j].code == axis) mt_axis_mappings[j].mapping = mapping; commit 01e7ac48546d4534fa420ea1873214e738ea125d Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Wed Oct 28 14:28:20 2015 +1000 evdev 2.10.0 Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> diff --git a/configure.ac b/configure.ac index f6fd2e4..cc60ce7 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) AC_INIT([xf86-input-evdev], - [2.9.99], + [2.10.0], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [xf86-input-evdev]) AC_CONFIG_SRCDIR([Makefile.am]) commit 034be31159f22ce28d84994d541a45ee44963fd8 Author: Thomas Hindoe Paaboel Andersen <pho...@gmail.com> Date: Tue Jan 20 00:44:40 2015 +0100 Add "Resolution" option for mice to the evdev driver It can be used to scale the resolution of a mouse to that of a 1000 DPI mouse. This can be useful to make high resolution mice less sensitive without turning off acceleration. The target of 1000 DPI is used as the same default is used in libinput. If the option is not set no scaling will be done. https://bugs.freedesktop.org/show_bug.cgi?id=88134 Signed-off-by: Thomas Hindoe Paaboel Andersen <pho...@gmail.com> Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> diff --git a/man/evdev.man b/man/evdev.man index 06613fc..e70ae1f 100644 --- a/man/evdev.man +++ b/man/evdev.man @@ -238,6 +238,12 @@ Default: "1". Property: "Evdev Scrolling Distance". .BI "Option \*qDialDelta\*q \*q" integer \*q The amount of motion considered one unit of turning the dial. Default: "1". Property: "Evdev Scrolling Distance". +.TP 7 +.BI "Option \*qResolution\*q \*q" integer \*q +Sets the resolution of the device in dots per inch. The resolution is used +to scale relative motion events from mouse devices to 1000 DPI resolution. This +can be used to make high resolution mice less sensitive without turning off +acceleration. If set to 0 no scaling will be performed. Default: "0". .SH SUPPORTED PROPERTIES The following properties are provided by the diff --git a/src/emuThird.c b/src/emuThird.c index 7461767..5f14d33 100644 --- a/src/emuThird.c +++ b/src/emuThird.c @@ -229,8 +229,8 @@ Evdev3BEmuProcessAbsMotion(InputInfoPtr pInfo, ValuatorMask *vals) { if (valuator_mask_isset(vals, axis)) { - int delta = valuator_mask_get(vals, axis) - emu3B->startpos[axis]; - if (abs(delta) > emu3B->threshold) + double delta = valuator_mask_get_double(vals, axis) - emu3B->startpos[axis]; + if (fabs(delta) > emu3B->threshold) cancel = TRUE; } axis++; @@ -248,7 +248,7 @@ Evdev3BEmuProcessAbsMotion(InputInfoPtr pInfo, ValuatorMask *vals) * emulation. */ void -Evdev3BEmuProcessRelMotion(InputInfoPtr pInfo, int dx, int dy) +Evdev3BEmuProcessRelMotion(InputInfoPtr pInfo, double dx, double dy) { EvdevPtr pEvdev = pInfo->private; struct emulate3B *emu3B = &pEvdev->emulate3B; @@ -260,8 +260,8 @@ Evdev3BEmuProcessRelMotion(InputInfoPtr pInfo, int dx, int dy) emu3B->delta[1] += dy; emu3B->flags |= EVDEV_RELATIVE_EVENTS; - if (abs(emu3B->delta[0]) > emu3B->threshold || - abs(emu3B->delta[1]) > emu3B->threshold) + if (fabs(emu3B->delta[0]) > emu3B->threshold || + fabs(emu3B->delta[1]) > emu3B->threshold) { Evdev3BEmuPostButtonEvent(pInfo, 1, BUTTON_PRESS); Evdev3BCancel(pInfo); diff --git a/src/evdev.c b/src/evdev.c index da25b56..17d9d61 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -25,6 +25,7 @@ * Adam Jackson (a...@redhat.com) * Peter Hutterer (peter.hutte...@redhat.com) * Oliver McFadden (oliver.mcfad...@nokia.com) + * Thomas H.P. Andersen (pho...@gmail.com) */ #ifdef HAVE_CONFIG_H @@ -432,31 +433,36 @@ EvdevProcessValuators(InputInfoPtr pInfo) /* Apply transformations on relative coordinates */ if (pEvdev->rel_queued) { - int deltaX = 0, deltaY = 0; + double deltaX = 0, deltaY = 0; if (valuator_mask_isset(pEvdev->rel_vals, REL_X)) - deltaX = valuator_mask_get(pEvdev->rel_vals, REL_X); + deltaX = valuator_mask_get_double(pEvdev->rel_vals, REL_X); if (valuator_mask_isset(pEvdev->rel_vals, REL_Y)) - deltaY = valuator_mask_get(pEvdev->rel_vals, REL_Y); + deltaY = valuator_mask_get_double(pEvdev->rel_vals, REL_Y); if (pEvdev->swap_axes) { - int tmp = deltaX; + double tmp = deltaX; deltaX = deltaY; deltaY = tmp; } + if (pEvdev->resolution > 0) { + deltaX *= DEFAULT_MOUSE_DPI / pEvdev->resolution; + deltaY *= DEFAULT_MOUSE_DPI / pEvdev->resolution; + } + if (pEvdev->invert_x) deltaX *= -1; if (pEvdev->invert_y) deltaY *= -1; if (deltaX) - valuator_mask_set(pEvdev->rel_vals, REL_X, deltaX); + valuator_mask_set_double(pEvdev->rel_vals, REL_X, deltaX); else valuator_mask_unset(pEvdev->rel_vals, REL_X); if (deltaY) - valuator_mask_set(pEvdev->rel_vals, REL_Y, deltaY); + valuator_mask_set_double(pEvdev->rel_vals, REL_Y, deltaY); else valuator_mask_unset(pEvdev->rel_vals, REL_Y); @@ -2293,6 +2299,12 @@ EvdevProbe(InputInfoPtr pInfo) pEvdev->invert_y = xf86SetBoolOption(pInfo->options, "InvertY", FALSE); pEvdev->swap_axes = xf86SetBoolOption(pInfo->options, "SwapAxes", FALSE); + pEvdev->resolution = xf86SetIntOption(pInfo->options, "Resolution", 0); + if (pEvdev->resolution < 0) { + xf86IDrvMsg(pInfo, X_ERROR, "Resolution must be a positive number"); + pEvdev->resolution = 0; + } + str = xf86CheckStrOption(pInfo->options, "Calibration", NULL); if (str) { num_calibration = sscanf(str, "%d %d %d %d", diff --git a/src/evdev.h b/src/evdev.h index 0f71d78..4d44d2b 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -97,6 +97,8 @@ /* Number of longs needed to hold the given number of bits */ #define NLONGS(x) (((x) + LONG_BITS - 1) / LONG_BITS) +#define DEFAULT_MOUSE_DPI 1000.0 + /* Function key mode */ enum fkeymode { FKEYMODE_UNKNOWN = 0, @@ -170,6 +172,7 @@ typedef struct { BOOL swap_axes; BOOL invert_x; BOOL invert_y; + int resolution; unsigned int abs_queued, rel_queued, prox_queued; @@ -191,7 +194,7 @@ typedef struct { int button; /* phys button to emit */ int threshold; /* move threshold in dev coords */ OsTimerPtr timer; - int delta[2]; /* delta x/y, accumulating */ + double delta[2]; /* delta x/y, accumulating */ int startpos[2]; /* starting pos for abs devices */ int flags; /* remember if we had rel or abs movement */ } emulate3B; @@ -269,7 +272,7 @@ BOOL Evdev3BEmuFilterEvent(InputInfoPtr, int, BOOL); void Evdev3BEmuPreInit(InputInfoPtr pInfo); void Evdev3BEmuOn(InputInfoPtr); void Evdev3BEmuFinalize(InputInfoPtr); -void Evdev3BEmuProcessRelMotion(InputInfoPtr pInfo, int dx, int dy); +void Evdev3BEmuProcessRelMotion(InputInfoPtr pInfo, double dx, double dy); void Evdev3BEmuProcessAbsMotion(InputInfoPtr pInfo, ValuatorMask *vals); /* Mouse Wheel emulation */ commit 66c997886424a20e92ce30fcfda46cbb5c7352ab Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Tue May 5 15:34:07 2015 +1000 Add the default evdev config This used to be part of the server but now that we have two drivers doing the same thing (libinput, evdev) shift the configuration defaults to the driver. This way you get what you install. https://bugs.freedesktop.org/show_bug.cgi?id=89023 Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> Reviewed-by: Hans de Goede <hdego...@redhat.com> diff --git a/10-evdev.conf b/10-evdev.conf new file mode 100644 index 0000000..cc83ab2 --- /dev/null +++ b/10-evdev.conf @@ -0,0 +1,40 @@ +# +# Catch-all evdev loader for udev-based systems +# We don't simply match on any device since that also adds accelerometers +# and other devices that we don't really want to use. The list below +# matches everything but joysticks. + +Section "InputClass" + Identifier "evdev pointer catchall" + MatchIsPointer "on" + MatchDevicePath "/dev/input/event*" + Driver "evdev" +EndSection + +Section "InputClass" + Identifier "evdev keyboard catchall" + MatchIsKeyboard "on" + MatchDevicePath "/dev/input/event*" + Driver "evdev" +EndSection + +Section "InputClass" + Identifier "evdev touchpad catchall" + MatchIsTouchpad "on" + MatchDevicePath "/dev/input/event*" + Driver "evdev" +EndSection + +Section "InputClass" + Identifier "evdev tablet catchall" + MatchIsTablet "on" + MatchDevicePath "/dev/input/event*" + Driver "evdev" +EndSection + +Section "InputClass" + Identifier "evdev touchscreen catchall" + MatchIsTouchscreen "on" + MatchDevicePath "/dev/input/event*" + Driver "evdev" +EndSection diff --git a/Makefile.am b/Makefile.am index 00c7940..1cc3ea6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -28,6 +28,7 @@ MAINTAINERCLEANFILES = ChangeLog INSTALL pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = xorg-evdev.pc +dist_xorgconf_DATA = 10-evdev.conf .PHONY: ChangeLog INSTALL diff --git a/configure.ac b/configure.ac index e0d480a..f6fd2e4 100644 --- a/configure.ac +++ b/configure.ac @@ -59,6 +59,13 @@ AC_ARG_WITH(xorg-module-dir, inputdir=${moduledir}/input AC_SUBST(inputdir) +AC_ARG_WITH(xorg-conf-dir, + AC_HELP_STRING([--with-xorg-conf-dir=DIR], + [Default xorg.conf.d directory [[default=$prefix/share/X11/xorg.conf.d/]]]), + [xorgconfdir="$withval"], + [xorgconfdir="$prefix/share/X11/xorg.conf.d"]) +AC_SUBST(xorgconfdir) + # X Server SDK location is required to install evdev header files # This location is also relayed in the xorg-evdev.pc file sdkdir=`$PKG_CONFIG --variable=sdkdir xorg-server` commit 0d3494eadfde7e8d30e1bae97cfa6b36e5128a11 Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Fri Mar 27 11:41:50 2015 +1000 Bump to 2.9.99 Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> diff --git a/configure.ac b/configure.ac index 277358d..e0d480a 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) AC_INIT([xf86-input-evdev], - [2.9.1], + [2.9.99], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [xf86-input-evdev]) AC_CONFIG_SRCDIR([Makefile.am]) commit 56a5e6716204916691a67082e3e6a1698df2061b Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Mon Mar 16 07:55:34 2015 +1000 Unconditionally require mtdev Missing from 2c9f4f0380d Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> diff --git a/configure.ac b/configure.ac index e53177e..277358d 100644 --- a/configure.ac +++ b/configure.ac @@ -48,7 +48,7 @@ PKG_CHECK_MODULES(XORG, [xorg-server >= 1.12] xproto [inputproto >= 2.1.99.3]) PKG_CHECK_MODULES(UDEV, libudev) PKG_CHECK_MODULES(LIBEVDEV, [libevdev >= 0.4]) -PKG_CHECK_MODULES(MTDEV, mtdev, HAVE_MTDEV="yes", HAVE_MTDEV="no") +PKG_CHECK_MODULES(MTDEV, mtdev) # Define a configure option for an alternate input module directory AC_ARG_WITH(xorg-module-dir, commit 74433f788acf41a43da54269eb1b73c407f3ceba Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Fri Mar 13 11:05:03 2015 +1000 Always check for a return value on creating a property Mostly to make static analyzers happy Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> diff --git a/src/evdev.c b/src/evdev.c index 360bbb8..da25b56 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -2828,6 +2828,9 @@ EvdevInitProperty(DeviceIntPtr dev) strlen(XI_PROP_VIRTUAL_DEVICE), TRUE); rc = XIChangeDeviceProperty(dev, prop_virtual, XA_INTEGER, 8, PropModeReplace, 1, &virtual, FALSE); + if (rc != Success) + return; + XISetDevicePropertyDeletable(dev, prop_virtual, FALSE); } @@ -2900,8 +2903,11 @@ EvdevInitProperty(DeviceIntPtr dev) } EvdevInitAxesLabels(pEvdev, mode, num_axes, atoms); - XIChangeDeviceProperty(dev, prop_axis_label, XA_ATOM, 32, - PropModeReplace, num_axes, atoms, FALSE); + rc = XIChangeDeviceProperty(dev, prop_axis_label, XA_ATOM, 32, + PropModeReplace, num_axes, atoms, FALSE); + if (rc != Success) + return; + XISetDevicePropertyDeletable(dev, prop_axis_label, FALSE); } /* Button labelling */ @@ -2909,8 +2915,11 @@ EvdevInitProperty(DeviceIntPtr dev) { Atom atoms[EVDEV_MAXBUTTONS]; EvdevInitButtonLabels(pEvdev, EVDEV_MAXBUTTONS, atoms); - XIChangeDeviceProperty(dev, prop_btn_label, XA_ATOM, 32, - PropModeReplace, pEvdev->num_buttons, atoms, FALSE); + rc = XIChangeDeviceProperty(dev, prop_btn_label, XA_ATOM, 32, + PropModeReplace, pEvdev->num_buttons, atoms, FALSE); + if (rc != Success) + return; + XISetDevicePropertyDeletable(dev, prop_btn_label, FALSE); } @@ -2922,8 +2931,11 @@ EvdevInitProperty(DeviceIntPtr dev) }; prop_scroll_dist = MakeAtom(EVDEV_PROP_SCROLL_DISTANCE, strlen(EVDEV_PROP_SCROLL_DISTANCE), TRUE); - XIChangeDeviceProperty(dev, prop_scroll_dist, XA_INTEGER, 32, - PropModeReplace, 3, smooth_scroll_values, FALSE); + rc = XIChangeDeviceProperty(dev, prop_scroll_dist, XA_INTEGER, 32, + PropModeReplace, 3, smooth_scroll_values, FALSE); + if (rc != Success) + return; + XISetDevicePropertyDeletable(dev, prop_scroll_dist, FALSE); } commit fdc33809de2751c164183df2310a71732be579f3 Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Fri Mar 13 10:58:01 2015 +1000 Invert a condition to reduce nesting Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> diff --git a/src/evdev.c b/src/evdev.c index 639e4a1..360bbb8 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -2759,22 +2759,22 @@ static void EvdevInitButtonLabels(EvdevPtr pEvdev, int natoms, Atom *atoms) for (button = BTN_MISC; button < BTN_JOYSTICK; button++) { - if (libevdev_has_event_code(pEvdev->dev, EV_KEY, button)) - { - int group = (button % 0x100)/16; - int idx = button - ((button/16) * 16); + int group = (button % 0x100)/16; + int idx = button - ((button/16) * 16); + + if (!libevdev_has_event_code(pEvdev->dev, EV_KEY, button)) + continue; - if (!btn_labels[group][idx]) - continue; + if (!btn_labels[group][idx]) + continue; - atom = XIGetKnownProperty(btn_labels[group][idx]); - if (!atom) - continue; + atom = XIGetKnownProperty(btn_labels[group][idx]); + if (!atom) + continue; - /* Props are 0-indexed, button numbers start with 1 */ - bmap = EvdevUtilButtonEventToButtonNumber(pEvdev, button) - 1; - atoms[bmap] = atom; - } + /* Props are 0-indexed, button numbers start with 1 */ + bmap = EvdevUtilButtonEventToButtonNumber(pEvdev, button) - 1; + atoms[bmap] = atom; } /* wheel buttons, hardcoded anyway */ commit 38e107a39fb4a0b630ee5adb5870c91dbc27abde Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Wed Mar 11 14:58:04 2015 +1000 Disable axis faking and MT event processing on fake MT devices This effectively disables all axes >= ABS_MT_SLOT on those devices. But at least the device comes up without an error and it didn't work correctly beforehand anyway. https://bugs.freedesktop.org/show_bug.cgi?id=89473 Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> Reviewed-by: Hans de Goede <hdego...@redhat.com> diff --git a/src/evdev.c b/src/evdev.c index 7ce7405..639e4a1 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -696,6 +696,9 @@ EvdevProcessTouchEvent(InputInfoPtr pInfo, struct input_event *ev) !libevdev_has_event_code(pEvdev->dev, EV_ABS, ABS_MT_SLOT)) return; + if (pEvdev->fake_mt) + return; + if (ev->code == ABS_MT_SLOT) { EvdevProcessTouch(pInfo); if (ev->value >= num_slots(pEvdev) ) { @@ -1174,6 +1177,9 @@ EvdevAddFakeSingleTouchAxes(InputInfoPtr pInfo) int num_axes = 0; int i; + if (pEvdev->fake_mt) + return 0; + /* Android drivers often have ABS_MT_POSITION_X but not ABS_X. Loop over the MT->legacy axis table and add fake axes. */ for (i = 0; i < ArrayLength(mt_axis_mappings); i++) @@ -1207,6 +1213,9 @@ EvdevCountMTAxes(EvdevPtr pEvdev, int *num_mt_axes_total, { int axis; + if (pEvdev->fake_mt) + return; + /* Absolute multitouch axes: adjust mapping and axes counts. */ for (axis = ABS_MT_SLOT; axis < ABS_MAX; axis++) { @@ -2199,6 +2208,10 @@ EvdevProbe(InputInfoPtr pInfo) } } + if (libevdev_has_event_code(pEvdev->dev, EV_ABS, ABS_MT_SLOT) && + libevdev_get_num_slots(pEvdev->dev) == -1) + pEvdev->fake_mt = TRUE; + if (ignore_abs && has_abs_axes) { xf86IDrvMsg(pInfo, X_INFO, "Absolute axes present but ignored.\n"); @@ -2220,6 +2233,8 @@ EvdevProbe(InputInfoPtr pInfo) pEvdev->flags |= EVDEV_BUTTON_EVENTS; } } + if (pEvdev->fake_mt) + xf86IDrvMsg(pInfo, X_PROBED, "Fake MT device detected\n"); } if ((libevdev_has_event_code(pEvdev->dev, EV_ABS, ABS_X) && diff --git a/src/evdev.h b/src/evdev.h index 4aa7652..0f71d78 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -161,6 +161,7 @@ typedef struct { enum SlotState state; } *slots; struct mtdev *mtdev; + BOOL fake_mt; int flags; int in_proximity; /* device in proximity */ commit b6176cff5a3fbccc3708721958e9fb346518f57e Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Wed Mar 11 13:44:28 2015 +1000 Invert two conditions to reduce nesting Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> Reviewed-by: Hans de Goede <hdego...@redhat.com> diff --git a/src/evdev.c b/src/evdev.c index dacd3e3..7ce7405 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1180,22 +1180,22 @@ EvdevAddFakeSingleTouchAxes(InputInfoPtr pInfo) { int mt_code = mt_axis_mappings[i].mt_code; int code = mt_axis_mappings[i].code; + const struct input_absinfo* abs; - if (libevdev_has_event_code(pEvdev->dev, EV_ABS, mt_code) && - !libevdev_has_event_code(pEvdev->dev, EV_ABS, code)) + if (!libevdev_has_event_code(pEvdev->dev, EV_ABS, mt_code) || + libevdev_has_event_code(pEvdev->dev, EV_ABS, code)) + continue; + + abs = libevdev_get_abs_info(pEvdev->dev, mt_code); + if (libevdev_enable_event_code(pEvdev->dev, EV_ABS, code, abs)) { - const struct input_absinfo* abs; - abs = libevdev_get_abs_info(pEvdev->dev, mt_code); - if (libevdev_enable_event_code(pEvdev->dev, EV_ABS, code, abs)) - { - xf86IDrvMsg(pInfo, X_ERROR, "Failed to fake axis %s.\n", - libevdev_event_code_get_name(EV_ABS, code)); - return -1; - } - xf86IDrvMsg(pInfo, X_INFO, "Faking axis %s.\n", + xf86IDrvMsg(pInfo, X_ERROR, "Failed to fake axis %s.\n", libevdev_event_code_get_name(EV_ABS, code)); - num_axes++; + return -1; } + xf86IDrvMsg(pInfo, X_INFO, "Faking axis %s.\n", + libevdev_event_code_get_name(EV_ABS, code)); + num_axes++; } return num_axes; @@ -1210,30 +1210,30 @@ EvdevCountMTAxes(EvdevPtr pEvdev, int *num_mt_axes_total, /* Absolute multitouch axes: adjust mapping and axes counts. */ for (axis = ABS_MT_SLOT; axis < ABS_MAX; axis++) { - if (libevdev_has_event_code(pEvdev->dev, EV_ABS, axis)) - { - int j; - Bool skip = FALSE; + int j; + Bool skip = FALSE; - /* Setup mapping if axis is in MT->legacy axis table. */ - for (j = 0; j < ArrayLength(mt_axis_mappings); j++) - { - if (mt_axis_mappings[j].mt_code == axis && - libevdev_has_event_code(pEvdev->dev, EV_ABS, mt_axis_mappings[j].code)) - { - mt_axis_mappings[j].needs_mapping = TRUE; - skip = TRUE; - } - } + if (!libevdev_has_event_code(pEvdev->dev, EV_ABS, axis)) + continue; - if (!is_blacklisted_axis(axis)) + /* Setup mapping if axis is in MT->legacy axis table. */ + for (j = 0; j < ArrayLength(mt_axis_mappings); j++) + { + if (mt_axis_mappings[j].mt_code == axis && + libevdev_has_event_code(pEvdev->dev, EV_ABS, mt_axis_mappings[j].code)) { - (*num_mt_axes_total)++; - if (!skip) - (*num_mt_axes)++; + mt_axis_mappings[j].needs_mapping = TRUE; + skip = TRUE; } - (*num_axes)--; } + + if (!is_blacklisted_axis(axis)) + { + (*num_mt_axes_total)++; + if (!skip) + (*num_mt_axes)++; + } + (*num_axes)--; } } commit 37afebfb67609f04f9c1cdea983e7006ee2d59e5 Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Wed Mar 11 13:47:32 2015 +1000 Factor out MT axis counting into a separate function Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> Reviewed-by: Hans de Goede <hdego...@redhat.com> diff --git a/src/evdev.c b/src/evdev.c index 1b7b7fd..dacd3e3 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1201,6 +1201,42 @@ EvdevAddFakeSingleTouchAxes(InputInfoPtr pInfo) return num_axes; } +static void +EvdevCountMTAxes(EvdevPtr pEvdev, int *num_mt_axes_total, + int *num_mt_axes, int *num_axes) +{ + int axis; + + /* Absolute multitouch axes: adjust mapping and axes counts. */ + for (axis = ABS_MT_SLOT; axis < ABS_MAX; axis++) + { + if (libevdev_has_event_code(pEvdev->dev, EV_ABS, axis)) + { + int j; + Bool skip = FALSE; + + /* Setup mapping if axis is in MT->legacy axis table. */ + for (j = 0; j < ArrayLength(mt_axis_mappings); j++) + { + if (mt_axis_mappings[j].mt_code == axis && + libevdev_has_event_code(pEvdev->dev, EV_ABS, mt_axis_mappings[j].code)) + { + mt_axis_mappings[j].needs_mapping = TRUE; + skip = TRUE; + } + } + + if (!is_blacklisted_axis(axis)) + { + (*num_mt_axes_total)++; + if (!skip) + (*num_mt_axes)++; + } + (*num_axes)--; + } + } +} + static int EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes) { @@ -1235,34 +1271,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes) num_axes += num_faked_axes; - /* Absolute multitouch axes: adjust mapping and axes counts. */ - for (axis = ABS_MT_SLOT; axis < ABS_MAX; axis++) - { - if (libevdev_has_event_code(pEvdev->dev, EV_ABS, axis)) - { - int j; - Bool skip = FALSE; - - /* Setup mapping if axis is in MT->legacy axis table. */ - for (j = 0; j < ArrayLength(mt_axis_mappings); j++) - { - if (mt_axis_mappings[j].mt_code == axis && - libevdev_has_event_code(pEvdev->dev, EV_ABS, mt_axis_mappings[j].code)) - { - mt_axis_mappings[j].needs_mapping = TRUE; - skip = TRUE; - } - } - - if (!is_blacklisted_axis(axis)) - { - num_mt_axes_total++; - if (!skip) - num_mt_axes++; - } - num_axes--; - } - } + EvdevCountMTAxes(pEvdev, &num_mt_axes_total, &num_mt_axes, &num_axes); /* Panic if, after faking ABS_X etc, we still only have mt-axes. */ if (num_axes == 0 && num_mt_axes > 0) { commit 5b5ae1786cb4b2ea35720bacf18f252223b2b2ec Author: Peter Hutterer <peter.hutte...@who-t.net> Date: Wed Mar 11 13:29:19 2015 +1000 Split android axis simulation into a helper function No functional changes Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> Reviewed-by: Hans de Goede <hdego...@redhat.com> diff --git a/src/evdev.c b/src/evdev.c index af691f5..1b7b7fd 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1167,6 +1167,39 @@ is_blacklisted_axis(int axis) } } +static int +EvdevAddFakeSingleTouchAxes(InputInfoPtr pInfo) +{ + EvdevPtr pEvdev = pInfo->private; + int num_axes = 0; + int i; + + /* Android drivers often have ABS_MT_POSITION_X but not ABS_X. + Loop over the MT->legacy axis table and add fake axes. */ + for (i = 0; i < ArrayLength(mt_axis_mappings); i++) + { + int mt_code = mt_axis_mappings[i].mt_code; + int code = mt_axis_mappings[i].code; + + if (libevdev_has_event_code(pEvdev->dev, EV_ABS, mt_code) && + !libevdev_has_event_code(pEvdev->dev, EV_ABS, code)) + { + const struct input_absinfo* abs; + abs = libevdev_get_abs_info(pEvdev->dev, mt_code); + if (libevdev_enable_event_code(pEvdev->dev, EV_ABS, code, abs)) + { + xf86IDrvMsg(pInfo, X_ERROR, "Failed to fake axis %s.\n", + libevdev_event_code_get_name(EV_ABS, code)); + return -1; + } + xf86IDrvMsg(pInfo, X_INFO, "Faking axis %s.\n", + libevdev_event_code_get_name(EV_ABS, code)); + num_axes++; + } + } + + return num_axes; +} static int EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes) @@ -1178,6 +1211,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes) int num_mt_axes = 0, /* number of MT-only axes */ num_mt_axes_total = 0; /* total number of MT axes, including double-counted ones, excluding blacklisted */ + int num_faked_axes; Atom *atoms; int mapping = 0; @@ -1195,28 +1229,11 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes) if (num_axes < 1) goto out; - /* Android drivers often have ABS_MT_POSITION_X but not ABS_X. - Loop over the MT->legacy axis table and add fake axes. */ - for (i = 0; i < ArrayLength(mt_axis_mappings); i++) - {