Compare commits

...

43 Commits

Author SHA1 Message Date
Alan Coopersmith
0b5b97bc6b man page: Replace __xservername__ & __xconfigfile__ with Xorg & xorg.conf
These were originally to allow distros to build using XFree86 & XF86config
names, but we haven't supported that in nearly two decades now.

Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Part-of: <https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev/-/merge_requests/13>
2025-06-01 15:33:56 -07:00
Alan Coopersmith
96a4dc7565 Improve man page formatting
More closely follow common style as described on
https://man7.org/linux/man-pages/man7/man-pages.7.html
and fix warnings raised by  `mandoc -T lint` and `groff -rCHECKSTYLE=10`

Part-of: <https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev/-/merge_requests/13>
2025-05-31 15:53:11 -07:00
Peter Hutterer
abcafeede7 xf86-input-evdev 2.11.0
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2024-10-15 14:32:50 +10:00
Peter Hutterer
d893fc74d2 Map some specific high keycodes into the FK20-23 range
These mappings have been part of xkeyboard-config for over a decade and
the likely reason they were introduced is that the corresponding evdev
keycode is > 255.

Let's forcibly remap those in the driver here so the rest of the system
can switch to the real keycodes instead of having to map them to the
whatever X expects.

See https://github.com/systemd/systemd/pull/34325/

Part-of: <https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev/-/merge_requests/10>
2024-10-09 14:33:05 +10:00
Martin Rys
b9327e6b28 Swap Compose and Kana values to conform to USB HID spec
Should fix https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config/-/issues/204

Current state conflicts with XKB which defines them correctly.

NUM and CAPS are still incorrectly swapped, but it's equally wrong on
XKB's side and everywhere else, so it's just cosmetic and a breaking
change just to satisfy USB HID ordering is not worth it, since the keys
work fine this way anyway.

Part-of: <https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev/-/merge_requests/8>
2024-09-05 11:32:21 +10:00
Peter Hutterer
917c2ea204 gitlab CI: set the standard workflow rules for an fdo project 2024-09-03 13:49:04 +10:00
Enrico Weigelt, metux IT consult
b48c2b7028 dont spam xserver with false-positives
It's not necessary to spam the xserver log with error messages of
just temporary read failures that aren't actually errors.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
Part-of: <https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev/-/merge_requests/6>
2024-06-10 19:05:58 +02:00
Enrico Weigelt, metux IT consult
aac329fd2a fix FTBS on non-udev target platforms (eg. FreeBSD)
On platforms that don't have libudev at all (eg. FreeBSD), the build
breaks. The only consumer, EvdevDeviceIsVirtual(), can live well with
just bailing out directly if libudev isn't present.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
Part-of: <https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev/-/merge_requests/6>
2024-06-10 19:05:54 +02:00
Enrico Weigelt, metux IT consult
fbfb16edfe tolerate including linux/input.h
On some platforms (eg. FreeBSD) we're running into a name clash between
xf86str.h and linux/input.h. Since we don't actually need those symbols
here, an easy workaround is #undef'ing them.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
Part-of: <https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev/-/merge_requests/6>
2024-06-10 18:42:22 +02:00
Enrico Weigelt, metux IT consult
409e8205e8 fix unportable linux-only include
including <linux/types.h> obviously isn't portable - instead using
<sys/types.h> is the right choice for us.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
Part-of: <https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev/-/merge_requests/6>
2024-06-10 18:38:12 +02:00
Enrico Weigelt, metux IT consult
7fc0d51f70 drop quirk for ancient linux kernel version (<2.6.30)
This kernel had been released 1.5 decades ago - probably no need to have
special quirks for such an ancient kernel version anymore.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2024-06-10 18:05:40 +02:00
Enrico Weigelt, metux IT consult
7c48b6225b bump minimal xorg version to 1.18
1.18 was released a decade ago, so it seems reasonable stop supporting
older ones.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
Part-of: <https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev/-/merge_requests/5>
2024-05-14 10:59:46 +02:00
Alan Coopersmith
8edcb2b9e8 gitlab CI: ensure libtool is installed in build container
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2023-10-01 11:22:19 -07:00
Alan Coopersmith
84b2740814 gitlab CI: stop requiring Signed-off-by in commits
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2023-02-09 12:06:53 -08:00
Alan Coopersmith
469a30f158 Convert src/draglock.c from ISO-8859-1 to UTF-8
Fixes flawfinder error in CI:
Error: encoding error in ./src/draglock.c
'utf-8' codec can't decode byte 0xa9 in position 343: invalid start byte

Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2022-01-16 11:11:01 -08:00
Alan Coopersmith
23909c35a4 gitlab CI: add a basic build test
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2022-01-16 10:55:36 -08:00
Alan Coopersmith
abf0fa611e Fix spelling/wording issues
Found by using:
    codespell --builtin clear,rare,usage,informal,code,names

Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2022-01-16 10:51:03 -08:00
Alan Coopersmith
6609d352f3 Build xz tarballs instead of bzip2
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2022-01-16 10:49:21 -08:00
Alan Coopersmith
71036116be Update configure.ac bug URL for gitlab migration
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2018-11-25 12:45:55 -08:00
Alan Coopersmith
b6b36166bd Update README for gitlab migration
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2018-11-18 11:30:58 -08:00
Peter Hutterer
67a97afbc0 evdev 2.10.6
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2018-05-29 10:05:22 +10:00
Andrey Zabolotnyi
2fb95783e0 Fix generation of proximity-in/out events.
Invoking xf86PostProximityEvent with no valuators does nothing, so we
have to provide a valid valuator set to the call.

https://bugs.freedesktop.org/show_bug.cgi?id=104562

[whot: slight change from 104562
abs_vals is reset on every frame but old_vals is kept around to remember the
last value of the valuator (and is updated to the current values before
processing the frame). We expect the prox in to have x/y, so let's just
unconditionally use old_vals for proximity events.]

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2018-05-29 10:00:26 +10:00
Peter Hutterer
456f23cbbd Ignore x/y axis changes on proximity out
Wacom tablets send a farewell reset to 0 on all axes when the tool goes out of
proximity. Ignore those so we can rely on our various valuator masks always
having the correct coordinates.

Possible false positive if you manage to go out of proximity right above the
zero datum but meh.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2018-05-29 10:00:05 +10:00
Christian Gmeiner
ab1d9adfd3 Print cause of a failed open(..) call
This is quite helpful for debugging.

Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2018-01-30 13:37:57 +10:00
Andrey Zabolotnyi
192fdb0690 Fix handling of devices with only buttons (e.g. tablet pads).
When transforming 'only buttons' device into a pseudo-mouse by adding
relative X and Y axes, EVDEV_RELATIVE_EVENTS flag  must be set on device,
otherwise it gets classified as a keyboard by X11.

https://bugs.freedesktop.org/show_bug.cgi?id=104630

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2018-01-16 16:30:59 +10:00
Mihail Konev
8c1058f2eb autogen: add default patch prefix
Signed-off-by: Mihail Konev <k.mvc@ya.ru>
2017-01-26 14:00:21 +10:00
Emil Velikov
4921912374 autogen.sh: use quoted string variables
Place quotes around the $srcdir, $ORIGDIR and $0 variables to prevent
fall-outs, when they contain space.

Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-01-26 11:13:25 +10:00
Peter Hutterer
67681097b8 autogen.sh: use exec instead of waiting for configure to finish
Syncs the invocation of configure with the one from the server.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
2017-01-26 11:13:25 +10:00
Peter Hutterer
1dd61111ad evdev 2.10.5
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-01-18 13:14:29 +10:00
Alexander Volkov
231061d004 Don't send pointer events in addition to touch events
Updating abs_vals for touch events since d24431a186
leads to posting Motion events with updated coordinates to the X server,
which in turn resends them to clients.

Don't queue Motion events for touch events, the X server should
synthesize them itself.

Signed-off-by: Alexander Volkov <a.volkov@rusbitech.ru>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2017-01-03 11:28:17 +10:00
David Strobach
425ed6017a Middle emulation - make the emulated button number configurable
Sometimes it may be desirable to remap physical middle button
to something else and use emulation instead. The emulation is
however hardcoded to emulate physical button 2, so the emulated
button gets remapped together with the physical one. This patch
adds the Emulate3Button configuration option to allow for user
selection of the emulated button number and a configuration
like this:

Section "InputClass"
    Identifier "Middle button emulation config"
    MatchProduct ".... some device ..."
    MatchDriver "evdev"
    Option "Emulate3Buttons" "on"
    Option "Emulate3Button" "9"
EndSection

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-11-21 15:26:58 +10:00
Peter Hutterer
7251e42dfb Fix off-by-one error counting axes
We stopped counting one too early, but still initialized that axis later,
leading to a bug macro to trigger.

https://bugs.freedesktop.org/show_bug.cgi?id=97956

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2016-10-24 08:27:24 +10:00
Peter Hutterer
551db5b86e evdev 2.10.4
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-10-01 17:49:10 +10:00
Keith Packard
bb8bde7456 Support XINPUT ABI 24 (remove select mask from block/wakeup handlers)
The evdev driver wasn't using the select mask arguments, so this
change just involves adjusting the argument lists.

Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-09-06 13:51:21 +10:00
Keith Packard
7b1267f7f1 Support XINPUT ABI version 23 (threaded input)
Use input_lock/input_unlock calls instead of SIGIO functions

Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-06-02 09:42:05 +10:00
Keith Packard
e08b033276 Report errors when attempting to write keyboard controls
This is mostly to eliminate a compiler warning.

Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-06-02 09:41:25 +10:00
Peter Hutterer
7c1971d9e7 evdev 2.10.3
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-06-01 11:41:03 +10:00
Peter Hutterer
9a6952dafe Restore non-xy axes updates
This broke in d24431a186 Restore wheel emulation for absolute devices,
last hunk when the valuator update was moved to before any early exit
condition. But that new update only applies to valuator maps < 2, i.e. x/y
only. Other valuators are now ignored and remain on 0 forever.

Restore the valuator update.

https://bugs.freedesktop.org/show_bug.cgi?id=95315

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-05-12 15:29:55 +10:00
Peter Hutterer
f12eca9f83 evdev 2.10.2
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-04-29 09:13:35 +10:00
Peter Hutterer
33dc3d7128 Prevent buffer overrun accessing btn_labels
We go up to BTN_JOYSTICK, hence group can have a value of up to including 15.
The actual btn_labels only has 6 elements though.

Found by coverity.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-04-27 09:11:03 +10:00
Peter Hutterer
7b0a65d989 Don't reset the other axis on wheel emulation scroll buildup
The idea was that of a direction lock: as we move vertically we should not
build up any horizontal scroll motion even if we move slightly diagonally.

The effect was though that the axis would be reset completely as soon as an
event from the other axis occured. With the default threshold of 10, if one in
ten events was a REL_X, we'd never get a wheel event.

Drop this code, it's not needed. By default wheel emulation doesn't do
horizontal scrolling, if a config snippet sets XAxisMapping the user wants
horizontal scrolling. And since we just add the value anyway, as long as the
user does a roughly vertical motion we won't get over the threshold anyway.

https://bugs.freedesktop.org/show_bug.cgi?id=93617

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-01-20 10:48:36 +10:00
Peter Hutterer
d24431a186 Restore wheel emulation for absolute devices
Wheel emulation relies on oldVals, which stopped updating in 3dcf6f123c.

Since wheel emulation may filter the abs event, store the event before we do
anything with it. If we really want the abs_event, abs_queued will be set to
1, otherwise the value will be ignored.

And now that we know abs_value is always valied, we can copy its value into
old_vals, so that wheel emulation can calculate the delta correctly.

https://bugs.freedesktop.org/show_bug.cgi?id=93617

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-01-20 10:48:35 +10:00
Peter Hutterer
ce7d8fdebc man: add a warning that wheel emu inertia must be set and it isn't inertia
First, it's not actually inertia, it's simply the scroll distance, yay for the
misnomer.

And it needs to be set for any device that is more fine-grained than a
mouse, especially absolute devices. For example the VirtualBox device has an
abs max of 32767, so a simple motion may have a delta of to 2000 units and
that results in 200 scroll events. That's a bit excessive.

Related to: https://bugs.freedesktop.org/show_bug.cgi?id=93617

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2016-01-14 11:53:56 +10:00
14 changed files with 506 additions and 212 deletions

106
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,106 @@
# vim: set expandtab shiftwidth=2 tabstop=8 textwidth=0 filetype=yaml:
#
# This CI uses the freedesktop.org ci-templates.
# Please see the ci-templates documentation for details:
# https://freedesktop.pages.freedesktop.org/ci-templates/
.templates_sha: &template_sha 25e8e9f020880aa35fffe3d6b259b933f0f9449f # see https://docs.gitlab.com/ee/ci/yaml/#includefile
include:
# Arch container builder template
- project: 'freedesktop/ci-templates'
ref: *template_sha
file: '/templates/arch.yml'
- project: 'freedesktop/ci-templates'
ref: *template_sha
file: '/templates/ci-fairy.yml'
- template: Security/SAST.gitlab-ci.yml
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_COMMIT_BRANCH
stages:
- prep # prep work like rebuilding the container images if there is a change
- build # for actually building and testing things in a container
- test
- deploy
variables:
FDO_UPSTREAM_REPO: 'xorg/driver/xf86-input-evdev'
# The tag should be updated each time the list of packages is updated.
# Changing a tag forces the associated image to be rebuilt.
# Note: the tag has no meaning, we use a date format purely for readability
FDO_DISTRIBUTION_TAG: '2023-10-01.0'
FDO_DISTRIBUTION_PACKAGES: 'git gcc pkgconf autoconf automake libtool make xorg-util-macros xorgproto xorg-server-devel pixman systemd-libs libevdev mtdev'
#
# Verify that commit messages are as expected
#
check-commits:
extends:
- .fdo.ci-fairy
stage: prep
script:
- ci-fairy check-commits --junit-xml=results.xml
except:
- master@xorg/driver/xf86-input-evdev
variables:
GIT_DEPTH: 100
artifacts:
reports:
junit: results.xml
#
# Verify that the merge request has the allow-collaboration checkbox ticked
#
check-merge-request:
extends:
- .fdo.ci-fairy
stage: deploy
script:
- ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml
artifacts:
when: on_failure
reports:
junit: results.xml
allow_failure: true
#
# Build a container with the given tag and the packages pre-installed.
# This only happens if the tag changes, otherwise the existing image is
# re-used.
#
container-prep:
extends:
- .fdo.container-build@arch
stage: prep
variables:
GIT_STRATEGY: none
#
# The default build, runs on the image built above.
#
build:
stage: build
extends:
- .fdo.distribution-image@arch
script:
- autoreconf -ivf
- mkdir _builddir
- pushd _builddir > /dev/null
- ../configure --disable-silent-rules
- make
- make check
- make distcheck
- popd > /dev/null

View File

@@ -39,3 +39,5 @@ ChangeLog:
$(CHANGELOG_CMD) $(CHANGELOG_CMD)
dist-hook: ChangeLog INSTALL dist-hook: ChangeLog INSTALL
EXTRA_DIST = README.md

20
README
View File

@@ -1,20 +0,0 @@
xf86-input-evdev - Generic Linux input driver for the Xorg X server
Please submit bugs & patches to the Xorg bugzilla:
https://bugs.freedesktop.org/enter_bug.cgi?product=xorg
All questions regarding this software should be directed at the
Xorg mailing list:
http://lists.freedesktop.org/mailman/listinfo/xorg
The master development code repository can be found at:
git://anongit.freedesktop.org/git/xorg/driver/xf86-input-evdev
http://cgit.freedesktop.org/xorg/driver/xf86-input-evdev
For more information on the git code manager, see:
http://wiki.x.org/wiki/GitPage

18
README.md Normal file
View File

@@ -0,0 +1,18 @@
xf86-input-evdev - Generic Linux input driver for the Xorg X server
-------------------------------------------------------------------
All questions regarding this software should be directed at the
Xorg mailing list:
https://lists.x.org/mailman/listinfo/xorg
The primary development code repository can be found at:
https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev
Please submit bug reports and requests to merge patches there.
For patch submission instructions, see:
https://www.x.org/wiki/Development/Documentation/SubmittingPatches

View File

@@ -1,14 +1,17 @@
#! /bin/sh #! /bin/sh
srcdir=`dirname $0` srcdir=`dirname "$0"`
test -z "$srcdir" && srcdir=. test -z "$srcdir" && srcdir=.
ORIGDIR=`pwd` ORIGDIR=`pwd`
cd $srcdir cd "$srcdir"
autoreconf -v --install || exit 1 autoreconf -v --install || exit 1
cd $ORIGDIR || exit $? cd "$ORIGDIR" || exit $?
git config --local --get format.subjectPrefix >/dev/null 2>&1 ||
git config --local format.subjectPrefix "PATCH xf86-input-evdev"
if test -z "$NOCONFIGURE"; then if test -z "$NOCONFIGURE"; then
$srcdir/configure "$@" exec "$srcdir"/configure "$@"
fi fi

View File

@@ -23,15 +23,15 @@
# Initialize Autoconf # Initialize Autoconf
AC_PREREQ([2.60]) AC_PREREQ([2.60])
AC_INIT([xf86-input-evdev], AC_INIT([xf86-input-evdev],
[2.10.1], [2.11.0],
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev/issues],
[xf86-input-evdev]) [xf86-input-evdev])
AC_CONFIG_SRCDIR([Makefile.am]) AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_AUX_DIR(.) AC_CONFIG_AUX_DIR(.)
# Initialize Automake # Initialize Automake
AM_INIT_AUTOMAKE([foreign dist-bzip2]) AM_INIT_AUTOMAKE([foreign dist-xz])
# Initialize libtool # Initialize libtool
AC_DISABLE_STATIC AC_DISABLE_STATIC
@@ -44,8 +44,8 @@ XORG_MACROS_VERSION(1.8)
XORG_DEFAULT_OPTIONS XORG_DEFAULT_OPTIONS
# Obtain compiler/linker options from server and required extensions # Obtain compiler/linker options from server and required extensions
PKG_CHECK_MODULES(XORG, [xorg-server >= 1.12] xproto [inputproto >= 2.1.99.3]) PKG_CHECK_MODULES(XORG, [xorg-server >= 1.18] xproto [inputproto >= 2.1.99.3])
PKG_CHECK_MODULES(UDEV, libudev) PKG_CHECK_MODULES(UDEV, libudev, [AC_DEFINE(HAVE_LIBUDEV, 1,[libudev support])])
PKG_CHECK_MODULES(LIBEVDEV, [libevdev >= 0.4]) PKG_CHECK_MODULES(LIBEVDEV, [libevdev >= 0.4])
PKG_CHECK_MODULES(MTDEV, mtdev) PKG_CHECK_MODULES(MTDEV, mtdev)

View File

@@ -33,6 +33,8 @@
#define EVDEV_PROP_MIDBUTTON "Evdev Middle Button Emulation" #define EVDEV_PROP_MIDBUTTON "Evdev Middle Button Emulation"
/* CARD32 */ /* CARD32 */
#define EVDEV_PROP_MIDBUTTON_TIMEOUT "Evdev Middle Button Timeout" #define EVDEV_PROP_MIDBUTTON_TIMEOUT "Evdev Middle Button Timeout"
/* CARD8 */
#define EVDEV_PROP_MIDBUTTON_BUTTON "Evdev Middle Button Button"
/* Wheel emulation */ /* Wheel emulation */
/* BOOL */ /* BOOL */

View File

@@ -1,8 +1,8 @@
.\" shorthand for double quote that works everywhere. .\" shorthand for double quote that works everywhere.
.ds q \N'34' .ds q \N'34'
.TH EVDEV __drivermansuffix__ __vendorversion__ .TH EVDEV __drivermansuffix__ 2016-11-17 __vendorversion__
.SH NAME .SH NAME
evdev \- Generic Linux input driver evdev \- Generic Linux input driver for Xorg
.SH SYNOPSIS .SH SYNOPSIS
.nf .nf
.B "Section \*qInputDevice\*q" .B "Section \*qInputDevice\*q"
@@ -16,98 +16,118 @@ evdev \- Generic Linux input driver
.B EndSection .B EndSection
.fi .fi
.SH DESCRIPTION .SH DESCRIPTION
.B evdev .B evdev
is an __xservername__ input driver for Linux\'s generic event devices. It is an Xorg input driver for Linux\'s generic event devices.
therefore supports all input devices that the kernel knows about, including It therefore supports all input devices that the kernel knows about,
most mice, keyboards, tablets and touchscreens. including most mice, keyboards, tablets, and touchscreens.
.B evdev .B evdev
is the default driver on the major Linux distributions. is the default driver on the major Linux distributions.
.PP .PP
The The
.B evdev .B evdev
driver can serve as both a pointer and a keyboard input device. Multiple driver can serve as both a pointer and a keyboard input device.
input devices are supported by multiple instances of this driver, with one Multiple input devices are supported by multiple instances of this driver,
InputDevice section of your __xconfigfile__ for each input device that will with one InputDevice section of your xorg.conf for each input device
use this driver. that will use this driver.
.PP .PP
It is recommended that It is recommended that
.B evdev .B evdev
devices are configured through the devices are configured through the
.B InputClass .B InputClass
directive (refer to __xconfigfile__(__filemansuffix__)) instead of manual directive (refer to
per-device configuration. Devices configured in the .BR xorg.conf (__filemansuffix__))
__xconfigfile__(__filemansuffix__) are not hot-plug capable. instead of manual per-device configuration.
.PP Devices configured in the
.BR xorg.conf (__filemansuffix__)
are not hot-plug capable.
.SH SUPPORTED HARDWARE .SH SUPPORTED HARDWARE
In general, any input device that the kernel has a driver for can be accessed In general, any input device that the kernel has a driver for can be accessed
through the through the
.B evdev .B evdev
driver. See the Linux kernel documentation for a complete list. driver.
.PP See the Linux kernel documentation for a complete list.
.SH CONFIGURATION DETAILS .SH CONFIGURATION DETAILS
Please refer to __xconfigfile__(__filemansuffix__) for general configuration Please refer to
details and for options that can be used with all input drivers. This .BR xorg.conf (__filemansuffix__)
section only covers configuration details specific to this driver. for general configuration details and
for options that can be used with all input drivers.
This section only covers configuration details specific to this driver.
.PP .PP
The following driver The following driver
.B Options .B Options
are supported: are supported:
.TP 7 .TP 7
.BI "Option \*qButtonMapping\*q \*q" string \*q .BI "Option \*qButtonMapping\*q \*q" string \*q
Sets the button mapping for this device. The mapping is a space-separated list Sets the button mapping for this device.
of button mappings that correspond in order to the physical buttons on the The mapping is a space-separated list of button mappings
device (i.e. the first number is the mapping for button 1, etc.). The default that correspond in order to the physical buttons on the device
mapping is "1 2 3 ... 32". A mapping of 0 deactivates the button. Multiple (i.e. the first number is the mapping for button 1, etc.).
buttons can have the same mapping. The default mapping is "1 2 3 ... 32".
A mapping of 0 deactivates the button.
Multiple buttons can have the same mapping.
For example, a left-handed mouse with deactivated scroll-wheel would use a For example, a left-handed mouse with deactivated scroll-wheel would use a
mapping of "3 2 1 0 0". Invalid mappings are ignored and the default mapping mapping of "3 2 1 0 0".
is used. Buttons not specified in the user's mapping use the default mapping. Invalid mappings are ignored and the default mapping is used.
Buttons not specified in the user's mapping use the default mapping.
.TP 7 .TP 7
.BI "Option \*qDevice\*q \*q" string \*q .BI "Option \*qDevice\*q \*q" string \*q
Specifies the device through which the device can be accessed. This will Specifies the device through which the device can be accessed.
generally be of the form \*q/dev/input/eventX\*q, where X is some integer. This will generally be of the form \*q/dev/input/eventX\*q,
The mapping from device node to hardware is system-dependent. Property: where X is some integer.
"Device Node" (read-only). The mapping from device node to hardware is system-dependent.
Property: "Device Node" (read-only).
.TP 7 .TP 7
.BI "Option \*qDragLockButtons\*q \*q" "L1 B2 L3 B4" \*q .BI "Option \*qDragLockButtons\*q \*q" "L1 B2 L3 B4" \*q
Sets \*qdrag lock buttons\*q that simulate holding a button down, so Sets \*qdrag lock buttons\*q that simulate holding a button down, so
that low dexterity people do not have to hold a button down at the that low dexterity people do not have to hold a button down at the
same time they move a mouse cursor. Button numbers occur in pairs, same time they move a mouse cursor.
with the lock button number occurring first, followed by the button Button numbers occur in pairs,
number that is the target of the lock button. Property: "Evdev with the lock button number occurring first,
followed by the button number that is the target of the lock button.
Property: "Evdev
Drag Lock Buttons". Drag Lock Buttons".
.TP 7 .TP 7
.BI "Option \*qDragLockButtons\*q \*q" "M1" \*q .BI "Option \*qDragLockButtons\*q \*q" "M1" \*q
Sets a \*qmaster drag lock button\*q that acts as a \*qMeta Key\*q Sets a \*qmaster drag lock button\*q that acts as a \*qMeta Key\*q
indicating that the next button pressed is to be indicating that the next button pressed is to be \*qdrag locked\*q.
\*qdrag locked\*q. Property: "Evdev Drag Lock Buttons". Property: "Evdev Drag Lock Buttons".
.TP 7
.TP 7 .TP 7
.BI "Option \*qEmulate3Buttons\*q \*q" boolean \*q .BI "Option \*qEmulate3Buttons\*q \*q" boolean \*q
Enable/disable the emulation of the third (middle) mouse button for mice Enable/disable the emulation of the third (middle) mouse button for mice
which only have two physical buttons. The third button is emulated by which only have two physical buttons.
pressing both buttons simultaneously. Default: off. Property: "Evdev Middle The third button is emulated by pressing both buttons simultaneously.
Button Emulation". Default: off.
Property: "Evdev Middle Button Emulation".
.TP 7 .TP 7
.BI "Option \*qEmulate3Timeout\*q \*q" integer \*q .BI "Option \*qEmulate3Timeout\*q \*q" integer \*q
Sets the timeout (in milliseconds) that the driver waits before deciding Sets the timeout (in milliseconds) that the driver waits before deciding
if two buttons where pressed "simultaneously" when 3 button emulation is if two buttons were pressed "simultaneously" when 3 button emulation is enabled.
enabled. Default: 50. Property: "Evdev Middle Button Timeout". Default: 50.
Property: "Evdev Middle Button Timeout".
.TP 7
.BI "Option \*qEmulate3Button\*q \*q" integer \*q
Specifies the physical button number to be emitted if middle button emulation
is triggered.
Default: 2.
Property: "Evdev Middle Button Button".
.TP 7 .TP 7
.BI "Option \*qEmulateWheel\*q \*q" boolean \*q .BI "Option \*qEmulateWheel\*q \*q" boolean \*q
Enable/disable "wheel" emulation. Wheel emulation means emulating button Enable/disable "wheel" emulation.
press/release events when the mouse is moved while a specific real button Wheel emulation means emulating button press/release events
is pressed. Wheel button events (typically buttons 4 and 5) are when the mouse is moved while a specific real button is pressed.
usually used for scrolling. Wheel emulation is useful for getting wheel-like Wheel button events (typically buttons 4 and 5) are usually used for scrolling.
behaviour with trackballs. It can also be useful for mice with 4 or Wheel emulation is useful for getting wheel-like behaviour with trackballs.
more buttons but no wheel. See the description of the It can also be useful for mice with 4 or more buttons but no wheel.
See the description of the
.BR EmulateWheelButton , .BR EmulateWheelButton ,
.BR EmulateWheelInertia , .BR EmulateWheelInertia ,
.BR EmulateWheelTimeout , .BR EmulateWheelTimeout ,
.BR XAxisMapping , .BR XAxisMapping ,
and and
.B YAxisMapping .B YAxisMapping
options. Default: off. Property "Evdev Wheel Emulation". options.
Default: off.
Property: "Evdev Wheel Emulation".
.TP 7 .TP 7
.BI "Option \*qEmulateWheelButton\*q \*q" integer \*q .BI "Option \*qEmulateWheelButton\*q \*q" integer \*q
Specifies which button must be held down to enable wheel emulation mode. Specifies which button must be held down to enable wheel emulation mode.
@@ -116,84 +136,119 @@ press/release events as specified for the
.B XAxisMapping .B XAxisMapping
and and
.B YAxisMapping .B YAxisMapping
settings. If the button is 0 and settings.
.BR EmulateWheel If the button is 0 and
is on, any motion of the device is converted into wheel events. Default: 4. .B EmulateWheel
is on, any motion of the device is converted into wheel events.
Default: 4.
Property: "Evdev Wheel Emulation Button". Property: "Evdev Wheel Emulation Button".
.TP 7 .TP 7
.BI "Option \*qEmulateWheelInertia\*q \*q" integer \*q .BI "Option \*qEmulateWheelInertia\*q \*q" integer \*q
Specifies how far (in pixels) the pointer must move to generate button Specifies how far (in pixels) the pointer must move to generate button
press/release events in wheel emulation mode. Default: 10. Property: "Evdev press/release events in wheel emulation mode.
Wheel Emulation Inertia". Default: 10.
Property: "Evdev Wheel Emulation Inertia".
.IP
This value must be set for any device does not resemble a standard mouse.
Specifically, on absolute devices such as tablets the value should be set to
a reasonable fraction of the expected movement to avoid excess scroll events.
.IP
.B WARNING:
the name \*qinertia\*q is a misnomer.
This option defines the distance required to generate one scroll event
similar to the
.B VertScrollDelta
and
.B HorizScrollDelta
options.
It does not enable inertia in the physical sense,
scrolling stops immediately once the movement has stopped.
.TP 7 .TP 7
.BI "Option \*qEmulateWheelTimeout\*q \*q" integer \*q .BI "Option \*qEmulateWheelTimeout\*q \*q" integer \*q
Specifies the time in milliseconds the Specifies the time in milliseconds the
.BR EmulateWheelButton .B EmulateWheelButton
must be pressed before wheel emulation is started. If the must be pressed before wheel emulation is started.
.BR EmulateWheelButton If the
is released before this timeout, the original button press/release event .B EmulateWheelButton
is sent. Default: 200. Property: "Evdev Wheel Emulation Timeout". is released before this timeout,
the original button press/release event is sent.
Default: 200.
Property: "Evdev Wheel Emulation Timeout".
.TP 7 .TP 7
.BI "Option \*qEmulateThirdButton\*q \*q" boolean \*q .BI "Option \*qEmulateThirdButton\*q \*q" boolean \*q
Enable third button emulation. Third button emulation emits a right button Enable third button emulation.
event (by default) by pressing and holding the first button. The first Third button emulation emits a right button event (by default)
button must be held down for the configured timeout and must not move more by pressing and holding the first button.
than the configured threshold for the emulation to activate. Otherwise, the The first button must be held down for the configured timeout and
first button event is posted as normal. Default: off. Property: "Evdev must not move more than the configured threshold for the emulation to activate.
Third Button Emulation". Otherwise, the first button event is posted as normal.
Default: off.
Property: "Evdev Third Button Emulation".
.TP 7 .TP 7
.BI "Option \*qEmulateThirdButtonTimeout\*q \*q" integer \*q .BI "Option \*qEmulateThirdButtonTimeout\*q \*q" integer \*q
Specifies the timeout in milliseconds between the initial button press and Specifies the timeout in milliseconds between the initial button press and
the generation of the emulated button event. the generation of the emulated button event.
Default: 1000. Property: "Evdev Third Button Emulation Timeout". Default: 1000.
Property: "Evdev Third Button Emulation Timeout".
.TP 7 .TP 7
.BI "Option \*qEmulateThirdButtonButton\*q \*q" integer \*q .BI "Option \*qEmulateThirdButtonButton\*q \*q" integer \*q
Specifies the physical button number to be emitted if third button emulation Specifies the physical button number to be emitted if third button emulation
is triggered. is triggered.
Default: 3. Property: "Evdev Third Button Button". Default: 3.
Property: "Evdev Third Button Button".
.TP 7 .TP 7
.BI "Option \*qEmulateThirdButtonMoveThreshold\*q \*q" integer \*q .BI "Option \*qEmulateThirdButtonMoveThreshold\*q \*q" integer \*q
Specifies the maximum move fuzz in device coordinates for third button Specifies the maximum move fuzz in device coordinates for third button
emulation. If the device moves by more than this threshold before the third emulation.
If the device moves by more than this threshold before the third
button emulation is triggered, the emulation is cancelled and a first button button emulation is triggered, the emulation is cancelled and a first button
event is generated as normal. event is generated as normal.
Default: 20. Property: "Evdev Third Button Emulation Threshold". Default: 20.
Property: "Evdev Third Button Emulation Threshold".
.TP 7 .TP 7
.BI "Option \*qGrabDevice\*q \*q" boolean \*q .BI "Option \*qGrabDevice\*q \*q" boolean \*q
Force a grab on the event device. Doing so will ensure that no other driver Force a grab on the event device.
Doing so will ensure that no other driver
can initialise the same device and it will also stop the device from sending can initialise the same device and it will also stop the device from sending
events to /dev/kbd or /dev/input/mice. Events from this device will not be events to /dev/kbd or /dev/input/mice.
sent to virtual devices (e.g. rfkill or the Macintosh mouse button emulation). Events from this device will not be sent to virtual devices
(e.g. rfkill or the Macintosh mouse button emulation).
Default: disabled. Default: disabled.
.TP 7 .TP 7
.BI "Option \*qInvertX\*q \*q" Bool \*q .BI "Option \*qInvertX\*q \*q" Bool \*q
.TP 7 .TP 7
.BI "Option \*qInvertY\*q \*q" Bool \*q .BI "Option \*qInvertY\*q \*q" Bool \*q
Invert the given axis. Default: off. Property: "Evdev Axis Inversion". Invert the given axis.
Default: off.
Property: "Evdev Axis Inversion".
.TP 7 .TP 7
.BI "Option \*qIgnoreRelativeAxes\*q \*q" Bool \*q .BI "Option \*qIgnoreRelativeAxes\*q \*q" Bool \*q
.TP 7 .TP 7
.BI "Option \*qIgnoreAbsoluteAxes\*q \*q" Bool \*q .BI "Option \*qIgnoreAbsoluteAxes\*q \*q" Bool \*q
Ignore the specified type of axis. Default: unset. The X server cannot deal Ignore the specified type of axis.
with devices that have both relative and absolute axes. Evdev tries to guess Default: unset.
wich axes to ignore given the device type and disables absolute axes for The X server cannot deal with devices that have both relative and absolute axes.
mice and relative axes for tablets, touchscreens and touchpad. These options Evdev tries to guess which axes to ignore given the device type and
allow to forcibly disable an axis type. Mouse wheel axes are exempt and will disables absolute axes for mice and relative axes for tablets, touchscreens,
work even if relative axes are ignored. No property, this configuration must and touchpad.
be set in the configuration. These options allow to forcibly disable an axis type.
Mouse wheel axes are exempt and will work even if relative axes are ignored.
No property, this configuration must be set in the configuration.
.br .br
If either option is set to False, the driver will not ignore the specified If either option is set to False, the driver will not ignore the specified
axes regardless of the presence of other axes. This may trigger buggy axes regardless of the presence of other axes.
behavior and events from this axis are always forwarded. Users are This may trigger buggy behavior and events from this axis are always forwarded.
discouraged from setting this option. Users are discouraged from setting this option.
.TP 7 .TP 7
.BI "Option \*qCalibration\*q \*q" "min-x max-x min-y max-y" \*q .BI "Option \*qCalibration\*q \*q" "min-x max-x min-y max-y" \*q
Calibrates the X and Y axes for devices that need to scale to a different Calibrates the X and Y axes for devices that need to scale to a different
coordinate system than reported to the X server. This feature is required coordinate system than reported to the X server.
for devices that need to scale to a different coordinate system than This feature is required for devices that need to scale to
originally reported by the kernel (e.g. touchscreens). The scaling to the a different coordinate system than originally reported by the kernel
custom coordinate system is done in-driver and the X server is unaware of (e.g. touchscreens).
the transformation. Property: "Evdev Axis Calibration". The scaling to the custom coordinate system is done in-driver and
the X server is unaware of the transformation.
Property: "Evdev Axis Calibration".
.TP 7 .TP 7
.B Option \*qMode\*q \*qRelative\*q\fP|\fP\*qAbsolute\*q .B Option \*qMode\*q \*qRelative\*q\fP|\fP\*qAbsolute\*q
Sets the mode of the device if device has absolute axes. Sets the mode of the device if device has absolute axes.
@@ -201,94 +256,114 @@ The default value for touchpads is relative, for other absolute.
This option has no effect on devices without absolute axes. This option has no effect on devices without absolute axes.
.TP 7 .TP 7
.BI "Option \*qSwapAxes\*q \*q" Bool \*q .BI "Option \*qSwapAxes\*q \*q" Bool \*q
Swap x/y axes. Default: off. Property: "Evdev Axes Swap". Swap x/y axes.
Default: off.
Property: "Evdev Axes Swap".
.TP 7 .TP 7
.BI "Option \*qXAxisMapping\*q \*q" "N1 N2" \*q .BI "Option \*qXAxisMapping\*q \*q" "N1 N2" \*q
Specifies which buttons are mapped to motion in the X direction in wheel Specifies which buttons are mapped to motion in the X direction in wheel
emulation mode. Button number emulation mode.
Button number
.I N1 .I N1
is mapped to the negative X axis motion and button number is mapped to the negative X axis motion and button number
.I N2 .I N2
is mapped to the positive X axis motion. Default: no mapping. Property: is mapped to the positive X axis motion.
"Evdev Wheel Emulation Axes". Default: no mapping.
Property: "Evdev Wheel Emulation Axes".
.TP 7 .TP 7
.BI "Option \*qYAxisMapping\*q \*q" "N1 N2" \*q .BI "Option \*qYAxisMapping\*q \*q" "N1 N2" \*q
Specifies which buttons are mapped to motion in the Y direction in wheel Specifies which buttons are mapped to motion in the Y direction in wheel
emulation mode. Button number emulation mode.
Button number
.I N1 .I N1
is mapped to the negative Y axis motion and button number is mapped to the negative Y axis motion and button number
.I N2 .I N2
is mapped to the positive Y axis motion. Default: "4 5". Property: is mapped to the positive Y axis motion.
"Evdev Wheel Emulation Axes". Default: "4 5".
Property: "Evdev Wheel Emulation Axes".
.TP 7 .TP 7
.BI "Option \*qTypeName\*q \*q"type"\*q .BI "Option \*qTypeName\*q" \*q"type"\*q
Specify the X Input 1.x type (see XListInputDevices(__libmansuffix__)). Specify the X Input 1.x type (see
.BR XListInputDevices (__libmansuffix__)).
There is rarely a need to use this option, evdev will guess the device type There is rarely a need to use this option, evdev will guess the device type
based on the device's capabilities. This option is provided for devices that based on the device's capabilities.
need quirks. This option is provided for devices that need quirks.
.TP 7 .TP 7
.BI "Option \*qVertScrollDelta\*q \*q" integer \*q .BI "Option \*qVertScrollDelta\*q \*q" integer \*q
The amount of motion considered one unit of scrolling vertically. The amount of motion considered one unit of scrolling vertically.
Default: "1". Property: "Evdev Scrolling Distance". Default: "1".
Property: "Evdev Scrolling Distance".
.TP 7 .TP 7
.BI "Option \*qHorizScrollDelta\*q \*q" integer \*q .BI "Option \*qHorizScrollDelta\*q \*q" integer \*q
The amount of motion considered one unit of scrolling horizontally. The amount of motion considered one unit of scrolling horizontally.
Default: "1". Property: "Evdev Scrolling Distance". Default: "1".
Property: "Evdev Scrolling Distance".
.TP 7 .TP 7
.BI "Option \*qDialDelta\*q \*q" integer \*q .BI "Option \*qDialDelta\*q \*q" integer \*q
The amount of motion considered one unit of turning the dial. Default: "1". The amount of motion considered one unit of turning the dial.
Default: "1".
Property: "Evdev Scrolling Distance". Property: "Evdev Scrolling Distance".
.TP 7 .TP 7
.BI "Option \*qResolution\*q \*q" integer \*q .BI "Option \*qResolution\*q \*q" integer \*q
Sets the resolution of the device in dots per inch. The resolution is used Sets the resolution of the device in dots per inch.
to scale relative motion events from mouse devices to 1000 DPI resolution. This The resolution is used to scale relative motion events from mouse devices to
can be used to make high resolution mice less sensitive without turning off 1000 DPI resolution.
acceleration. If set to 0 no scaling will be performed. Default: "0". 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 .SH SUPPORTED PROPERTIES
The following properties are provided by the The following properties are provided by the
.B evdev .B evdev
driver. driver.
.TP 7 .TP 7
.BI "Evdev Axis Calibration" .B "Evdev Axis Calibration"
4 32-bit values, order min-x, max-x, min-y, max-y or 0 values to disable 4 32-bit values, order min-x, max-x, min-y, max-y or 0 values to disable
in-driver axis calibration. in-driver axis calibration.
.TP 7 .TP 7
.BI "Evdev Axis Inversion" .B "Evdev Axis Inversion"
2 boolean values (8 bit, 0 or 1), order X, Y. 1 inverts the axis. 2 boolean values (8 bit, 0 or 1), order X, Y.
1 inverts the axis.
.TP 7 .TP 7
.BI "Evdev Axes Swap" .B "Evdev Axes Swap"
1 boolean value (8 bit, 0 or 1). 1 swaps x/y axes. 1 boolean value (8 bit, 0 or 1).
1 swaps x/y axes.
.TP 7 .TP 7
.BI "Evdev Drag Lock Buttons" .B "Evdev Drag Lock Buttons"
8-bit. Either 1 value or pairs of values. Value range 0-32, 0 disables a 8-bit. Either 1 value or pairs of values.
value. Value range 0-32, 0 disables a value.
.TP 7 .TP 7
.BI "Evdev Middle Button Emulation" .B "Evdev Middle Button Emulation"
1 boolean value (8 bit, 0 or 1). 1 boolean value (8 bit, 0 or 1).
.TP 7 .TP 7
.BI "Evdev Middle Button Timeout" .B "Evdev Middle Button Timeout"
1 16-bit positive value. 1 16-bit positive value.
.TP 7 .TP 7
.BI "Evdev Wheel Emulation" .B "Evdev Middle Button Button"
1 boolean value (8 bit, 0 or 1).
.TP 7
.BI "Evdev Wheel Emulation Axes"
4 8-bit values, order X up, X down, Y up, Y down. 0 disables a value.
.TP 7
.BI "Evdev Wheel Emulation Button"
1 8-bit value, allowed range 0-32, 0 disables the button. 1 8-bit value, allowed range 0-32, 0 disables the button.
.TP 7 .TP 7
.BI "Evdev Wheel Emulation Inertia" .B "Evdev Wheel Emulation"
1 boolean value (8 bit, 0 or 1).
.TP 7
.B "Evdev Wheel Emulation Axes"
4 8-bit values, order X up, X down, Y up, Y down.
0 disables a value.
.TP 7
.B "Evdev Wheel Emulation Button"
1 8-bit value, allowed range 0-32, 0 disables the button.
.TP 7
.B "Evdev Wheel Emulation Inertia"
1 16-bit positive value. 1 16-bit positive value.
.TP 7 .TP 7
.BI "Evdev Wheel Emulation Timeout" .B "Evdev Wheel Emulation Timeout"
1 16-bit positive value. 1 16-bit positive value.
.TP 7 .TP 7
.BI "Evdev Scrolling Distance" .B "Evdev Scrolling Distance"
3 32-bit values: vertical, horizontal and dial. 3 32-bit values: vertical, horizontal and dial.
.SH AUTHORS .SH AUTHORS
Kristian Høgsberg, Peter Hutterer Kristian Høgsberg, Peter Hutterer
.SH "SEE ALSO" .SH "SEE ALSO"
__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__) .BR Xorg (__appmansuffix__),
.BR xorg.conf (__filemansuffix__),
.BR Xserver (__appmansuffix__),
.BR X (__miscmansuffix__)

View File

@@ -5,7 +5,7 @@
* Copyright 1994-2002 by The XFree86 Project, Inc. * Copyright 1994-2002 by The XFree86 Project, Inc.
* Copyright 2002 by Paul Elliott * Copyright 2002 by Paul Elliott
* (Ported from xf86-input-mouse, above copyrights taken from there) * (Ported from xf86-input-mouse, above copyrights taken from there)
* Copyright © 2008 University of South Australia * Copyright © 2008 University of South Australia
* Copyright 2008 by Chris Salch * Copyright 2008 by Chris Salch
* Copyright 2008 Red Hat, Inc. * Copyright 2008 Red Hat, Inc.
* *

View File

@@ -45,6 +45,7 @@
static Atom prop_mbemu = 0; /* Middle button emulation on/off property */ static Atom prop_mbemu = 0; /* Middle button emulation on/off property */
static Atom prop_mbtimeout = 0; /* Middle button timeout property */ static Atom prop_mbtimeout = 0; /* Middle button timeout property */
static Atom prop_mbbuton = 0; /* Middle button target button property */
/* /*
* Lets create a simple finite-state machine for 3 button emulation: * Lets create a simple finite-state machine for 3 button emulation:
* *
@@ -184,14 +185,21 @@ int
EvdevMBEmuTimer(InputInfoPtr pInfo) EvdevMBEmuTimer(InputInfoPtr pInfo)
{ {
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
int sigstate;
int id; int id;
int mapped_id;
sigstate = xf86BlockSIGIO (); #if HAVE_THREADED_INPUT
input_lock();
#else
int sigstate = xf86BlockSIGIO();
#endif
pEvdev->emulateMB.pending = FALSE; pEvdev->emulateMB.pending = FALSE;
if ((id = stateTab[pEvdev->emulateMB.state][4][0]) != 0) { if ((id = stateTab[pEvdev->emulateMB.state][4][0]) != 0) {
EvdevPostButtonEvent(pInfo, abs(id), mapped_id = abs(id);
if (mapped_id == 2)
mapped_id = pEvdev->emulateMB.button;
EvdevPostButtonEvent(pInfo, mapped_id,
(id >= 0) ? BUTTON_PRESS : BUTTON_RELEASE); (id >= 0) ? BUTTON_PRESS : BUTTON_RELEASE);
pEvdev->emulateMB.state = pEvdev->emulateMB.state =
stateTab[pEvdev->emulateMB.state][4][2]; stateTab[pEvdev->emulateMB.state][4][2];
@@ -200,7 +208,11 @@ EvdevMBEmuTimer(InputInfoPtr pInfo)
pEvdev->emulateMB.state); pEvdev->emulateMB.state);
} }
xf86UnblockSIGIO (sigstate); #if HAVE_THREADED_INPUT
input_unlock();
#else
xf86UnblockSIGIO(sigstate);
#endif
return 0; return 0;
} }
@@ -219,6 +231,7 @@ EvdevMBEmuFilterEvent(InputInfoPtr pInfo, int button, BOOL press)
{ {
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
int id; int id;
int mapped_id;
int *btstate; int *btstate;
int ret = FALSE; int ret = FALSE;
@@ -237,7 +250,10 @@ EvdevMBEmuFilterEvent(InputInfoPtr pInfo, int button, BOOL press)
if ((id = stateTab[pEvdev->emulateMB.state][*btstate][0]) != 0) if ((id = stateTab[pEvdev->emulateMB.state][*btstate][0]) != 0)
{ {
EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0)); mapped_id = abs(id);
if (mapped_id == 2)
mapped_id = pEvdev->emulateMB.button;
EvdevQueueButtonEvent(pInfo, mapped_id, (id >= 0));
ret = TRUE; ret = TRUE;
} }
if ((id = stateTab[pEvdev->emulateMB.state][*btstate][1]) != 0) if ((id = stateTab[pEvdev->emulateMB.state][*btstate][1]) != 0)
@@ -261,9 +277,7 @@ EvdevMBEmuFilterEvent(InputInfoPtr pInfo, int button, BOOL press)
} }
void EvdevMBEmuWakeupHandler(pointer data, void EvdevMBEmuWakeupHandler(WAKEUP_HANDLER_ARGS)
int i,
pointer LastSelectMask)
{ {
InputInfoPtr pInfo = (InputInfoPtr)data; InputInfoPtr pInfo = (InputInfoPtr)data;
EvdevPtr pEvdev = (EvdevPtr)pInfo->private; EvdevPtr pEvdev = (EvdevPtr)pInfo->private;
@@ -277,9 +291,7 @@ void EvdevMBEmuWakeupHandler(pointer data,
} }
} }
void EvdevMBEmuBlockHandler(pointer data, void EvdevMBEmuBlockHandler(BLOCK_HANDLER_ARGS)
struct timeval **waitTime,
pointer LastSelectMask)
{ {
InputInfoPtr pInfo = (InputInfoPtr) data; InputInfoPtr pInfo = (InputInfoPtr) data;
EvdevPtr pEvdev= (EvdevPtr) pInfo->private; EvdevPtr pEvdev= (EvdevPtr) pInfo->private;
@@ -298,12 +310,23 @@ void
EvdevMBEmuPreInit(InputInfoPtr pInfo) EvdevMBEmuPreInit(InputInfoPtr pInfo)
{ {
EvdevPtr pEvdev = (EvdevPtr)pInfo->private; EvdevPtr pEvdev = (EvdevPtr)pInfo->private;
int bt;
pEvdev->emulateMB.enabled = xf86SetBoolOption(pInfo->options, pEvdev->emulateMB.enabled = xf86SetBoolOption(pInfo->options,
"Emulate3Buttons", "Emulate3Buttons",
FALSE); FALSE);
pEvdev->emulateMB.timeout = xf86SetIntOption(pInfo->options, pEvdev->emulateMB.timeout = xf86SetIntOption(pInfo->options,
"Emulate3Timeout", 50); "Emulate3Timeout", 50);
bt = xf86SetIntOption(pInfo->options, "Emulate3Button", 2);
if (bt < 0 || bt > EVDEV_MAXBUTTONS) {
xf86IDrvMsg(pInfo, X_WARNING, "Invalid Emulate3Button value: %d\n",
bt);
xf86IDrvMsg(pInfo, X_WARNING, "Middle button emulation disabled.\n");
pEvdev->emulateMB.enabled = FALSE;
}
pEvdev->emulateMB.button = bt;
} }
void void
@@ -335,6 +358,7 @@ EvdevMBEmuSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
{ {
InputInfoPtr pInfo = dev->public.devicePrivate; InputInfoPtr pInfo = dev->public.devicePrivate;
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
int bt;
if (atom == prop_mbemu) if (atom == prop_mbemu)
{ {
@@ -350,6 +374,18 @@ EvdevMBEmuSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
if (!checkonly) if (!checkonly)
pEvdev->emulateMB.timeout = *((CARD32*)val->data); pEvdev->emulateMB.timeout = *((CARD32*)val->data);
} else if (atom == prop_mbbuton)
{
if (val->format != 8 || val->size != 1 || val->type != XA_INTEGER)
return BadMatch;
bt = *((CARD8*)val->data);
if (bt < 0 || bt > EVDEV_MAXBUTTONS)
return BadValue;
if (!checkonly)
pEvdev->emulateMB.button = bt;
} }
return Success; return Success;
@@ -387,5 +423,15 @@ EvdevMBEmuInitProperty(DeviceIntPtr dev)
return; return;
XISetDevicePropertyDeletable(dev, prop_mbtimeout, FALSE); XISetDevicePropertyDeletable(dev, prop_mbtimeout, FALSE);
prop_mbbuton = MakeAtom(EVDEV_PROP_MIDBUTTON_BUTTON,
strlen(EVDEV_PROP_MIDBUTTON_BUTTON),
TRUE);
rc = XIChangeDeviceProperty(dev, prop_mbbuton, XA_INTEGER, 8, PropModeReplace, 1,
&pEvdev->emulateMB.button, FALSE);
if (rc != Success)
return;
XISetDevicePropertyDeletable(dev, prop_mbbuton, FALSE);
XIRegisterPropertyHandler(dev, EvdevMBEmuSetProperty, NULL, NULL); XIRegisterPropertyHandler(dev, EvdevMBEmuSetProperty, NULL, NULL);
} }

View File

@@ -89,12 +89,19 @@ Evdev3BEmuTimer(OsTimerPtr timer, CARD32 time, pointer arg)
InputInfoPtr pInfo = (InputInfoPtr)arg; InputInfoPtr pInfo = (InputInfoPtr)arg;
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
struct emulate3B *emu3B = &pEvdev->emulate3B; struct emulate3B *emu3B = &pEvdev->emulate3B;
int sigstate = 0;
sigstate = xf86BlockSIGIO (); #if HAVE_THREADED_INPUT
input_lock();
#else
int sigstate = xf86BlockSIGIO();
#endif
emu3B->state = EM3B_EMULATING; emu3B->state = EM3B_EMULATING;
Evdev3BEmuPostButtonEvent(pInfo, emu3B->button, BUTTON_PRESS); Evdev3BEmuPostButtonEvent(pInfo, emu3B->button, BUTTON_PRESS);
xf86UnblockSIGIO (sigstate); #if HAVE_THREADED_INPUT
input_unlock();
#else
xf86UnblockSIGIO(sigstate);
#endif
return 0; return 0;
} }

View File

@@ -50,7 +50,7 @@ static Atom prop_wheel_inertia = 0;
static Atom prop_wheel_timeout = 0; static Atom prop_wheel_timeout = 0;
static Atom prop_wheel_button = 0; static Atom prop_wheel_button = 0;
/* Local Funciton Prototypes */ /* Local Function Prototypes */
static int EvdevWheelEmuInertia(InputInfoPtr pInfo, WheelAxisPtr axis, int value); static int EvdevWheelEmuInertia(InputInfoPtr pInfo, WheelAxisPtr axis, int value);
/* Filter mouse button events */ /* Filter mouse button events */
@@ -95,7 +95,7 @@ BOOL
EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv) EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
{ {
EvdevPtr pEvdev = (EvdevPtr)pInfo->private; EvdevPtr pEvdev = (EvdevPtr)pInfo->private;
WheelAxisPtr pAxis = NULL, pOtherAxis = NULL; WheelAxisPtr pAxis = NULL;
int value = pEv->value; int value = pEv->value;
/* Has wheel emulation been configured to be enabled? */ /* Has wheel emulation been configured to be enabled? */
@@ -130,13 +130,11 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
/* ABS_X has the same value as REL_X, so this case catches both */ /* ABS_X has the same value as REL_X, so this case catches both */
case REL_X: case REL_X:
pAxis = &(pEvdev->emulateWheel.X); pAxis = &(pEvdev->emulateWheel.X);
pOtherAxis = &(pEvdev->emulateWheel.Y);
break; break;
/* ABS_Y has the same value as REL_Y, so this case catches both */ /* ABS_Y has the same value as REL_Y, so this case catches both */
case REL_Y: case REL_Y:
pAxis = &(pEvdev->emulateWheel.Y); pAxis = &(pEvdev->emulateWheel.Y);
pOtherAxis = &(pEvdev->emulateWheel.X);
break; break;
default: default:
@@ -144,15 +142,10 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
} }
/* If we found REL_X, REL_Y, ABS_X or ABS_Y then emulate a mouse /* If we found REL_X, REL_Y, ABS_X or ABS_Y then emulate a mouse
wheel. Reset the inertia of the other axis when a scroll event wheel.
was sent to avoid the buildup of erroneous scroll events if the
user doesn't move in a perfectly straight line.
*/ */
if (pAxis) if (pAxis)
{ EvdevWheelEmuInertia(pInfo, pAxis, value);
if (EvdevWheelEmuInertia(pInfo, pAxis, value))
pOtherAxis->traveled_distance = 0;
}
/* Eat motion events while emulateWheel button pressed. */ /* Eat motion events while emulateWheel button pressed. */
return TRUE; return TRUE;

View File

@@ -38,9 +38,10 @@
#include <X11/keysym.h> #include <X11/keysym.h>
#include <X11/extensions/XI.h> #include <X11/extensions/XI.h>
#include <linux/version.h>
#include <sys/stat.h> #include <sys/stat.h>
#ifdef HAVE_LIBUDEV
#include <libudev.h> #include <libudev.h>
#endif
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
@@ -74,8 +75,8 @@
#define CAPSFLAG 1 #define CAPSFLAG 1
#define NUMFLAG 2 #define NUMFLAG 2
#define SCROLLFLAG 4 #define SCROLLFLAG 4
#define MODEFLAG 8 #define COMPOSEFLAG 8
#define COMPOSEFLAG 16 #define MODEFLAG 16
#ifndef ABS_MT_SLOT #ifndef ABS_MT_SLOT
#define ABS_MT_SLOT 0x2f #define ABS_MT_SLOT 0x2f
@@ -226,6 +227,7 @@ EvdevIsDuplicate(InputInfoPtr pInfo)
static BOOL static BOOL
EvdevDeviceIsVirtual(const char* devicenode) EvdevDeviceIsVirtual(const char* devicenode)
{ {
#ifdef HAVE_LIBUDEV
struct udev *udev = NULL; struct udev *udev = NULL;
struct udev_device *device = NULL; struct udev_device *device = NULL;
struct stat st; struct stat st;
@@ -256,6 +258,9 @@ out:
udev_device_unref(device); udev_device_unref(device);
udev_unref(udev); udev_unref(udev);
return rc; return rc;
#else
return FALSE;
#endif
} }
@@ -277,7 +282,7 @@ EvdevNextInQueue(InputInfoPtr pInfo)
void void
EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value) EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value)
{ {
int code = ev->code + MIN_KEYCODE; int code = ev->code;
EventQueuePtr pQueue; EventQueuePtr pQueue;
/* Filter all repeated events from device. /* Filter all repeated events from device.
@@ -285,10 +290,18 @@ EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value)
if (value == 2) if (value == 2)
return; return;
/* keycodes > 256 that have a historical mapping in xkeyboard-config */
switch (code) {
case KEY_TOUCHPAD_TOGGLE: code = KEY_F21; break;
case KEY_TOUCHPAD_ON: code = KEY_F22; break;
case KEY_TOUCHPAD_OFF: code = KEY_F23; break;
case KEY_MICMUTE: code = KEY_F20; break;
}
if ((pQueue = EvdevNextInQueue(pInfo))) if ((pQueue = EvdevNextInQueue(pInfo)))
{ {
pQueue->type = EV_QUEUE_KEY; pQueue->type = EV_QUEUE_KEY;
pQueue->detail.key = code; pQueue->detail.key = code + MIN_KEYCODE;
pQueue->val = value; pQueue->val = value;
} }
} }
@@ -430,6 +443,14 @@ static void
EvdevProcessValuators(InputInfoPtr pInfo) EvdevProcessValuators(InputInfoPtr pInfo)
{ {
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
int val;
if (pEvdev->abs_vals) {
if (valuator_mask_fetch(pEvdev->abs_vals, 0, &val))
valuator_mask_set(pEvdev->old_vals, 0, val);
if (valuator_mask_fetch(pEvdev->abs_vals, 1, &val))
valuator_mask_set(pEvdev->old_vals, 1, val);
}
/* Apply transformations on relative coordinates */ /* Apply transformations on relative coordinates */
if (pEvdev->rel_queued) { if (pEvdev->rel_queued) {
@@ -543,6 +564,16 @@ EvdevProcessProximityState(InputInfoPtr pInfo)
} }
} }
/* Wacom's last frame resets all values to 0, including x/y.
Skip over this. */
if (prox_state == 0) {
int v;
if (valuator_mask_fetch(pEvdev->abs_vals, 0, &v) && v == 0)
valuator_mask_unset(pEvdev->abs_vals, 0);
if (valuator_mask_fetch(pEvdev->abs_vals, 1, &v) && v == 0)
valuator_mask_unset(pEvdev->abs_vals, 1);
}
if ((prox_state && !pEvdev->in_proximity) || if ((prox_state && !pEvdev->in_proximity) ||
(!prox_state && pEvdev->in_proximity)) (!prox_state && pEvdev->in_proximity))
{ {
@@ -765,12 +796,17 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
if (ev->code > ABS_MAX) if (ev->code > ABS_MAX)
return; return;
/* Always store the current abs valuator, we need it to update old_vals
* which is required by wheel emulation */
map = pEvdev->abs_axis_map[ev->code];
if (map < 2)
valuator_mask_set(pEvdev->abs_vals, map, value);
if (EvdevWheelEmuFilterMotion(pInfo, ev)) if (EvdevWheelEmuFilterMotion(pInfo, ev))
return; return;
if (ev->code >= ABS_MT_SLOT) { if (ev->code >= ABS_MT_SLOT) {
EvdevProcessTouchEvent(pInfo, ev); EvdevProcessTouchEvent(pInfo, ev);
pEvdev->abs_queued = 1;
} else if (!pEvdev->mt_mask) { } else if (!pEvdev->mt_mask) {
map = pEvdev->abs_axis_map[ev->code]; map = pEvdev->abs_axis_map[ev->code];
@@ -781,9 +817,7 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
valuator_mask_set(pEvdev->rel_vals, map, value - oldval); valuator_mask_set(pEvdev->rel_vals, map, value - oldval);
pEvdev->rel_queued = 1; pEvdev->rel_queued = 1;
} }
valuator_mask_set(pEvdev->old_vals, map, value);
} else { } else {
/* the normal case: just store the number. */
valuator_mask_set(pEvdev->abs_vals, map, value); valuator_mask_set(pEvdev->abs_vals, map, value);
pEvdev->abs_queued = 1; pEvdev->abs_queued = 1;
} }
@@ -894,7 +928,7 @@ EvdevPostProximityEvents(InputInfoPtr pInfo, int which)
break; break;
case EV_QUEUE_PROXIMITY: case EV_QUEUE_PROXIMITY:
if (pEvdev->queue[i].val == which) if (pEvdev->queue[i].val == which)
xf86PostProximityEvent(pInfo->dev, which, 0, 0); xf86PostProximityEventM(pInfo->dev, which, pEvdev->old_vals);
break; break;
} }
} }
@@ -1051,11 +1085,13 @@ EvdevReadInput(InputInfoPtr pInfo)
do { do {
rc = libevdev_next_event(pEvdev->dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); rc = libevdev_next_event(pEvdev->dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
if (rc < 0) { if (rc < 0) {
if (rc == -ENODEV) /* May happen after resume */ if (rc != -EAGAIN && rc != -EINTR && rc != -EWOULDBLOCK) {
/* May happen after resume or at device detach */
xf86RemoveEnabledDevice(pInfo); xf86RemoveEnabledDevice(pInfo);
else if (rc != -EAGAIN) EvdevCloseDevice(pInfo);
LogMessageVerbSigSafe(X_ERROR, 0, "%s: Read error: %s\n", pInfo->name, LogMessageVerbSigSafe(X_ERROR, 0, "%s: Read error: %s\n", pInfo->name,
strerror(-rc)); strerror(-rc));
}
break; break;
} else if (rc == LIBEVDEV_READ_STATUS_SUCCESS) { } else if (rc == LIBEVDEV_READ_STATUS_SUCCESS) {
if (pEvdev->mtdev) if (pEvdev->mtdev)
@@ -1089,13 +1125,14 @@ EvdevKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl)
{ CAPSFLAG, LED_CAPSL }, { CAPSFLAG, LED_CAPSL },
{ NUMFLAG, LED_NUML }, { NUMFLAG, LED_NUML },
{ SCROLLFLAG, LED_SCROLLL }, { SCROLLFLAG, LED_SCROLLL },
{ MODEFLAG, LED_KANA }, { COMPOSEFLAG, LED_COMPOSE },
{ COMPOSEFLAG, LED_COMPOSE } { MODEFLAG, LED_KANA }
}; };
InputInfoPtr pInfo; InputInfoPtr pInfo;
struct input_event ev[ArrayLength(bits) + 1]; struct input_event ev[ArrayLength(bits) + 1];
int i; int i;
int rc;
memset(ev, 0, sizeof(ev)); memset(ev, 0, sizeof(ev));
@@ -1110,7 +1147,9 @@ EvdevKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl)
ev[i].code = SYN_REPORT; ev[i].code = SYN_REPORT;
ev[i].value = 0; ev[i].value = 0;
write(pInfo->fd, ev, sizeof ev); rc = write(pInfo->fd, ev, sizeof ev);
if (rc != sizeof ev)
xf86IDrvMsg(pInfo, X_ERROR, "Failed to set keyboard controls: %s\n", strerror(errno));
} }
static int static int
@@ -1223,7 +1262,7 @@ EvdevCountMTAxes(EvdevPtr pEvdev, int *num_mt_axes_total,
return; return;
/* Absolute multitouch axes: adjust mapping and axes counts. */ /* Absolute multitouch axes: adjust mapping and axes counts. */
for (axis = ABS_MT_SLOT; axis < ABS_MAX; axis++) for (axis = ABS_MT_SLOT; axis <= ABS_MAX; axis++)
{ {
int j; int j;
Bool skip = FALSE; Bool skip = FALSE;
@@ -1273,7 +1312,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes)
goto out; goto out;
/* Find number of absolute axis, including MT ones, will decrease later. */ /* Find number of absolute axis, including MT ones, will decrease later. */
for (i = 0; i < ABS_MAX; i++) for (i = 0; i <= ABS_MAX; i++)
if (libevdev_has_event_code(pEvdev->dev, EV_ABS, i)) if (libevdev_has_event_code(pEvdev->dev, EV_ABS, i))
num_axes++; num_axes++;
@@ -1441,7 +1480,7 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes)
} }
for (i = 0; i < num_touches; i++) { for (i = 0; i < num_touches; i++) {
for (axis = ABS_MT_TOUCH_MAJOR; axis < ABS_MAX; axis++) { for (axis = ABS_MT_TOUCH_MAJOR; axis <= ABS_MAX; axis++) {
if (pEvdev->abs_axis_map[axis] >= 0) { if (pEvdev->abs_axis_map[axis] >= 0) {
int val = pEvdev->mtdev ? 0 : libevdev_get_current_slot(pEvdev->dev); int val = pEvdev->mtdev ? 0 : libevdev_get_current_slot(pEvdev->dev);
/* XXX: read initial values from mtdev when it adds support /* XXX: read initial values from mtdev when it adds support
@@ -1462,10 +1501,8 @@ EvdevAddAbsValuatorClass(DeviceIntPtr device, int num_scroll_axes)
continue; continue;
abs = libevdev_get_abs_info(pEvdev->dev, axis); abs = libevdev_get_abs_info(pEvdev->dev, axis);
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 30)
/* Kernel provides units/mm, X wants units/m */ /* Kernel provides units/mm, X wants units/m */
resolution = abs->resolution * 1000; resolution = abs->resolution * 1000;
#endif
xf86InitValuatorAxisStruct(device, axnum, xf86InitValuatorAxisStruct(device, axnum,
atoms[axnum], atoms[axnum],
@@ -1654,7 +1691,7 @@ EvdevAddRelValuatorClass(DeviceIntPtr device, int num_scroll_axes)
if (!libevdev_has_event_type(pEvdev->dev, EV_REL)) if (!libevdev_has_event_type(pEvdev->dev, EV_REL))
goto out; goto out;
for (i = 0; i < REL_MAX; i++) { for (i = 0; i <= REL_MAX; i++) {
if (i == REL_WHEEL || i == REL_HWHEEL || i == REL_DIAL) if (i == REL_WHEEL || i == REL_HWHEEL || i == REL_DIAL)
continue; continue;
@@ -1909,7 +1946,7 @@ EvdevInit(DeviceIntPtr device)
* So, unless you have a small screen, you won't be enjoying it much; * So, unless you have a small screen, you won't be enjoying it much;
* consequently, absolute axes are generally ignored. * consequently, absolute axes are generally ignored.
* *
* However, currenly only a device with absolute axes can be registered * However, currently only a device with absolute axes can be registered
* as a touch{pad,screen}. Thus, given such a device, absolute axes are * as a touch{pad,screen}. Thus, given such a device, absolute axes are
* used and relative axes are ignored. * used and relative axes are ignored.
*/ */
@@ -2339,8 +2376,10 @@ EvdevProbe(InputInfoPtr pInfo)
pInfo->type_name = XI_TOUCHSCREEN; pInfo->type_name = XI_TOUCHSCREEN;
} else { } else {
if (!libevdev_has_event_code(pEvdev->dev, EV_REL, REL_X) || if (!libevdev_has_event_code(pEvdev->dev, EV_REL, REL_X) ||
!libevdev_has_event_code(pEvdev->dev, EV_REL, REL_Y)) !libevdev_has_event_code(pEvdev->dev, EV_REL, REL_Y)) {
pEvdev->flags |= EVDEV_RELATIVE_EVENTS;
EvdevForceXY(pInfo, Relative); EvdevForceXY(pInfo, Relative);
}
xf86IDrvMsg(pInfo, X_INFO, "Configuring as mouse\n"); xf86IDrvMsg(pInfo, X_INFO, "Configuring as mouse\n");
pInfo->type_name = XI_MOUSE; pInfo->type_name = XI_MOUSE;
} }
@@ -2471,7 +2510,7 @@ EvdevOpenDevice(InputInfoPtr pInfo)
} }
if (pInfo->fd < 0) { if (pInfo->fd < 0) {
xf86IDrvMsg(pInfo, X_ERROR, "Unable to open evdev device \"%s\".\n", device); xf86IDrvMsg(pInfo, X_ERROR, "Unable to open evdev device \"%s\" (%s).\n", device, strerror(errno));
return BadValue; return BadValue;
} }
@@ -2779,6 +2818,9 @@ static void EvdevInitButtonLabels(EvdevPtr pEvdev, int natoms, Atom *atoms)
int group = (button % 0x100)/16; int group = (button % 0x100)/16;
int idx = button - ((button/16) * 16); int idx = button - ((button/16) * 16);
if (group >= ArrayLength(btn_labels))
break;
if (!libevdev_has_event_code(pEvdev->dev, EV_KEY, button)) if (!libevdev_has_event_code(pEvdev->dev, EV_KEY, button))
continue; continue;

View File

@@ -36,7 +36,14 @@
#define EVDEV_H #define EVDEV_H
#include <linux/input.h> #include <linux/input.h>
#include <linux/types.h> #include <sys/types.h>
/* Tolerate prior #include <linux/input.h> */
#undef BUS_NONE
#undef BUS_PCI
#undef BUS_SBUS
#undef BUS_PLATFORM
#undef BUS_USB
#include <xorg-server.h> #include <xorg-server.h>
#include <xf86Xinput.h> #include <xf86Xinput.h>
@@ -67,6 +74,18 @@
#define LogMessageVerbSigSafe xf86MsgVerb #define LogMessageVerbSigSafe xf86MsgVerb
#endif #endif
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 23
#define HAVE_THREADED_INPUT 1
#endif
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 24
#define BLOCK_HANDLER_ARGS void *data, void *waitTime
#define WAKEUP_HANDLER_ARGS void *data, int i
#else
#define BLOCK_HANDLER_ARGS pointer data, struct timeval **waitTime, pointer LastSelectMask
#define WAKEUP_HANDLER_ARGS void *data, int i, pointer LastSelectMask
#endif
#define EVDEV_MAXBUTTONS 32 #define EVDEV_MAXBUTTONS 32
#define EVDEV_MAXQUEUE 32 #define EVDEV_MAXQUEUE 32
@@ -184,6 +203,7 @@ typedef struct {
int state; /* state machine (see bt3emu.c) */ int state; /* state machine (see bt3emu.c) */
Time expires; /* time of expiry */ Time expires; /* time of expiry */
Time timeout; Time timeout;
uint8_t button; /* phys button to emit */
} emulateMB; } emulateMB;
/* Third mouse button emulation */ /* Third mouse button emulation */
struct emulate3B { struct emulate3B {
@@ -260,8 +280,8 @@ unsigned int EvdevUtilButtonEventToButtonNumber(EvdevPtr pEvdev, int code);
/* Middle Button emulation */ /* Middle Button emulation */
int EvdevMBEmuTimer(InputInfoPtr); int EvdevMBEmuTimer(InputInfoPtr);
BOOL EvdevMBEmuFilterEvent(InputInfoPtr, int, BOOL); BOOL EvdevMBEmuFilterEvent(InputInfoPtr, int, BOOL);
void EvdevMBEmuWakeupHandler(pointer, int, pointer); void EvdevMBEmuWakeupHandler(WAKEUP_HANDLER_ARGS);
void EvdevMBEmuBlockHandler(pointer, struct timeval**, pointer); void EvdevMBEmuBlockHandler(BLOCK_HANDLER_ARGS);
void EvdevMBEmuPreInit(InputInfoPtr); void EvdevMBEmuPreInit(InputInfoPtr);
void EvdevMBEmuOn(InputInfoPtr); void EvdevMBEmuOn(InputInfoPtr);
void EvdevMBEmuFinalize(InputInfoPtr); void EvdevMBEmuFinalize(InputInfoPtr);