diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-02-24 10:36:41 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-02-26 09:11:14 +1000 |
commit | 43dd2a959243877c1628a08b4fc6c07c9ae6bac0 (patch) | |
tree | eaf0322b312de6619bc57dbdda6268e934f17030 /src/evdev.c | |
parent | 7977947e0df6ea6379dab76805b06be6bdd71947 (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.c | 61 |
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; } } |