|
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 |
|