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

Reply via email to