[PATCH evdev 2/5] Detection of multitouch devices
Benjamin Tissoires
tissoire at cena.fr
Sun Mar 28 04:58:10 PDT 2010
This patch does nothing except detecting multitouch devices and putting
this detection in the log.
Signed-off-by: Benjamin Tissoires <tissoire at cena.fr>
---
src/evdev.c | 22 +++++++++++++++++++++-
src/evdev.h | 1 +
2 files changed, 22 insertions(+), 1 deletions(-)
diff --git a/src/evdev.c b/src/evdev.c
index 1491120..b84af7f 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -349,6 +349,8 @@ EvdevQueueButtonClicks(InputInfoPtr pInfo, int button, int count)
#define ABS_X_VALUE 0x1
#define ABS_Y_VALUE 0x2
#define ABS_VALUE 0x4
+#define ABS_MT_X_VALUE 0x8
+#define ABS_MT_Y_VALUE 0x16
/**
* Take the valuators and process them accordingly.
*/
@@ -554,6 +556,10 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo, struct input_event *ev)
pEvdev->abs |= ABS_X_VALUE;
else if (ev->code == ABS_Y)
pEvdev->abs |= ABS_Y_VALUE;
+ else if (ev->code == ABS_MT_POSITION_X)
+ pEvdev->abs |= ABS_MT_X_VALUE;
+ else if (ev->code == ABS_MT_POSITION_Y)
+ pEvdev->abs |= ABS_MT_Y_VALUE;
else
pEvdev->abs |= ABS_VALUE;
}
@@ -715,6 +721,8 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
#undef ABS_X_VALUE
#undef ABS_Y_VALUE
#undef ABS_VALUE
+#undef ABS_MT_X_VALUE
+#undef ABS_MT_Y_VALUE
/* just a magic number to reduce the number of reads */
#define NUM_EVENTS 16
@@ -1502,7 +1510,7 @@ EvdevInit(DeviceIntPtr device)
if (pEvdev->flags & (EVDEV_UNIGNORE_RELATIVE | EVDEV_UNIGNORE_ABSOLUTE))
EvdevInitAnyClass(device, pEvdev);
- else if (pEvdev->flags & (EVDEV_TOUCHPAD | EVDEV_TOUCHSCREEN | EVDEV_TABLET))
+ else if (pEvdev->flags & (EVDEV_TOUCHPAD | EVDEV_TOUCHSCREEN | EVDEV_TABLET | EVDEV_MULTITOUCH))
EvdevInitTouchDevice(device, pEvdev);
else if (pEvdev->flags & EVDEV_RELATIVE_EVENTS)
EvdevInitRelClass(device, pEvdev);
@@ -1887,6 +1895,15 @@ EvdevProbe(InputInfoPtr pInfo)
xf86Msg(X_INFO, "%s: Found absolute axes\n", pInfo->name);
pEvdev->flags |= EVDEV_ABSOLUTE_EVENTS;
+ if ((TestBit(ABS_MT_POSITION_X, pEvdev->abs_bitmask) &&
+ TestBit(ABS_MT_POSITION_Y, pEvdev->abs_bitmask))) {
+ xf86Msg(X_INFO, "%s: Found absolute multitouch device.\n", pInfo->name);
+ pEvdev->flags |= EVDEV_MULTITOUCH;
+ if (!pEvdev->num_buttons) {
+ pEvdev->num_buttons = 7; /* LMR + scroll wheels */
+ pEvdev->flags |= EVDEV_BUTTON_EVENTS;
+ }
+ }
if ((TestBit(ABS_X, pEvdev->abs_bitmask) &&
TestBit(ABS_Y, pEvdev->abs_bitmask))) {
xf86Msg(X_INFO, "%s: Found x and y absolute axes\n", pInfo->name);
@@ -1935,6 +1952,9 @@ EvdevProbe(InputInfoPtr pInfo)
} else if (pEvdev->flags & EVDEV_TOUCHSCREEN) {
xf86Msg(X_INFO, "%s: Configuring as touchscreen\n", pInfo->name);
pInfo->type_name = XI_TOUCHSCREEN;
+ } else if (pEvdev->flags & EVDEV_MULTITOUCH) {
+ xf86Msg(X_INFO, "%s: Configuring as multitouch device\n", pInfo->name);
+ pInfo->type_name = "MULTITOUCHDEVICE";
} else {
xf86Msg(X_INFO, "%s: Configuring as mouse\n", pInfo->name);
pInfo->type_name = XI_MOUSE;
diff --git a/src/evdev.h b/src/evdev.h
index 1133985..0e115f3 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -70,6 +70,7 @@
#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 */
+#define EVDEV_MULTITOUCH (1 << 12) /* device looks like a multi-touch screen? */
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
#define HAVE_PROPERTIES 1
--
1.6.6.1
More information about the xorg-devel
mailing list