Peter Hutterer 324f637
From 13f9b07039484927532d913dbccc664679235bf6 Mon Sep 17 00:00:00 2001
Peter Hutterer 324f637
From: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer 324f637
Date: Mon, 25 Mar 2019 13:19:41 +1000
Peter Hutterer 324f637
Subject: [PATCH xserver] dix: leave last.valuators alone on slave switch
Peter Hutterer 324f637
Peter Hutterer 324f637
Terms:
Peter Hutterer 324f637
dev->last.valuator[] is the last value given to us by the driver
Peter Hutterer 324f637
dev->valuator.axisVal[] is the last value sent to the client
Peter Hutterer 324f637
dev->last.scroll[] is the abs value of the scroll axis as given by the driver,
Peter Hutterer 324f637
        used for button emulation calculation (and the remainder)
Peter Hutterer 324f637
Peter Hutterer 324f637
This function updates the device's last.valuator state based on the current
Peter Hutterer 324f637
master axis state. This way, relative motion continues fluidly when switching
Peter Hutterer 324f637
between devices. Before mouse 2 comes into effect, it's valuator state is
Peter Hutterer 324f637
updated to wherever the pointer currently is so the relative event applies on
Peter Hutterer 324f637
top of that.
Peter Hutterer 324f637
Peter Hutterer 324f637
This can only work for x/y axes, all other axes aren't guaranteed to have the
Peter Hutterer 324f637
same meaning and/or may not be present:
Peter Hutterer 324f637
- xtest device: no valuator 2
Peter Hutterer 324f637
- mouse: valuator 2 is horizontal scroll axis
Peter Hutterer 324f637
- tablet: valuator 2 is pressure
Peter Hutterer 324f637
Peter Hutterer 324f637
Scaling the current value from the pressure range into the range for
Peter Hutterer 324f637
horizontal scrolling makes no sense. And it causes scroll jumps:
Peter Hutterer 324f637
Peter Hutterer 324f637
- scroll down, last.valuator == axisVal == 20
Peter Hutterer 324f637
- xdotool click 1, the XTest device doesn't have that valuator
Peter Hutterer 324f637
- scroll up
Peter Hutterer 324f637
  - updateSlaveDeviceCoords reset last.valuator to 0 (axisVal == 20)
Peter Hutterer 324f637
  - DeviceClassesChangedEvent includes value 20 for the axis
Peter Hutterer 324f637
  - event is processed, last.value changes from 0 to -1
Peter Hutterer 324f637
  - axisVal is updated to -1, causing a jump of -21
Peter Hutterer 324f637
Peter Hutterer 324f637
The same applies when we switch from tablet to mouse wheel if the pressure
Peter Hutterer 324f637
value is 0 on proximity out (basically guaranteed). So let's drop this code
Peter Hutterer 324f637
altogether and only leave the scaling for the relative x/y motion.
Peter Hutterer 324f637
Peter Hutterer 324f637
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer 324f637
---
Peter Hutterer 324f637
 dix/getevents.c | 25 +------------------------
Peter Hutterer 324f637
 1 file changed, 1 insertion(+), 24 deletions(-)
Peter Hutterer 324f637
Peter Hutterer 324f637
diff --git a/dix/getevents.c b/dix/getevents.c
Peter Hutterer 324f637
index d8955969a..f83dac709 100644
Peter Hutterer 324f637
--- a/dix/getevents.c
Peter Hutterer 324f637
+++ b/dix/getevents.c
Peter Hutterer 324f637
@@ -331,9 +331,6 @@ rescaleValuatorAxis(double coord, AxisInfoPtr from, AxisInfoPtr to,
Peter Hutterer 324f637
 static void
Peter Hutterer 324f637
 updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev)
Peter Hutterer 324f637
 {
Peter Hutterer 324f637
-    int i;
Peter Hutterer 324f637
-    DeviceIntPtr lastSlave;
Peter Hutterer 324f637
-
Peter Hutterer 324f637
     /* master->last.valuators[0]/[1] is in desktop-wide coords and the actual
Peter Hutterer 324f637
      * position of the pointer */
Peter Hutterer 324f637
     pDev->last.valuators[0] = master->last.valuators[0];
Peter Hutterer 324f637
@@ -358,27 +355,7 @@ updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev)
Peter Hutterer 324f637
                                                       screenInfo.height);
Peter Hutterer 324f637
     }
Peter Hutterer 324f637
 
Peter Hutterer 324f637
-    /* calculate the other axis as well based on info from the old
Peter Hutterer 324f637
-     * slave-device. If the old slave had less axes than this one,
Peter Hutterer 324f637
-     * last.valuators is reset to 0.
Peter Hutterer 324f637
-     */
Peter Hutterer 324f637
-    if ((lastSlave = master->last.slave) && lastSlave->valuator) {
Peter Hutterer 324f637
-        for (i = 2; i < pDev->valuator->numAxes; i++) {
Peter Hutterer 324f637
-            if (i >= lastSlave->valuator->numAxes) {
Peter Hutterer 324f637
-                pDev->last.valuators[i] = 0;
Peter Hutterer 324f637
-                valuator_mask_set_double(pDev->last.scroll, i, 0);
Peter Hutterer 324f637
-            }
Peter Hutterer 324f637
-            else {
Peter Hutterer 324f637
-                double val = pDev->last.valuators[i];
Peter Hutterer 324f637
-
Peter Hutterer 324f637
-                val = rescaleValuatorAxis(val, lastSlave->valuator->axes + i,
Peter Hutterer 324f637
-                                          pDev->valuator->axes + i, 0, 0);
Peter Hutterer 324f637
-                pDev->last.valuators[i] = val;
Peter Hutterer 324f637
-                valuator_mask_set_double(pDev->last.scroll, i, val);
Peter Hutterer 324f637
-            }
Peter Hutterer 324f637
-        }
Peter Hutterer 324f637
-    }
Peter Hutterer 324f637
-
Peter Hutterer 324f637
+    /* other axes are left as-is */
Peter Hutterer 324f637
 }
Peter Hutterer 324f637
 
Peter Hutterer 324f637
 /**
Peter Hutterer 324f637
-- 
Peter Hutterer 324f637
2.20.1
Peter Hutterer 324f637