diff --git a/0001-dix-leave-last.valuators-alone-on-slave-switch.patch b/0001-dix-leave-last.valuators-alone-on-slave-switch.patch new file mode 100644 index 0000000..10c7177 --- /dev/null +++ b/0001-dix-leave-last.valuators-alone-on-slave-switch.patch @@ -0,0 +1,89 @@ +From 13f9b07039484927532d913dbccc664679235bf6 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Mon, 25 Mar 2019 13:19:41 +1000 +Subject: [PATCH xserver] dix: leave last.valuators alone on slave switch + +Terms: +dev->last.valuator[] is the last value given to us by the driver +dev->valuator.axisVal[] is the last value sent to the client +dev->last.scroll[] is the abs value of the scroll axis as given by the driver, + used for button emulation calculation (and the remainder) + +This function updates the device's last.valuator state based on the current +master axis state. This way, relative motion continues fluidly when switching +between devices. Before mouse 2 comes into effect, it's valuator state is +updated to wherever the pointer currently is so the relative event applies on +top of that. + +This can only work for x/y axes, all other axes aren't guaranteed to have the +same meaning and/or may not be present: +- xtest device: no valuator 2 +- mouse: valuator 2 is horizontal scroll axis +- tablet: valuator 2 is pressure + +Scaling the current value from the pressure range into the range for +horizontal scrolling makes no sense. And it causes scroll jumps: + +- scroll down, last.valuator == axisVal == 20 +- xdotool click 1, the XTest device doesn't have that valuator +- scroll up + - updateSlaveDeviceCoords reset last.valuator to 0 (axisVal == 20) + - DeviceClassesChangedEvent includes value 20 for the axis + - event is processed, last.value changes from 0 to -1 + - axisVal is updated to -1, causing a jump of -21 + +The same applies when we switch from tablet to mouse wheel if the pressure +value is 0 on proximity out (basically guaranteed). So let's drop this code +altogether and only leave the scaling for the relative x/y motion. + +Signed-off-by: Peter Hutterer +--- + dix/getevents.c | 25 +------------------------ + 1 file changed, 1 insertion(+), 24 deletions(-) + +diff --git a/dix/getevents.c b/dix/getevents.c +index d8955969a..f83dac709 100644 +--- a/dix/getevents.c ++++ b/dix/getevents.c +@@ -331,9 +331,6 @@ rescaleValuatorAxis(double coord, AxisInfoPtr from, AxisInfoPtr to, + static void + updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev) + { +- int i; +- DeviceIntPtr lastSlave; +- + /* master->last.valuators[0]/[1] is in desktop-wide coords and the actual + * position of the pointer */ + pDev->last.valuators[0] = master->last.valuators[0]; +@@ -358,27 +355,7 @@ updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev) + screenInfo.height); + } + +- /* calculate the other axis as well based on info from the old +- * slave-device. If the old slave had less axes than this one, +- * last.valuators is reset to 0. +- */ +- if ((lastSlave = master->last.slave) && lastSlave->valuator) { +- for (i = 2; i < pDev->valuator->numAxes; i++) { +- if (i >= lastSlave->valuator->numAxes) { +- pDev->last.valuators[i] = 0; +- valuator_mask_set_double(pDev->last.scroll, i, 0); +- } +- else { +- double val = pDev->last.valuators[i]; +- +- val = rescaleValuatorAxis(val, lastSlave->valuator->axes + i, +- pDev->valuator->axes + i, 0, 0); +- pDev->last.valuators[i] = val; +- valuator_mask_set_double(pDev->last.scroll, i, val); +- } +- } +- } +- ++ /* other axes are left as-is */ + } + + /** +-- +2.20.1 + diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index da6af0b..0c99958 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -46,7 +46,7 @@ Summary: X.Org X11 X server Name: xorg-x11-server Version: 1.20.4 -Release: 2%{?gitdate:.%{gitdate}}%{?dist} +Release: 3%{?gitdate:.%{gitdate}}%{?dist} URL: http://www.x.org License: MIT @@ -96,6 +96,9 @@ Patch6: 0001-Fedora-hack-Make-the-suid-root-wrapper-always-start-.patch Patch10: 0001-xwayland-present-Destroy-sync_callback-in-xwl_presen.patch +# https://gitlab.freedesktop.org/xorg/xserver/merge_requests/152 +Patch11: 0001-dix-leave-last.valuators-alone-on-slave-switch.patch + BuildRequires: systemtap-sdt-devel BuildRequires: git BuildRequires: automake autoconf libtool pkgconfig @@ -520,6 +523,9 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete %changelog +* Wed Mar 27 2019 Peter Hutterer 1.20.4-3 +- Fix a Qt scrolling bug, don't reset the valuator on slave switch + * Thu Mar 21 2019 Adam Jackson - 1.20.4-2 - Backport an Xwayland crash fix in the Present code