summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-08-13 10:27:16 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-08-14 10:00:31 +1000
commit36064dca9097df896b4b1b49c9c68775f1728846 (patch)
tree2ef0b03768e1e414917206b75c74502999c535c8
parent8bf93709cbcf9f041cd177e929ff46adce8a6b79 (diff)
Add EvdevPostButtonEvent API to immediately post a button event (#23269)
The wheel emulation code needs this API. When the timer expires, the event must be posted immediately, not enqueued onto the internal event queue. Otherwise, the emulated middle button press is enqueued only and no event is sent until the next physical event (and its EV_SYN) arrives. Since the timer is triggered outside of the SIGIO and SIGIO is blocked during this period anyway, we could also just enqueue the event and flush by simulating an EV_SYN. It's easier this way though. X.Org Bug 23269 <http://bugs.freedesktop.org/show_bug.cgi?id=23269> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Acked-by: Oliver McFadden <oliver.mcfadden@nokia.com>
-rw-r--r--src/emuMB.c2
-rw-r--r--src/evdev.c10
-rw-r--r--src/evdev.h1
3 files changed, 12 insertions, 1 deletions
diff --git a/src/emuMB.c b/src/emuMB.c
index ac763cd..199c0d7 100644
--- a/src/emuMB.c
+++ b/src/emuMB.c
@@ -198,7 +198,7 @@ EvdevMBEmuTimer(InputInfoPtr pInfo)
pEvdev->emulateMB.pending = FALSE;
if ((id = stateTab[pEvdev->emulateMB.state][4][0]) != 0) {
- EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
+ EvdevPostButtonEvent(pInfo, abs(id), (id >= 0));
pEvdev->emulateMB.state =
stateTab[pEvdev->emulateMB.state][4][2];
} else {
diff --git a/src/evdev.c b/src/evdev.c
index b653311..9c3a990 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -316,6 +316,16 @@ EvdevQueueButtonEvent(InputInfoPtr pInfo, int button, int value)
pEvdev->num_queue++;
}
+/**
+ * Post button event right here, right now.
+ * Interface for MB emulation since these need to post immediately.
+ */
+void
+EvdevPostButtonEvent(InputInfoPtr pInfo, int button, int value)
+{
+ xf86PostButtonEvent(pInfo->dev, 0, button, value, 0, 0);
+}
+
void
EvdevQueueButtonClicks(InputInfoPtr pInfo, int button, int count)
{
diff --git a/src/evdev.h b/src/evdev.h
index a4a1064..38adeaf 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -183,6 +183,7 @@ typedef struct {
/* Event posting functions */
void EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value);
void EvdevQueueButtonEvent(InputInfoPtr pInfo, int button, int value);
+void EvdevPostButtonEvent(InputInfoPtr pInfo, int button, int value);
void EvdevQueueButtonClicks(InputInfoPtr pInfo, int button, int count);
void EvdevPostRelativeMotionEvents(InputInfoPtr pInfo, int *num_v, int *first_v,
int v[MAX_VALUATORS]);