From f1989bb7292fc5b5c2c34587291e5b2a1a2830e1 Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Sat, 11 Feb 2012 04:47:54 +1000
Subject: [PATCH] 
 xserver-1.12-dix-reset-last.scroll-when-resetting-the-valuator-45.patch:
 reset last.scroll on the device whenever the slave device switched to avoid
 jumps during scrolling (#788632).

---
 xorg-x11-server.spec                          | 10 +++-
 ...croll-when-resetting-the-valuator-45.patch | 47 +++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)
 create mode 100644 xserver-1.12-dix-reset-last.scroll-when-resetting-the-valuator-45.patch

diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec
index 0618c51..d0f6044 100644
--- a/xorg-x11-server.spec
+++ b/xorg-x11-server.spec
@@ -48,7 +48,7 @@
 Summary:   X.Org X11 X server
 Name:      xorg-x11-server
 Version:   1.11.99.901
-Release:   3%{?gitdate:.%{gitdate}}%{dist}
+Release:   4%{?gitdate:.%{gitdate}}%{dist}
 URL:       http://www.x.org
 License:   MIT
 Group:     User Interface/X
@@ -102,6 +102,9 @@ Patch7007: xserver-1.10.99.1-test.patch
 # RedHat/Fedora-specific patch
 Patch7013: xserver-1.12-Xext-fix-selinux-build-failure.patch
 
+# Bug 788632 - all scrolled windows jump up one page after you middle click a link
+Patch7014: xserver-1.12-dix-reset-last.scroll-when-resetting-the-valuator-45.patch
+
 %define moduledir	%{_libdir}/xorg/modules
 %define drimoduledir	%{_libdir}/dri
 %define sdkdir		%{_includedir}/xorg
@@ -557,6 +560,11 @@ rm -rf $RPM_BUILD_ROOT
 %{xserver_source_dir}
 
 %changelog
+* Sat Feb 11 2012 Peter Hutterer <peter.hutterer@redhat.com> 1.11.99.901-4.20120124
+- xserver-1.12-dix-reset-last.scroll-when-resetting-the-valuator-45.patch:
+  reset last.scroll on the device whenever the slave device switched to
+  avoid jumps during scrolling (#788632).
+
 * Tue Jan 24 2012 Peter Hutterer <peter.hutterer@redhat.com> 1.11.99.901-3.20120124
 - Today's git snapshot
 - xserver-1.12-xaa-sdk-headers.patch: drop, a55214d11916b
diff --git a/xserver-1.12-dix-reset-last.scroll-when-resetting-the-valuator-45.patch b/xserver-1.12-dix-reset-last.scroll-when-resetting-the-valuator-45.patch
new file mode 100644
index 0000000..61199f3
--- /dev/null
+++ b/xserver-1.12-dix-reset-last.scroll-when-resetting-the-valuator-45.patch
@@ -0,0 +1,47 @@
+From 6538a7d96844526516dd76ec5c4159abfb56cefe Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Sat, 11 Feb 2012 01:29:26 +1000
+Subject: [PATCH] dix: reset last.scroll when resetting the valuator (#45611)
+
+last.scroll remained on the last-submitted scrolling value but last.valuator
+was changed whenever the slave device changed. The first scrolling delta
+after a switch was then calculated as (last.scroll - new abs value), causing
+erroneous scrolling events.
+
+Test case:
+- synaptics with a scrolling method enabled, other device with 3+ axes (e.g.
+  wacom)
+- scroll on touchpad
+- use other device
+- scroll on touchpad
+
+The second scroll caused erroneous button press/release events.
+
+X.Org Bug 45611 <http://bugs.freedesktop.org/show_bug.cgi?id=45611>
+---
+ dix/getevents.c |    2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/dix/getevents.c b/dix/getevents.c
+index 7678aa1..6ea4ba0 100644
+--- a/dix/getevents.c
++++ b/dix/getevents.c
+@@ -360,6 +360,7 @@ updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev)
+             if (i >= lastSlave->valuator->numAxes)
+             {
+                 pDev->last.valuators[i] = 0;
++                valuator_mask_set_double(pDev->last.scroll, i, 0);
+             }
+             else
+             {
+@@ -367,6 +368,7 @@ updateSlaveDeviceCoords(DeviceIntPtr master, DeviceIntPtr pDev)
+                 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);
+             }
+         }
+     }
+-- 
+1.7.7.5
+