summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Slusarz <marcin.slusarz@gmail.com>2012-05-21 21:39:43 +0200
committerPeter Hutterer <peter.hutterer@who-t.net>2012-06-05 12:10:29 +1000
commitf4a1ecb9280570c473631760885cc2afb5d174b9 (patch)
treec591b396b75dc9c86eb0635155dda8726f050ead
parent889ce06946b8c1a246130a899e2702a3d7340fd2 (diff)
xfree86: fix mouse wheel support for DGA clients
xf86-input-evdev (since "smooth scrolling" support was added) can send mouse motion and wheel events in one batch, so we need to handle it properly. Otherwise mouse wheel events which come with motion events are lost and separate mouse wheel events are handled through non-DGA path. Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> (cherry picked from commit 2d4fda4b09e67e47d3e6fc4743fc6e81bfe40f28)
-rw-r--r--hw/xfree86/common/xf86Xinput.c94
1 files changed, 78 insertions, 16 deletions
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 77b800000..bee407bf9 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -1059,26 +1059,24 @@ xf86PostMotionEventP(DeviceIntPtr device,
xf86PostMotionEventM(device, is_absolute, &mask);
}
-void
-xf86PostMotionEventM(DeviceIntPtr device,
- int is_absolute, const ValuatorMask *mask)
+static int
+xf86CheckMotionEvent4DGA(DeviceIntPtr device, int is_absolute,
+ const ValuatorMask *mask)
{
- int flags = 0;
-
- if (valuator_mask_num_valuators(mask) > 0) {
- if (is_absolute)
- flags = POINTER_ABSOLUTE;
- else
- flags = POINTER_RELATIVE | POINTER_ACCELERATE;
- }
+ int stolen = 0;
#if XFreeXDGA
+ ScreenPtr scr = NULL;
+ int idx, i;
+
/* The evdev driver may not always send all axes across. */
- if (valuator_mask_isset(mask, 0) || valuator_mask_isset(mask, 1))
- if (miPointerGetScreen(device)) {
- int index = miPointerGetScreen(device)->myNum;
+ if (valuator_mask_isset(mask, 0) || valuator_mask_isset(mask, 1)) {
+ scr = miPointerGetScreen(device);
+ if (scr) {
int dx = 0, dy = 0;
+ idx = scr->myNum;
+
if (valuator_mask_isset(mask, 0)) {
dx = valuator_mask_get(mask, 0);
if (is_absolute)
@@ -1091,11 +1089,75 @@ xf86PostMotionEventM(DeviceIntPtr device,
dy -= device->last.valuators[1];
}
- if (DGAStealMotionEvent(device, index, dx, dy))
- return;
+ if (DGAStealMotionEvent(device, idx, dx, dy))
+ stolen = 1;
+ }
+ }
+
+ for (i = 2; i < valuator_mask_size(mask); i++) {
+ AxisInfoPtr ax;
+ double incr;
+ int val, button;
+
+ if (i >= device->valuator->numAxes)
+ break;
+
+ if (!valuator_mask_isset(mask, i))
+ continue;
+
+ ax = &device->valuator->axes[i];
+
+ if (ax->scroll.type == SCROLL_TYPE_NONE)
+ continue;
+
+ if (!scr) {
+ scr = miPointerGetScreen(device);
+ if (!scr)
+ break;
+ idx = scr->myNum;
+ }
+
+ incr = ax->scroll.increment;
+ val = valuator_mask_get(mask, i);
+
+ if (ax->scroll.type == SCROLL_TYPE_VERTICAL) {
+ if (incr * val < 0)
+ button = 4; /* up */
+ else
+ button = 5; /* down */
+ } else { /* SCROLL_TYPE_HORIZONTAL */
+ if (incr * val < 0)
+ button = 6; /* left */
+ else
+ button = 7; /* right */
}
+
+ if (DGAStealButtonEvent(device, idx, button, 1) &&
+ DGAStealButtonEvent(device, idx, button, 0))
+ stolen = 1;
+ }
+
#endif
+ return stolen;
+}
+
+void
+xf86PostMotionEventM(DeviceIntPtr device,
+ int is_absolute, const ValuatorMask *mask)
+{
+ int flags = 0;
+
+ if (xf86CheckMotionEvent4DGA(device, is_absolute, mask))
+ return;
+
+ if (valuator_mask_num_valuators(mask) > 0) {
+ if (is_absolute)
+ flags = POINTER_ABSOLUTE;
+ else
+ flags = POINTER_RELATIVE | POINTER_ACCELERATE;
+ }
+
QueuePointerEvents(device, MotionNotify, 0, flags, mask);
}