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 came with motion events are lost and separate mouse wheel events are handled through non-DGA path.
Signed-off-by: Marcin Slusarz <[email protected]> --- hw/xfree86/common/xf86Xinput.c | 77 ++++++++++++++++++++++++++++++++-------- 1 files changed, 62 insertions(+), 15 deletions(-) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index d246d2a..bf615ad 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -1059,24 +1059,16 @@ xf86PostMotionEventP(DeviceIntPtr device, xf86PostMotionEventM(device, is_absolute, &mask); } -void -xf86PostMotionEventM(DeviceIntPtr device, - int is_absolute, const ValuatorMask *mask) +#if XFreeXDGA +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 /* 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; + int idx = miPointerGetScreen(device)->myNum; int dx = 0, dy = 0; if (valuator_mask_isset(mask, 0)) { @@ -1091,11 +1083,66 @@ xf86PostMotionEventM(DeviceIntPtr device, dy -= device->last.valuators[1]; } - if (DGAStealMotionEvent(device, index, dx, dy)) - return; + if (DGAStealMotionEvent(device, idx, dx, dy)) + stolen = 1; + } + + if (valuator_mask_isset(mask, 2)) + if (miPointerGetScreen(device)) { + int idx = miPointerGetScreen(device)->myNum; + + if (valuator_mask_get(mask, 2) > 0) { + if (DGAStealButtonEvent(device, idx, 4, 1) && + DGAStealButtonEvent(device, idx, 4, 0)) + stolen = 1; + } else { + if (DGAStealButtonEvent(device, idx, 5, 1) && + DGAStealButtonEvent(device, idx, 5, 0)) + stolen = 1; + } + } + + if (valuator_mask_isset(mask, 3)) + if (miPointerGetScreen(device)) { + int idx = miPointerGetScreen(device)->myNum; + + if (valuator_mask_get(mask, 3) > 0) { + if (DGAStealButtonEvent(device, idx, 7, 1) && + DGAStealButtonEvent(device, idx, 7, 0)) + stolen = 1; + } else { + if (DGAStealButtonEvent(device, idx, 6, 1) && + DGAStealButtonEvent(device, idx, 6, 0)) + stolen = 1; + } } + + return stolen; +} +#else +static int xf86CheckMotionEvent4DGA(DeviceIntPtr device, int is_absolute, + const ValuatorMask *mask) +{ + return 0; +} #endif +void +xf86PostMotionEventM(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; + } + + if (xf86CheckMotionEvent4DGA(device, is_absolute, mask)) + return; + QueuePointerEvents(device, MotionNotify, 0, flags, mask); } -- 1.7.8.6 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
