[PATCH] input: fix mouse wheel support for DGA clients

Marcin Slusarz marcin.slusarz at gmail.com
Sun May 20 16:16:40 PDT 2012


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 <marcin.slusarz at gmail.com>
---
 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



More information about the xorg-devel mailing list