Compare commits

..

25 Commits

Author SHA1 Message Date
Peter Hutterer
1936632cb0 evdev 2.4.0
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2010-04-06 10:31:16 +10:00
Simon Thum
0dc931e1ac move feedback initialization up
This allows the backend to propery initialize the feedback from options,
as it works with most other drivers. This is the hacky equivalent of
fixing the initialization of pointer acceleration, which would require
changes to most drivers however.

Signed-off-by: Simon Thum <simon.thum@gmx.de>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2010-03-24 07:50:55 +10:00
Peter Hutterer
d525b48a2f When labeling a device as touchpad, only check for LMR buttons.
Touchpads that have physical buttons have either LMR or BTN_TOOL_FINGER.
Other buttons in the range evdev recognises shouldn't be taken into account
here - they skew the detection towards touchpads and away from touchscreens.

Fedora Bug 571639

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Simon Thum <simon.thum@gmx.de>
2010-03-18 08:04:01 +10:00
Oliver McFadden
801778c310 emuMB: default to disabled mouse button emulation for touchscreens.
Because touchscreens only use one button (see EvdevProcessKeyEvent())
EvdevMBEmuFilterEvent() never calls EvdevMBEmuEnable(..., FALSE) to
disable emulation. This results in touchscreen devices incurring a delay
of Emulate3Timeout (typically 50 ms.)

Default to MBEMU_DISABLED for touchscreen devices (unless overwritten by
Xorg.conf.)

Signed-off-by: Oliver McFadden <oliver.mcfadden@nokia.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2010-02-25 16:07:39 +10:00
Peter Hutterer
99505011d1 man: fix man page formatting for option EmulateWheel.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2010-02-18 19:02:40 +10:00
Gaetan Nadon
fd036680c2 config: move CWARNFLAGS from configure.ac to Makefile.am
Compiler warning flags should be explicitly set in the makefile
rather than being merged with other packages compiler flags.

Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
2010-02-11 10:08:07 -05:00
Andrej Gelenberg
e81cd935cf Implement XSetDeviceMode request handler
Implement XSetDeviceMode request handler for evdev.
Devices with absolute axes can be switched in relative
mode or absolute mode. Devices with relative axes
can be switched only in relative mode. Other devices
return BadMatch, cause they have no valuators and
don't report motion events.

New option "Mode" force devices with absolute axes
to work in relative or absolute mode.

Need xinputproto.

Signed-off-by: Andrej Gelenberg <andrej.gelenberg@udo.edu>
2010-01-19 21:40:06 +13:00
Alan Coopersmith
0b5844ce67 Update Sun license notices to current X.Org standard form
Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
2010-01-15 15:10:55 -08:00
Dima Kogan
d6beb16be2 allow wheel emulation to work with absolute-position devices
Signed-off-by: Dima Kogan <dkogan@cds.caltech.edu>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-12-08 11:02:05 +10:00
Dima Kogan
2f5a0fb698 removed unnecessary static declarations
Signed-off-by: Dima Kogan <dkogan@cds.caltech.edu>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-12-07 11:53:53 +10:00
Peter Hutterer
1b0df04abe Fix up BTN_TOUCH handling for non-button tablets.
BTN_TOOL_* is treated as tool, just like before. BTN_TOUCH on the other hand
may need to be treated as a button left press. This again requires a button
class.

Tested on an HP Touchsmart and a Wacom tablet.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-12-02 09:34:22 +10:00
Peter Hutterer
2ca24a16f0 Only init the calibration property for absolute devices.
Relative devices can't be calibrated anyway so why bother.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-12-01 15:44:18 +10:00
David Woodhouse
7b285a802b Report initial calibration parameters.
Where an initial calibration is provided through the Calibration option
to the driver, it wasn't being exposed in the 'Evdev Axis Calibration'
property. Remedy that...

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-12-01 14:14:17 +10:00
David Woodhouse
f187badb71 Swap axes before applying touch screen calibration.
When the SwapAxes option is set, the X and Y axes in calibration should
be labelled as the user perceives them -- not as the kernel sends them.

Currently, we apply the X-axis calibration to the X-axis of the input,
and then do the axis swapping so we've actually applied the X-axis
calibration to what the user sees as the Y-axis.

This patch changes the order of the operations, so that the axes are
swapped before the calibration is applied.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-12-01 14:12:49 +10:00
Peter Hutterer
0e9d75ba68 Fix a comment, EV_CNT is available since 2.6.24
Introduced in the kernel as 2.6.23-6147-g7b19ada.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-12-01 14:11:55 +10:00
Gaetan Nadon
3a6d27b83d Makefile.am: add ChangeLog and INSTALL on MAINTAINERCLEANFILES
Now that the INSTALL file is generated.
Allows running make maintainer-clean.
2009-11-23 09:25:05 -05:00
Gaetan Nadon
886e303af1 INSTALL, NEWS, README or AUTHORS files are missing/incorrect #24206
Automake 'foreign' option is specified in configure.ac.
Remove from Makefile.am
2009-11-19 09:40:56 -05:00
Gaetan Nadon
3d23ef4888 INSTALL, NEWS, README or AUTHORS files are missing/incorrect #24206
Add missing INSTALL file. Use standard GNU file on building tarball
README may have been updated
Remove AUTHORS file as it is empty and no content available yet.
Remove NEWS file as it is empty and no content available yet.
2009-11-19 09:40:56 -05:00
Gaetan Nadon
c0473e4921 Several driver modules do not have a ChangeLog target in Makefile.am #23814
The git generated ChangeLog replaces the hand written one.
Update configure.ac to xorg-macros level 1.3.
Use XORG_DEFAULT_OPTIONS which replaces four XORG_* macros
Update Makefile.am to add ChangeLog target if missing
Remove ChangeLog from EXTRA_DIST or *CLEAN variables
This is a pre-req for the INSTALL_CMD
2009-11-19 09:40:56 -05:00
Gaetan Nadon
afc9e91765 .gitignore: use common defaults with custom section # 24239
Using common defaults will reduce errors and maintenance.
Only the very small or inexistent custom section need periodic maintenance
when the structure of the component changes. Do not edit defaults.
2009-11-19 09:40:56 -05:00
Bartosz Brachaczek
c1f16a4f59 Set all valuators for relative motion events (#24737)
We should process all the deltas reported by a relative motion device,
otherwise some devices such as A4Tech X-750F or similar may trigger a
situation when the `v` array contains random values (it isn't
initialized anywhere) and later we process them and in effect the mouse
cursor "jumps" on the screen.
I'm not sure why, but we also must be sure that the `first` and `last`
variables reflect the axis map, otherwise the mouse cursor "jumps" on
the screen when clicking mouse buttons in some rare cases reported by
Bartek Iwaniec on Bugzilla. That's why a simple initialization of the
`v` array with zeros isn't sufficient.

X.Org Bug 24737 <http://bugs.freedesktop.org/show_bug.cgi?id=24737>

Signed-off-by: Bartosz Brachaczek <b.brachaczek@gmail.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-11-19 09:24:46 +10:00
Dmitry Torokhov
a0f7f34dc5 Relax checks when reopening devices
When checking whether we are dealing with the same device as before
when we try to reopen it evdev should not require exact match of
entire keymap. Users should be allowed to adjust keymaps to better
match their hardware even after X starts. However we don't expect
changes in [BTN_MISC, KEY_OK) range since these codes are reserved for
mice, joysticks, tablets and so forth, so we will limit the check to
this range.

The same goes for absinfo - limits can change and it should not result
in device being disabled.

Also check the length of the data returned by ioctl and don't try to
compare more than we were given.

[peter: moved the key comparison below the led+abs comparison]

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-11-05 08:41:59 +10:00
Peter Hutterer
11669d8279 Fix drag-lock property handler for multiple draglock buttons.
Parsing of the values was wrong. Given an input of 1 2 3 4, button 1 sets
the lock for button 2 and button 3 sets the lock for button 4.

This also means we need to return BadMatch if the property isn't a multiple
of 2.

Red Hat Bug 524428 <https://bugzilla.redhat.com/show_bug.cgi?id=524428>

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-11-02 14:01:25 +10:00
Peter Hutterer
9cbffda910 Forward keycodes > 255
The server doesn't handle them yet but eventually it should learn.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-10-26 15:42:54 +10:00
Peter Hutterer
59056e656c Remove the reopen timer logic.
This logic was needed in older kernels that sometimes gave error messages
after coming back from resume (2.6.27 release kernels). I haven't seen any
log files that needed this reopen timer in a long time, suggesting that need
for it is gone.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2009-10-20 16:16:02 +10:00
12 changed files with 286 additions and 240 deletions

76
.gitignore vendored
View File

@@ -1,28 +1,78 @@
*.patch #
ChangeLog # X.Org module default exclusion patterns
Makefile # The next section if for module specific patterns
Makefile.in #
# Do not edit the following section
# GNU Build System (Autotools)
aclocal.m4 aclocal.m4
autom4te.cache autom4te.cache/
autoscan.log
ChangeLog
compile
config.guess config.guess
config.h config.h
config.h.in config.h.in
config.log config.log
config-ml.in
config.py
config.status config.status
config.status.lineno
config.sub config.sub
configure configure
configure.scan
depcomp depcomp
.deps/
INSTALL
install-sh install-sh
.libs/
libtool libtool
libtool.m4
ltmain.sh ltmain.sh
man/evdev.4 lt~obsolete.m4
ltoptions.m4
ltsugar.m4
ltversion.m4
Makefile
Makefile.in
mdate-sh
missing missing
.deps mkinstalldirs
.libs
*.lo
*.la
stamp-h1
xf86-input-evdev-*.tar.*
*.pc *.pc
py-compile
stamp-h?
symlink-tree
texinfo.tex
ylwrap
# Do not edit the following section
# Edit Compile Debug Document Distribute
*~ *~
tags *.[0-9]
*.[0-9]x
*.bak
*.bin
core
*.dll
*.exe
*-ISO*.bdf
*-JIS*.bdf
*-KOI8*.bdf
*.kld
*.ko
*.ko.cmd
*.lai
*.l[oa]
*.[oa]
*.obj
*.patch
*.so
*.pcf.gz
*.pdb
*.tar.bz2
*.tar.gz
#
# Add & Override patterns for xf86-input-evdev
#
# Edit the following section as needed
# For example, !report.pc overrides *.pc. See 'man gitignore'
#

35
COPYING
View File

@@ -23,27 +23,24 @@ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Copyright 2005 Sun Microsystems, Inc. All rights reserved. Copyright 2005 Sun Microsystems, Inc. All rights reserved.
Permission to use, copy, modify, distribute, and sell this software and its Permission is hereby granted, free of charge, to any person obtaining a
documentation for any purpose is hereby granted without fee, provided that copy of this software and associated documentation files (the "Software"),
the above copyright notice appear in all copies and that both that to deal in the Software without restriction, including without limitation
copyright notice and this permission notice appear in supporting the rights to use, copy, modify, merge, publish, distribute, sublicense,
documentation. and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included The above copyright notice and this permission notice (including the next
in all copies or substantial portions of the Software. paragraph) shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
OTHER DEALINGS IN THE SOFTWARE. DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of the copyright holders shall
not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization
from the copyright holders.
Copyright © 2008 University of South Australia Copyright © 2008 University of South Australia
copyrights taken from xf86-input-mouse, partly valid for this driver. copyrights taken from xf86-input-mouse, partly valid for this driver.

View File

@@ -18,23 +18,23 @@
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
AUTOMAKE_OPTIONS = foreign
# Ensure headers are installed below $(prefix) for distcheck # Ensure headers are installed below $(prefix) for distcheck
DISTCHECK_CONFIGURE_FLAGS = --with-sdkdir='$${includedir}/xorg' DISTCHECK_CONFIGURE_FLAGS = --with-sdkdir='$${includedir}/xorg'
SUBDIRS = src man include SUBDIRS = src man include
MAINTAINERCLEANFILES = ChangeLog INSTALL
pkgconfigdir = $(libdir)/pkgconfig pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = xorg-evdev.pc pkgconfig_DATA = xorg-evdev.pc
EXTRA_DIST = ChangeLog
MAINTAINERCLEANFILES=ChangeLog .PHONY: ChangeLog INSTALL
.PHONY: ChangeLog INSTALL:
$(INSTALL_CMD)
ChangeLog: ChangeLog:
$(CHANGELOG_CMD) $(CHANGELOG_CMD)
dist-hook: ChangeLog dist-hook: ChangeLog INSTALL

View File

@@ -22,26 +22,28 @@
AC_PREREQ(2.57) AC_PREREQ(2.57)
AC_INIT([xf86-input-evdev], AC_INIT([xf86-input-evdev],
2.3.1, 2.4.0,
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
xf86-input-evdev) xf86-input-evdev)
AC_CONFIG_SRCDIR([Makefile.am]) AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_AUX_DIR(.) AC_CONFIG_AUX_DIR(.)
AM_INIT_AUTOMAKE([dist-bzip2]) AM_INIT_AUTOMAKE([foreign dist-bzip2])
AM_MAINTAINER_MODE AM_MAINTAINER_MODE
# Require xorg-macros: XORG_DEFAULT_OPTIONS # Require xorg-macros: XORG_DEFAULT_OPTIONS
m4_ifndef([XORG_MACROS_VERSION], [AC_FATAL([must install xorg-macros 1.3 or later before running autoconf/autogen])]) m4_ifndef([XORG_MACROS_VERSION],
[m4_fatal([must install xorg-macros 1.3 or later before running autoconf/autogen])])
XORG_MACROS_VERSION(1.3) XORG_MACROS_VERSION(1.3)
XORG_DEFAULT_OPTIONS
AM_CONFIG_HEADER([config.h]) AM_CONFIG_HEADER([config.h])
# Checks for programs. # Checks for programs.
AC_DISABLE_STATIC AC_DISABLE_STATIC
AC_PROG_LIBTOOL AC_PROG_LIBTOOL
AC_PROG_CC AC_PROG_CC
XORG_DEFAULT_OPTIONS
AH_TOP([#include "xorg-server.h"]) AH_TOP([#include "xorg-server.h"])
@@ -53,10 +55,13 @@ AC_ARG_WITH(xorg-module-dir,
inputdir=${moduledir}/input inputdir=${moduledir}/input
AC_SUBST(inputdir) AC_SUBST(inputdir)
# Checks for extensions
XORG_DRIVER_CHECK_EXT(XINPUT, inputproto)
# Checks for pkg-config packages. We need to be able to override sdkdir # Checks for pkg-config packages. We need to be able to override sdkdir
# to satisfy silly distcheck requirements. # to satisfy silly distcheck requirements.
PKG_CHECK_MODULES(XORG, xorg-server xproto $REQUIRED_MODULES) PKG_CHECK_MODULES(XORG, xorg-server xproto $REQUIRED_MODULES)
XORG_CFLAGS="$CWARNFLAGS $XORG_CFLAGS"
AC_ARG_WITH([sdkdir], [], AC_ARG_WITH([sdkdir], [],
[sdkdir="$withval"], [sdkdir="$withval"],
[sdkdir=`$PKG_CONFIG --variable=sdkdir xorg-server`]) [sdkdir=`$PKG_CONFIG --variable=sdkdir xorg-server`])

View File

@@ -56,7 +56,7 @@
/* Reopen attempts. */ /* Reopen attempts. */
/* CARD8 */ /* CARD8 */
#define EVDEV_PROP_REOPEN "Evdev Reopen Attempts" #define EVDEV_PROP_REOPEN "Evdev Reopen Attempts" /* OBSOLETE */
/* Run-time calibration */ /* Run-time calibration */
/* CARD32, 4 values [minx, maxx, miny, maxy], or no values for unset */ /* CARD32, 4 values [minx, maxx, miny, maxy], or no values for unset */

View File

@@ -1,26 +1,23 @@
# Copyright 2005 Sun Microsystems, Inc. All rights reserved. # Copyright 2005 Sun Microsystems, Inc. All rights reserved.
# #
# Permission to use, copy, modify, distribute, and sell this software and its # Permission is hereby granted, free of charge, to any person obtaining a
# documentation for any purpose is hereby granted without fee, provided that # copy of this software and associated documentation files (the "Software"),
# the above copyright notice appear in all copies and that both that # to deal in the Software without restriction, including without limitation
# copyright notice and this permission notice appear in supporting # the rights to use, copy, modify, merge, publish, distribute, sublicense,
# documentation. # and/or sell copies of the Software, and to permit persons to whom the
# # Software is furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included #
# in all copies or substantial portions of the Software. # The above copyright notice and this permission notice (including the next
# # paragraph) shall be included in all copies or substantial portions of the
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # Software.
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF #
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# OTHER DEALINGS IN THE SOFTWARE. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# Except as contained in this notice, the name of the copyright holders shall # DEALINGS IN THE SOFTWARE.
# not be used in advertising or otherwise to promote the sale, use or
# other dealings in this Software without prior written authorization
# from the copyright holders.
# #
drivermandir = $(DRIVER_MAN_DIR) drivermandir = $(DRIVER_MAN_DIR)

View File

@@ -76,13 +76,15 @@ indicating that the next button pressed is to be
.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. The third button is emulated by
pressing both buttons simultaneously. Default: on, until a middle mouse pressing both buttons simultaneously. Default: off for touchscreens, otherwise
button event is registered. Property: "Evdev Middle Button Emulation". on until a middle mouse button event is registered. 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 where pressed "simultaneously" when 3 button emulation is
enabled. Default: 50. Property: "Evdev Middle Button Timeout". enabled. Default: 50. Property: "Evdev Middle Button Timeout".
.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. Wheel emulation means emulating button
press/release events when the mouse is moved while a specific real button press/release events when the mouse is moved while a specific real button
@@ -151,10 +153,6 @@ axes regardless of the presence of other axes. This may trigger buggy
behavior and events from this axis are always forwarded. Users are behavior and events from this axis are always forwarded. Users are
discouraged from setting this option. discouraged from setting this option.
.TP 7 .TP 7
.BI "Option \*qReopenAttempts\*q \*q" integer \*q
Number of reopen attempts after a read error occurs on the device (e.g. after
waking up from suspend). In between each attempt is a 100ms wait. Default: 10.
.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. This feature is required
@@ -163,6 +161,11 @@ originally reported by the kernel (e.g. touchscreens). The scaling to the
custom coordinate system is done in-driver and the X server is unaware of custom coordinate system is done in-driver and the X server is unaware of
the transformation. Property: "Evdev Axis Calibration". the transformation. Property: "Evdev Axis Calibration".
.TP 7 .TP 7
.B Option \*qMode\*q \*qRelative\*q\fP|\fP\*qAbsolute\*q
Sets the mode of the device if device has absolute axes.
The default value for touchpads is relative, for other absolute.
This option has no effect on devices without absolute axes.
.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

View File

@@ -24,7 +24,8 @@
# -avoid-version prevents gratuitous .0.0.0 version numbers on the end # -avoid-version prevents gratuitous .0.0.0 version numbers on the end
# _ladir passes a dummy rpath to libtool so the thing will actually link # _ladir passes a dummy rpath to libtool so the thing will actually link
# TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc. # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
AM_CFLAGS = $(XORG_CFLAGS)
AM_CFLAGS = $(XORG_CFLAGS) $(CWARNFLAGS)
@DRIVER_NAME@_drv_la_LTLIBRARIES = @DRIVER_NAME@_drv.la @DRIVER_NAME@_drv_la_LTLIBRARIES = @DRIVER_NAME@_drv.la
@DRIVER_NAME@_drv_la_LDFLAGS = -module -avoid-version @DRIVER_NAME@_drv_la_LDFLAGS = -module -avoid-version

View File

@@ -309,7 +309,11 @@ void
EvdevMBEmuPreInit(InputInfoPtr pInfo) EvdevMBEmuPreInit(InputInfoPtr pInfo)
{ {
EvdevPtr pEvdev = (EvdevPtr)pInfo->private; EvdevPtr pEvdev = (EvdevPtr)pInfo->private;
pEvdev->emulateMB.enabled = MBEMU_AUTO;
if (pEvdev->flags & EVDEV_TOUCHSCREEN)
pEvdev->emulateMB.enabled = MBEMU_DISABLED;
else
pEvdev->emulateMB.enabled = MBEMU_AUTO;
if (xf86FindOption(pInfo->options, "Emulate3Buttons")) if (xf86FindOption(pInfo->options, "Emulate3Buttons"))
{ {

View File

@@ -100,6 +100,7 @@ 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, pOtherAxis = NULL;
int value = pEv->value; int value = pEv->value;
int oldValue;
/* Has wheel emulation been configured to be enabled? */ /* Has wheel emulation been configured to be enabled? */
if (!pEvdev->emulateWheel.enabled) if (!pEvdev->emulateWheel.enabled)
@@ -118,12 +119,21 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
} }
/* We don't want to intercept real mouse wheel events */ /* We don't want to intercept real mouse wheel events */
if(pEv->type == EV_ABS) {
oldValue = pEvdev->vals[pEvdev->axis_map[pEv->code]];
pEvdev->vals[pEvdev->axis_map[pEv->code]] = value;
value -= oldValue; /* make value into a differential measurement */
}
switch(pEv->code) { switch(pEv->code) {
/* 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); pOtherAxis = &(pEvdev->emulateWheel.Y);
break; break;
/* 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); pOtherAxis = &(pEvdev->emulateWheel.X);
@@ -133,11 +143,11 @@ EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv)
break; break;
} }
/* If we found REL_X or REL_Y, emulate a mouse wheel. /* If we found REL_X, REL_Y, ABS_X or ABS_Y then emulate a mouse
Reset the inertia of the other axis when a scroll event was sent wheel. Reset the inertia of the other axis when a scroll event
to avoid the buildup of erroneous scroll events if the user was sent to avoid the buildup of erroneous scroll events if the
doesn't move in a perfectly straight line. user doesn't move in a perfectly straight line.
*/ */
if (pAxis) if (pAxis)
{ {
if (EvdevWheelEmuInertia(pInfo, pAxis, value)) if (EvdevWheelEmuInertia(pInfo, pAxis, value))

View File

@@ -32,6 +32,7 @@
#endif #endif
#include <X11/keysym.h> #include <X11/keysym.h>
#include <X11/extensions/XI.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
@@ -80,19 +81,6 @@
#define ArrayLength(a) (sizeof(a) / (sizeof((a)[0]))) #define ArrayLength(a) (sizeof(a) / (sizeof((a)[0])))
/* evdev flags */
#define EVDEV_KEYBOARD_EVENTS (1 << 0)
#define EVDEV_BUTTON_EVENTS (1 << 1)
#define EVDEV_RELATIVE_EVENTS (1 << 2)
#define EVDEV_ABSOLUTE_EVENTS (1 << 3)
#define EVDEV_TOUCHPAD (1 << 4)
#define EVDEV_INITIALIZED (1 << 5) /* WheelInit etc. called already? */
#define EVDEV_TOUCHSCREEN (1 << 6)
#define EVDEV_CALIBRATED (1 << 7) /* run-time calibrated? */
#define EVDEV_TABLET (1 << 8) /* device looks like a tablet? */
#define EVDEV_UNIGNORE_ABSOLUTE (1 << 9) /* explicitly unignore abs axes */
#define EVDEV_UNIGNORE_RELATIVE (1 << 10) /* explicitly unignore rel axes */
#define MIN_KEYCODE 8 #define MIN_KEYCODE 8
#define GLYPHS_PER_KEY 2 #define GLYPHS_PER_KEY 2
#define AltMask Mod1Mask #define AltMask Mod1Mask
@@ -117,6 +105,7 @@ static const char *evdevDefaults[] = {
static int EvdevOn(DeviceIntPtr); static int EvdevOn(DeviceIntPtr);
static int EvdevCacheCompare(InputInfoPtr pInfo, BOOL compare); static int EvdevCacheCompare(InputInfoPtr pInfo, BOOL compare);
static void EvdevKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl); static void EvdevKbdCtrl(DeviceIntPtr device, KeybdCtrl *ctrl);
static int EvdevSwitchMode(ClientPtr client, DeviceIntPtr device, int mode);
#ifdef HAVE_PROPERTIES #ifdef HAVE_PROPERTIES
static void EvdevInitAxesLabels(EvdevPtr pEvdev, int natoms, Atom *atoms); static void EvdevInitAxesLabels(EvdevPtr pEvdev, int natoms, Atom *atoms);
@@ -125,7 +114,6 @@ static void EvdevInitProperty(DeviceIntPtr dev);
static int EvdevSetProperty(DeviceIntPtr dev, Atom atom, static int EvdevSetProperty(DeviceIntPtr dev, Atom atom,
XIPropertyValuePtr val, BOOL checkonly); XIPropertyValuePtr val, BOOL checkonly);
static Atom prop_invert = 0; static Atom prop_invert = 0;
static Atom prop_reopen = 0;
static Atom prop_calibration = 0; static Atom prop_calibration = 0;
static Atom prop_swap = 0; static Atom prop_swap = 0;
static Atom prop_axis_label = 0; static Atom prop_axis_label = 0;
@@ -137,6 +125,38 @@ static Atom prop_btn_label = 0;
* cannot be used by evdev, leaving us with a space of 2 at the end. */ * cannot be used by evdev, leaving us with a space of 2 at the end. */
static EvdevPtr evdev_devices[MAXDEVICES] = {NULL}; static EvdevPtr evdev_devices[MAXDEVICES] = {NULL};
static int EvdevSwitchMode(ClientPtr client, DeviceIntPtr device, int mode)
{
InputInfoPtr pInfo;
EvdevPtr pEvdev;
pInfo = device->public.devicePrivate;
pEvdev = pInfo->private;
if (pEvdev->flags & EVDEV_RELATIVE_EVENTS)
{
if (mode == Relative)
return Success;
else
return XI_BadMode;
}
switch (mode) {
case Absolute:
pEvdev->flags &= ~EVDEV_RELATIVE_MODE;
break;
case Relative:
pEvdev->flags |= EVDEV_RELATIVE_MODE;
break;
default:
return XI_BadMode;
}
return Success;
}
static size_t CountBits(unsigned long *array, size_t nlongs) static size_t CountBits(unsigned long *array, size_t nlongs)
{ {
unsigned int i; unsigned int i;
@@ -256,7 +276,6 @@ 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 + MIN_KEYCODE;
static char warned[KEY_CNT];
EventQueuePtr pQueue; EventQueuePtr pQueue;
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
@@ -274,19 +293,6 @@ EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value)
) )
return; return;
if (code > 255)
{
if (ev->code <= KEY_MAX && !warned[ev->code])
{
xf86Msg(X_WARNING, "%s: unable to handle keycode %d\n",
pInfo->name, ev->code);
warned[ev->code] = 1;
}
/* The X server can't handle keycodes > 255. */
return;
}
if (pEvdev->num_queue >= EVDEV_MAXQUEUE) if (pEvdev->num_queue >= EVDEV_MAXQUEUE)
{ {
xf86Msg(X_NONE, "%s: dropping event due to full queue!\n", pInfo->name); xf86Msg(X_NONE, "%s: dropping event due to full queue!\n", pInfo->name);
@@ -340,56 +346,6 @@ EvdevQueueButtonClicks(InputInfoPtr pInfo, int button, int count)
} }
} }
/**
* Coming back from resume may leave us with a file descriptor that can be
* opened but fails on the first read (ENODEV).
* In this case, try to open the device until it becomes available or until
* the predefined count expires.
*/
static CARD32
EvdevReopenTimer(OsTimerPtr timer, CARD32 time, pointer arg)
{
InputInfoPtr pInfo = (InputInfoPtr)arg;
EvdevPtr pEvdev = pInfo->private;
do {
pInfo->fd = open(pEvdev->device, O_RDWR | O_NONBLOCK, 0);
} while (pInfo->fd < 0 && errno == EINTR);
if (pInfo->fd != -1)
{
if (EvdevCacheCompare(pInfo, TRUE) == Success)
{
xf86Msg(X_INFO, "%s: Device reopened after %d attempts.\n", pInfo->name,
pEvdev->reopen_attempts - pEvdev->reopen_left + 1);
EvdevOn(pInfo->dev);
} else
{
xf86Msg(X_ERROR, "%s: Device has changed - disabling.\n",
pInfo->name);
xf86DisableDevice(pInfo->dev, FALSE);
close(pInfo->fd);
pInfo->fd = -1;
pEvdev->min_maj = 0; /* don't hog the device */
}
pEvdev->reopen_left = 0;
return 0;
}
pEvdev->reopen_left--;
if (!pEvdev->reopen_left)
{
xf86Msg(X_ERROR, "%s: Failed to reopen device after %d attempts.\n",
pInfo->name, pEvdev->reopen_attempts);
xf86DisableDevice(pInfo->dev, FALSE);
pEvdev->min_maj = 0; /* don't hog the device */
return 0;
}
return 100; /* come back in 100 ms */
}
#define ABS_X_VALUE 0x1 #define ABS_X_VALUE 0x1
#define ABS_Y_VALUE 0x2 #define ABS_Y_VALUE 0x2
#define ABS_VALUE 0x4 #define ABS_VALUE 0x4
@@ -406,7 +362,7 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
*num_v = *first_v = 0; *num_v = *first_v = 0;
/* convert to relative motion for touchpads */ /* convert to relative motion for touchpads */
if (pEvdev->abs && (pEvdev->flags & EVDEV_TOUCHPAD)) { if (pEvdev->abs && (pEvdev->flags & EVDEV_RELATIVE_MODE)) {
if (pEvdev->tool) { /* meaning, touch is active */ if (pEvdev->tool) { /* meaning, touch is active */
if (pEvdev->old_vals[0] != -1) if (pEvdev->old_vals[0] != -1)
pEvdev->delta[REL_X] = pEvdev->vals[0] - pEvdev->old_vals[0]; pEvdev->delta[REL_X] = pEvdev->vals[0] - pEvdev->old_vals[0];
@@ -464,6 +420,13 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
*/ */
else if (pEvdev->abs && pEvdev->tool) { else if (pEvdev->abs && pEvdev->tool) {
memcpy(v, pEvdev->vals, sizeof(int) * pEvdev->num_vals); memcpy(v, pEvdev->vals, sizeof(int) * pEvdev->num_vals);
if (pEvdev->swap_axes) {
int tmp = v[0];
v[0] = v[1];
v[1] = tmp;
}
if (pEvdev->flags & EVDEV_CALIBRATED) if (pEvdev->flags & EVDEV_CALIBRATED)
{ {
v[0] = xf86ScaleAxis(v[0], v[0] = xf86ScaleAxis(v[0],
@@ -476,12 +439,6 @@ EvdevProcessValuators(InputInfoPtr pInfo, int v[MAX_VALUATORS], int *num_v,
pEvdev->calibration.max_y, pEvdev->calibration.min_y); pEvdev->calibration.max_y, pEvdev->calibration.min_y);
} }
if (pEvdev->swap_axes) {
int tmp = v[0];
v[0] = v[1];
v[1] = tmp;
}
if (pEvdev->invert_x) if (pEvdev->invert_x)
v[0] = (pEvdev->absinfo[ABS_X].maximum - v[0] + v[0] = (pEvdev->absinfo[ABS_X].maximum - v[0] +
pEvdev->absinfo[ABS_X].minimum); pEvdev->absinfo[ABS_X].minimum);
@@ -531,7 +488,7 @@ EvdevProcessButtonEvent(InputInfoPtr pInfo, struct input_event *ev)
static void static void
EvdevProcessRelativeMotionEvent(InputInfoPtr pInfo, struct input_event *ev) EvdevProcessRelativeMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
{ {
static int value; int value;
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
/* Get the signed value, earlier kernels had this as unsigned */ /* Get the signed value, earlier kernels had this as unsigned */
@@ -576,7 +533,7 @@ EvdevProcessRelativeMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
static void static void
EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev) EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
{ {
static int value; int value;
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
/* Get the signed value, earlier kernels had this as unsigned */ /* Get the signed value, earlier kernels had this as unsigned */
@@ -589,6 +546,9 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
if (ev->code > ABS_MAX) if (ev->code > ABS_MAX)
return; return;
if (EvdevWheelEmuFilterMotion(pInfo, ev))
return;
pEvdev->vals[pEvdev->axis_map[ev->code]] = value; pEvdev->vals[pEvdev->axis_map[ev->code]] = value;
if (ev->code == ABS_X) if (ev->code == ABS_X)
pEvdev->abs |= ABS_X_VALUE; pEvdev->abs |= ABS_X_VALUE;
@@ -604,7 +564,7 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
static void static void
EvdevProcessKeyEvent(InputInfoPtr pInfo, struct input_event *ev) EvdevProcessKeyEvent(InputInfoPtr pInfo, struct input_event *ev)
{ {
static int value; int value;
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
/* Get the signed value, earlier kernels had this as unsigned */ /* Get the signed value, earlier kernels had this as unsigned */
@@ -616,7 +576,6 @@ EvdevProcessKeyEvent(InputInfoPtr pInfo, struct input_event *ev)
return; return;
switch (ev->code) { switch (ev->code) {
case BTN_TOUCH:
case BTN_TOOL_PEN: case BTN_TOOL_PEN:
case BTN_TOOL_RUBBER: case BTN_TOOL_RUBBER:
case BTN_TOOL_BRUSH: case BTN_TOOL_BRUSH:
@@ -626,7 +585,11 @@ EvdevProcessKeyEvent(InputInfoPtr pInfo, struct input_event *ev)
case BTN_TOOL_MOUSE: case BTN_TOOL_MOUSE:
case BTN_TOOL_LENS: case BTN_TOOL_LENS:
pEvdev->tool = value ? ev->code : 0; pEvdev->tool = value ? ev->code : 0;
if (!(pEvdev->flags & EVDEV_TOUCHSCREEN)) break;
case BTN_TOUCH:
pEvdev->tool = value ? ev->code : 0;
if (!(pEvdev->flags & (EVDEV_TOUCHSCREEN | EVDEV_TABLET)))
break; break;
/* Treat BTN_TOUCH from devices that only have BTN_TOUCH as /* Treat BTN_TOUCH from devices that only have BTN_TOUCH as
* BTN_LEFT. */ * BTN_LEFT. */
@@ -761,7 +724,6 @@ EvdevReadInput(InputInfoPtr pInfo)
{ {
struct input_event ev[NUM_EVENTS]; struct input_event ev[NUM_EVENTS];
int i, len = sizeof(ev); int i, len = sizeof(ev);
EvdevPtr pEvdev = pInfo->private;
while (len == sizeof(ev)) while (len == sizeof(ev))
{ {
@@ -774,11 +736,6 @@ EvdevReadInput(InputInfoPtr pInfo)
xf86RemoveEnabledDevice(pInfo); xf86RemoveEnabledDevice(pInfo);
close(pInfo->fd); close(pInfo->fd);
pInfo->fd = -1; pInfo->fd = -1;
if (pEvdev->reopen_timer)
{
pEvdev->reopen_left = pEvdev->reopen_attempts;
pEvdev->reopen_timer = TimerSet(pEvdev->reopen_timer, 0, 100, EvdevReopenTimer, pInfo);
}
} else if (errno != EAGAIN) } else if (errno != EAGAIN)
{ {
/* We use X_NONE here because it doesn't alloc */ /* We use X_NONE here because it doesn't alloc */
@@ -1193,6 +1150,7 @@ EvdevAddAbsClass(DeviceIntPtr device)
EvdevPtr pEvdev; EvdevPtr pEvdev;
int num_axes, axis, i = 0; int num_axes, axis, i = 0;
Atom *atoms; Atom *atoms;
const char *mode;
pInfo = device->public.devicePrivate; pInfo = device->public.devicePrivate;
pEvdev = pInfo->private; pEvdev = pInfo->private;
@@ -1264,6 +1222,22 @@ EvdevAddAbsClass(DeviceIntPtr device)
TestBit(ABS_TILT_Y, pEvdev->abs_bitmask))) TestBit(ABS_TILT_Y, pEvdev->abs_bitmask)))
pInfo->flags |= XI86_POINTER_CAPABLE; pInfo->flags |= XI86_POINTER_CAPABLE;
if (pEvdev->flags & EVDEV_TOUCHPAD)
pEvdev->flags |= EVDEV_RELATIVE_MODE;
else
pEvdev->flags &= ~EVDEV_RELATIVE_MODE;
if (xf86FindOption(pInfo->options, "Mode"))
{
mode = xf86SetStrOption(pInfo->options, "Mode", NULL);
if (!strcasecmp("absolute", mode))
pEvdev->flags &= ~EVDEV_RELATIVE_MODE;
else if (!strcasecmp("relative", mode))
pEvdev->flags |= EVDEV_RELATIVE_MODE;
else
xf86Msg(X_INFO, "%s: unknown mode, use default\n", pInfo->name);
}
return Success; return Success;
} }
@@ -1325,6 +1299,9 @@ EvdevAddRelClass(DeviceIntPtr device)
GetMotionHistorySize(), Relative)) GetMotionHistorySize(), Relative))
return !Success; return !Success;
if (!InitPtrFeedbackClassDeviceStruct(device, EvdevPtrCtrlProc))
return !Success;
for (axis = REL_X; axis <= REL_MAX; axis++) for (axis = REL_X; axis <= REL_MAX; axis++)
{ {
int axnum = pEvdev->axis_map[axis]; int axnum = pEvdev->axis_map[axis];
@@ -1341,9 +1318,6 @@ EvdevAddRelClass(DeviceIntPtr device)
xfree(atoms); xfree(atoms);
if (!InitPtrFeedbackClassDeviceStruct(device, EvdevPtrCtrlProc))
return !Success;
pInfo->flags |= XI86_POINTER_CAPABLE; pInfo->flags |= XI86_POINTER_CAPABLE;
return Success; return Success;
@@ -1551,9 +1525,6 @@ EvdevInit(DeviceIntPtr device)
/** /**
* Init all extras (wheel emulation, etc.) and grab the device. * Init all extras (wheel emulation, etc.) and grab the device.
*
* Coming from a resume, the grab may fail with ENODEV. In this case, we set a
* timer to wake up and try to reopen the device later.
*/ */
static int static int
EvdevOn(DeviceIntPtr device) EvdevOn(DeviceIntPtr device)
@@ -1565,42 +1536,36 @@ EvdevOn(DeviceIntPtr device)
pInfo = device->public.devicePrivate; pInfo = device->public.devicePrivate;
pEvdev = pInfo->private; pEvdev = pInfo->private;
if (pInfo->fd != -1 && pEvdev->grabDevice && if (pInfo->fd == -1) /* after PreInit fd is still open */
(rc = ioctl(pInfo->fd, EVIOCGRAB, (void *)1)))
{ {
do {
pInfo->fd = open(pEvdev->device, O_RDWR | O_NONBLOCK, 0);
} while (pInfo->fd < 0 && errno == EINTR);
if (pInfo->fd < 0) {
xf86Msg(X_ERROR, "Unable to open evdev device \"%s\".\n",
pEvdev->device);
return !Success;
}
}
if (pEvdev->grabDevice && (rc = ioctl(pInfo->fd, EVIOCGRAB, (void *)1)))
xf86Msg(X_WARNING, "%s: Grab failed (%s)\n", pInfo->name, xf86Msg(X_WARNING, "%s: Grab failed (%s)\n", pInfo->name,
strerror(errno)); strerror(errno));
/* ENODEV - device has disappeared after resume */ pEvdev->min_maj = EvdevGetMajorMinor(pInfo);
if (rc && errno == ENODEV) if (EvdevIsDuplicate(pInfo))
{ {
close(pInfo->fd); xf86Msg(X_WARNING, "%s: Refusing to enable duplicate device.\n",
pInfo->fd = -1; pInfo->name);
} return !Success;
} }
if (pInfo->fd == -1) xf86FlushInput(pInfo->fd);
{ xf86AddEnabledDevice(pInfo);
pEvdev->reopen_left = pEvdev->reopen_attempts; EvdevMBEmuOn(pInfo);
pEvdev->reopen_timer = TimerSet(pEvdev->reopen_timer, 0, 100, EvdevReopenTimer, pInfo); pEvdev->flags |= EVDEV_INITIALIZED;
} else device->public.on = TRUE;
{
pEvdev->min_maj = EvdevGetMajorMinor(pInfo);
if (EvdevIsDuplicate(pInfo))
{
xf86Msg(X_WARNING, "%s: Refusing to enable duplicate device.\n",
pInfo->name);
return !Success;
}
pEvdev->reopen_timer = TimerSet(pEvdev->reopen_timer, 0, 0, NULL, NULL);
xf86FlushInput(pInfo->fd);
xf86AddEnabledDevice(pInfo);
EvdevMBEmuOn(pInfo);
pEvdev->flags |= EVDEV_INITIALIZED;
device->public.on = TRUE;
}
return Success; return Success;
} }
@@ -1638,11 +1603,6 @@ EvdevProc(DeviceIntPtr device, int what)
pEvdev->min_maj = 0; pEvdev->min_maj = 0;
pEvdev->flags &= ~EVDEV_INITIALIZED; pEvdev->flags &= ~EVDEV_INITIALIZED;
device->public.on = FALSE; device->public.on = FALSE;
if (pEvdev->reopen_timer)
{
TimerFree(pEvdev->reopen_timer);
pEvdev->reopen_timer = NULL;
}
break; break;
case DEVICE_CLOSE: case DEVICE_CLOSE:
@@ -1807,6 +1767,7 @@ static int
EvdevProbe(InputInfoPtr pInfo) EvdevProbe(InputInfoPtr pInfo)
{ {
int i, has_rel_axes, has_abs_axes, has_keys, num_buttons, has_scroll; int i, has_rel_axes, has_abs_axes, has_keys, num_buttons, has_scroll;
int has_lmr; /* left middle right */
int kernel24 = 0; int kernel24 = 0;
int ignore_abs = 0, ignore_rel = 0; int ignore_abs = 0, ignore_rel = 0;
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
@@ -1849,6 +1810,7 @@ EvdevProbe(InputInfoPtr pInfo)
has_abs_axes = FALSE; has_abs_axes = FALSE;
has_keys = FALSE; has_keys = FALSE;
has_scroll = FALSE; has_scroll = FALSE;
has_lmr = FALSE;
num_buttons = 0; num_buttons = 0;
/* count all buttons */ /* count all buttons */
@@ -1863,6 +1825,10 @@ EvdevProbe(InputInfoPtr pInfo)
} }
} }
has_lmr = TestBit(BTN_LEFT, pEvdev->key_bitmask) ||
TestBit(BTN_MIDDLE, pEvdev->key_bitmask) ||
TestBit(BTN_RIGHT, pEvdev->key_bitmask);
if (num_buttons) if (num_buttons)
{ {
pEvdev->flags |= EVDEV_BUTTON_EVENTS; pEvdev->flags |= EVDEV_BUTTON_EVENTS;
@@ -1928,9 +1894,14 @@ EvdevProbe(InputInfoPtr pInfo)
{ {
xf86Msg(X_INFO, "%s: Found absolute tablet.\n", pInfo->name); xf86Msg(X_INFO, "%s: Found absolute tablet.\n", pInfo->name);
pEvdev->flags |= EVDEV_TABLET; pEvdev->flags |= EVDEV_TABLET;
if (!pEvdev->num_buttons)
{
pEvdev->num_buttons = 7; /* LMR + scroll wheels */
pEvdev->flags |= EVDEV_BUTTON_EVENTS;
}
} else if (TestBit(ABS_PRESSURE, pEvdev->abs_bitmask) || } else if (TestBit(ABS_PRESSURE, pEvdev->abs_bitmask) ||
TestBit(BTN_TOUCH, pEvdev->key_bitmask)) { TestBit(BTN_TOUCH, pEvdev->key_bitmask)) {
if (num_buttons || TestBit(BTN_TOOL_FINGER, pEvdev->key_bitmask)) { if (has_lmr || TestBit(BTN_TOOL_FINGER, pEvdev->key_bitmask)) {
xf86Msg(X_INFO, "%s: Found absolute touchpad.\n", pInfo->name); xf86Msg(X_INFO, "%s: Found absolute touchpad.\n", pInfo->name);
pEvdev->flags |= EVDEV_TOUCHPAD; pEvdev->flags |= EVDEV_TOUCHPAD;
memset(pEvdev->old_vals, -1, sizeof(int) * pEvdev->num_vals); memset(pEvdev->old_vals, -1, sizeof(int) * pEvdev->num_vals);
@@ -2039,7 +2010,7 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
pInfo->history_size = 0; pInfo->history_size = 0;
pInfo->control_proc = NULL; pInfo->control_proc = NULL;
pInfo->close_proc = NULL; pInfo->close_proc = NULL;
pInfo->switch_mode = NULL; pInfo->switch_mode = EvdevSwitchMode;
pInfo->conversion_proc = NULL; pInfo->conversion_proc = NULL;
pInfo->reverse_conversion_proc = NULL; pInfo->reverse_conversion_proc = NULL;
pInfo->dev = NULL; pInfo->dev = NULL;
@@ -2092,7 +2063,6 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
return NULL; return NULL;
} }
pEvdev->reopen_attempts = xf86SetIntOption(pInfo->options, "ReopenAttempts", 10);
pEvdev->invert_x = xf86SetBoolOption(pInfo->options, "InvertX", FALSE); pEvdev->invert_x = xf86SetBoolOption(pInfo->options, "InvertX", FALSE);
pEvdev->invert_y = xf86SetBoolOption(pInfo->options, "InvertY", FALSE); pEvdev->invert_y = xf86SetBoolOption(pInfo->options, "InvertY", FALSE);
pEvdev->swap_axes = xf86SetBoolOption(pInfo->options, "SwapAxes", FALSE); pEvdev->swap_axes = xf86SetBoolOption(pInfo->options, "SwapAxes", FALSE);
@@ -2480,18 +2450,6 @@ EvdevInitProperty(DeviceIntPtr dev)
EvdevPtr pEvdev = pInfo->private; EvdevPtr pEvdev = pInfo->private;
int rc; int rc;
BOOL invert[2]; BOOL invert[2];
char reopen;
prop_reopen = MakeAtom(EVDEV_PROP_REOPEN, strlen(EVDEV_PROP_REOPEN),
TRUE);
reopen = pEvdev->reopen_attempts;
rc = XIChangeDeviceProperty(dev, prop_reopen, XA_INTEGER, 8,
PropModeReplace, 1, &reopen, FALSE);
if (rc != Success)
return;
XISetDevicePropertyDeletable(dev, prop_reopen, FALSE);
if (pEvdev->flags & (EVDEV_RELATIVE_EVENTS | EVDEV_ABSOLUTE_EVENTS)) if (pEvdev->flags & (EVDEV_RELATIVE_EVENTS | EVDEV_ABSOLUTE_EVENTS))
{ {
@@ -2510,8 +2468,22 @@ EvdevInitProperty(DeviceIntPtr dev)
prop_calibration = MakeAtom(EVDEV_PROP_CALIBRATION, prop_calibration = MakeAtom(EVDEV_PROP_CALIBRATION,
strlen(EVDEV_PROP_CALIBRATION), TRUE); strlen(EVDEV_PROP_CALIBRATION), TRUE);
rc = XIChangeDeviceProperty(dev, prop_calibration, XA_INTEGER, 32, if (pEvdev->flags & EVDEV_CALIBRATED) {
PropModeReplace, 0, NULL, FALSE); int calibration[4];
calibration[0] = pEvdev->calibration.min_x;
calibration[1] = pEvdev->calibration.max_x;
calibration[2] = pEvdev->calibration.min_y;
calibration[3] = pEvdev->calibration.max_y;
rc = XIChangeDeviceProperty(dev, prop_calibration, XA_INTEGER,
32, PropModeReplace, 4, calibration,
FALSE);
} else if (pEvdev->flags & EVDEV_ABSOLUTE_EVENTS) {
rc = XIChangeDeviceProperty(dev, prop_calibration, XA_INTEGER,
32, PropModeReplace, 0, NULL,
FALSE);
}
if (rc != Success) if (rc != Success)
return; return;
@@ -2570,13 +2542,6 @@ EvdevSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
pEvdev->invert_x = data[0]; pEvdev->invert_x = data[0];
pEvdev->invert_y = data[1]; pEvdev->invert_y = data[1];
} }
} else if (atom == prop_reopen)
{
if (val->format != 8 || val->size != 1 || val->type != XA_INTEGER)
return BadMatch;
if (!checkonly)
pEvdev->reopen_attempts = *((CARD8*)val->data);
} else if (atom == prop_calibration) } else if (atom == prop_calibration)
{ {
if (val->format != 32 || val->type != XA_INTEGER) if (val->format != 32 || val->type != XA_INTEGER)

View File

@@ -38,7 +38,7 @@
#include <xf86_OSproc.h> #include <xf86_OSproc.h>
#include <xkbstr.h> #include <xkbstr.h>
#ifndef EV_CNT /* linux 2.4 kernels and earlier lack _CNT defines */ #ifndef EV_CNT /* linux 2.6.23 kernels and earlier lack _CNT defines */
#define EV_CNT (EV_MAX+1) #define EV_CNT (EV_MAX+1)
#endif #endif
#ifndef KEY_CNT #ifndef KEY_CNT
@@ -57,6 +57,20 @@
#define EVDEV_MAXBUTTONS 32 #define EVDEV_MAXBUTTONS 32
#define EVDEV_MAXQUEUE 32 #define EVDEV_MAXQUEUE 32
/* evdev flags */
#define EVDEV_KEYBOARD_EVENTS (1 << 0)
#define EVDEV_BUTTON_EVENTS (1 << 1)
#define EVDEV_RELATIVE_EVENTS (1 << 2)
#define EVDEV_ABSOLUTE_EVENTS (1 << 3)
#define EVDEV_TOUCHPAD (1 << 4)
#define EVDEV_INITIALIZED (1 << 5) /* WheelInit etc. called already? */
#define EVDEV_TOUCHSCREEN (1 << 6)
#define EVDEV_CALIBRATED (1 << 7) /* run-time calibrated? */
#define EVDEV_TABLET (1 << 8) /* device looks like a tablet? */
#define EVDEV_UNIGNORE_ABSOLUTE (1 << 9) /* explicitly unignore abs axes */
#define EVDEV_UNIGNORE_RELATIVE (1 << 10) /* explicitly unignore rel axes */
#define EVDEV_RELATIVE_MODE (1 << 11) /* Force relative events for devices with absolute axes */
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
#define HAVE_PROPERTIES 1 #define HAVE_PROPERTIES 1
#endif #endif