summaryrefslogtreecommitdiff
path: root/src/evdev.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-02-24 10:36:41 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-02-26 09:11:14 +1000
commit43dd2a959243877c1628a08b4fc6c07c9ae6bac0 (patch)
treeeaf0322b312de6619bc57dbdda6268e934f17030 /src/evdev.c
parent7977947e0df6ea6379dab76805b06be6bdd71947 (diff)
Pass on all relative events, not just x/y.
9620fe776 added generic axes support for relativ values, but values from such axes didn't get passed on to the server. Fix this. Note that wheel events are not posted as motion events. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'src/evdev.c')
-rw-r--r--src/evdev.c61
1 files changed, 40 insertions, 21 deletions
diff --git a/src/evdev.c b/src/evdev.c
index c9fd53b..7112c11 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -338,8 +338,9 @@ EvdevReopenTimer(OsTimerPtr timer, CARD32 time, pointer arg)
static void
EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
{
- static int dx, dy, tmp, value;
- static unsigned int abs;
+ static int delta[REL_CNT];
+ static int tmp, value;
+ static unsigned int abs, rel;
unsigned int button;
EvdevPtr pEvdev = pInfo->private;
@@ -352,15 +353,9 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
if (EvdevWheelEmuFilterMotion(pInfo, ev))
break;
- switch (ev->code) {
- case REL_X:
- dx += value;
- break;
-
- case REL_Y:
- dy += value;
- break;
+ rel = 1;
+ switch (ev->code) {
case REL_WHEEL:
if (value > 0)
PostButtonClicks(pInfo, wheel_up_button, value);
@@ -375,6 +370,11 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
else if (value < 0)
PostButtonClicks(pInfo, wheel_left_button, -value);
break;
+
+ /* We don't post wheel events as axis motion. */
+ default:
+ delta[ev->code] += value;
+ break;
}
break;
@@ -436,9 +436,9 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
abs = 0;
if (pEvdev->tool) { /* meaning, touch is active */
if (pEvdev->old_vals[0] != -1)
- dx = pEvdev->vals[0] - pEvdev->old_vals[0];
+ delta[REL_X] = pEvdev->vals[0] - pEvdev->old_vals[0];
if (pEvdev->old_vals[1] != -1)
- dy = pEvdev->vals[1] - pEvdev->old_vals[1];
+ delta[REL_Y] = pEvdev->vals[1] - pEvdev->old_vals[1];
pEvdev->old_vals[0] = pEvdev->vals[0];
pEvdev->old_vals[1] = pEvdev->vals[1];
} else {
@@ -446,17 +446,36 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
}
}
- if (dx != 0 || dy != 0) {
+ if (rel) {
+ int post_deltas[REL_CNT] = {0}; /* axis-mapped deltas */
+ int first = REL_CNT, last = 0;
+ int i;
+
if (pEvdev->swap_axes) {
- tmp = dx;
- dx = dy;
- dy = tmp;
+ tmp = delta[REL_X];
+ delta[REL_X] = delta[REL_Y];
+ delta[REL_Y] = tmp;
}
if (pEvdev->invert_x)
- dx *= -1;
+ delta[REL_X] *= -1;
if (pEvdev->invert_y)
- dy *= -1;
- xf86PostMotionEvent(pInfo->dev, FALSE, 0, 2, dx, dy);
+ delta[REL_Y] *= -1;
+
+ for (i = 0; i < REL_CNT; i++)
+ {
+ int map = pEvdev->axis_map[i];
+ if (delta[i] && map != -1)
+ {
+ post_deltas[map] = delta[i];
+ if (map < first)
+ first = map;
+ if (map > last)
+ last = map;
+ }
+ }
+
+ xf86PostMotionEventP(pInfo->dev, FALSE, first,
+ (last - first + 1), &post_deltas[first]);
}
/*
@@ -500,10 +519,10 @@ EvdevProcessEvent(InputInfoPtr pInfo, struct input_event *ev)
xf86PostMotionEventP(pInfo->dev, TRUE, 0, pEvdev->num_vals, v);
}
- dx = 0;
- dy = 0;
+ memset(delta, 0, sizeof(delta));
tmp = 0;
abs = 0;
+ rel = 0;
}
}