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>
This commit is contained in:
Marcin Slusarz 2012-05-21 21:39:43 +02:00 committed by Peter Hutterer
parent 9bc53d8cb0
commit 2d4fda4b09

View File

@ -1059,26 +1059,24 @@ xf86PostMotionEventP(DeviceIntPtr device,
xf86PostMotionEventM(device, is_absolute, &mask); xf86PostMotionEventM(device, is_absolute, &mask);
} }
void static int
xf86PostMotionEventM(DeviceIntPtr device, xf86CheckMotionEvent4DGA(DeviceIntPtr device, int is_absolute,
int is_absolute, const ValuatorMask *mask) const ValuatorMask *mask)
{ {
int flags = 0; int stolen = 0;
if (valuator_mask_num_valuators(mask) > 0) {
if (is_absolute)
flags = POINTER_ABSOLUTE;
else
flags = POINTER_RELATIVE | POINTER_ACCELERATE;
}
#if XFreeXDGA #if XFreeXDGA
ScreenPtr scr = NULL;
int idx, i;
/* The evdev driver may not always send all axes across. */ /* The evdev driver may not always send all axes across. */
if (valuator_mask_isset(mask, 0) || valuator_mask_isset(mask, 1)) if (valuator_mask_isset(mask, 0) || valuator_mask_isset(mask, 1)) {
if (miPointerGetScreen(device)) { scr = miPointerGetScreen(device);
int index = miPointerGetScreen(device)->myNum; if (scr) {
int dx = 0, dy = 0; int dx = 0, dy = 0;
idx = scr->myNum;
if (valuator_mask_isset(mask, 0)) { if (valuator_mask_isset(mask, 0)) {
dx = valuator_mask_get(mask, 0); dx = valuator_mask_get(mask, 0);
if (is_absolute) if (is_absolute)
@ -1091,11 +1089,75 @@ xf86PostMotionEventM(DeviceIntPtr device,
dy -= device->last.valuators[1]; dy -= device->last.valuators[1];
} }
if (DGAStealMotionEvent(device, index, dx, dy)) if (DGAStealMotionEvent(device, idx, dx, dy))
return; 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 #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); QueuePointerEvents(device, MotionNotify, 0, flags, mask);
} }