From 43dd2a959243877c1628a08b4fc6c07c9ae6bac0 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 24 Feb 2009 10:36:41 +1000 Subject: 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 --- src/evdev.c | 61 ++++++++++++++++++++++++++++++++++++++++--------------------- 1 file 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; } } -- cgit v1.2.3