blob: d93464508629d2eb87cfd4d85a2da4a76566912e [file] [log] [blame]
From e980bf58fcd406c392eec35a8b2ac3aa2c7908b7 Mon Sep 17 00:00:00 2001
From: Chung-yih Wang <cywang@chromium.org>
Date: Thu, 6 Dec 2012 17:43:04 +0800
Subject: [PATCH] Add block reading support
This patch adds a new xinput property "Block Event Reading" that blocks
event reading by skipping read() calls in ReadInput() in order to
generate the SYN_DROPPED event for testing the SYN_DROPPED handling.
---
src/debug.c | 37 +++++++++++++++++++++++++++++++++++++
src/evdev.c | 6 +++++-
src/evdev.h | 5 +++++
3 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/src/debug.c b/src/debug.c
index 493dec8..b685eb5 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -19,10 +19,12 @@
#include <xf86Xinput.h>
#include <X11/Xatom.h>
+#define XI_PROP_BLOCK_READ_INPUT "Block Event Reading"
#define XI_PROP_DUMP_DEBUG_LOG "Dump Debug Log"
#define INPUT_EVENTS_LOG_FILE "/var/log/xorg/evdev_input_events.dat"
+static Atom block_read_prop;
static Atom dump_debug_log_prop;
static void
@@ -141,3 +143,38 @@ EvdevDebugInitProperty(DeviceIntPtr dev)
XIRegisterPropertyHandler(dev, EvdevDebugSetProperty,
EvdevDebugGetProperty, NULL);
}
+
+static int
+EvdevBlockSetProperty(DeviceIntPtr dev, Atom atom,
+ XIPropertyValuePtr val, BOOL checkonly)
+{
+ InputInfoPtr pInfo = dev->public.devicePrivate;
+ EvdevPtr pEvdev = pInfo->private;
+
+ if (atom == block_read_prop) {
+ if (val->type != XA_INTEGER || val->format != 8 || val->size != 1)
+ return BadMatch;
+
+ if (!checkonly)
+ pEvdev->block_input = *(BOOL *)val->data;
+ }
+ return Success;
+}
+
+void
+EvdevBlockInitProperty(DeviceIntPtr dev)
+{
+ InputInfoPtr pInfo = dev->public.devicePrivate;
+ EvdevPtr pEvdev = pInfo->private;
+
+ block_read_prop = MakeAtom(XI_PROP_BLOCK_READ_INPUT,
+ strlen(XI_PROP_BLOCK_READ_INPUT), TRUE);
+
+ pEvdev->block_input = FALSE;
+
+ XIChangeDeviceProperty(dev, block_read_prop, XA_INTEGER,
+ /* format */ 8, PropModeReplace, /* size */ 1,
+ &pEvdev->block_input, FALSE);
+ XISetDevicePropertyDeletable(dev, block_read_prop, FALSE);
+ XIRegisterPropertyHandler(dev, EvdevBlockSetProperty, NULL, NULL);
+}
diff --git a/src/evdev.c b/src/evdev.c
index f2cba5e..dc4b6b1 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -1573,11 +1573,14 @@ EvdevReadInput(InputInfoPtr pInfo)
struct input_event ev[NUM_EVENTS];
int i, len = sizeof(ev);
BOOL sync_evdev_state = FALSE;
+ EvdevPtr pEvdev = pInfo->private;
+
+ if (pEvdev->block_input)
+ return;
while (len == sizeof(ev))
{
#ifdef MULTITOUCH
- EvdevPtr pEvdev = pInfo->private;
if (pEvdev->mtdev)
len = mtdev_get(pEvdev->mtdev, pInfo->fd, ev, NUM_EVENTS) *
@@ -2366,6 +2369,7 @@ EvdevInit(DeviceIntPtr device)
EvdevAppleInitProperty(device);
EvdevDebugAllocateBuffer(pEvdev);
EvdevDebugInitProperty(device);
+ EvdevBlockInitProperty(device);
return Success;
}
diff --git a/src/evdev.h b/src/evdev.h
index 38beb98..6ce774e 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -291,6 +291,8 @@ typedef struct {
BOOL scroll_axes;
EvdevRelWheelRec wheel; /* scroll state for REL_WHEEL */
EvdevRelWheelRec hwheel; /* scroll state for REL_HWHEEL */
+
+ BOOL block_input; /* block read for SYN_DROPPED test */
} EvdevRec, *EvdevPtr;
typedef struct {
@@ -352,8 +354,11 @@ void Evdev3BEmuInitProperty(DeviceIntPtr);
void EvdevWheelEmuInitProperty(DeviceIntPtr);
void EvdevDragLockInitProperty(DeviceIntPtr);
void EvdevAppleInitProperty(DeviceIntPtr);
+
+/* For debugging and testing */
void EvdevDebugInitProperty(DeviceIntPtr);
void EvdevDebugAllocateBuffer(EvdevPtr);
void EvdevDebugFreeBuffer(EvdevPtr);
+void EvdevBlockInitProperty(DeviceIntPtr);
#endif
--
1.8.1.5