Add new version of the resolution-based scaling patch - scale y down

instead of x up. That gives almost the same behaviour as current
  synaptics. Drop the synaptics quirk, this needs to be now removed from the
  driver.
This commit is contained in:
Peter Hutterer 2013-07-19 13:26:07 +10:00
parent 0e1e01a399
commit 045334d639
3 changed files with 86 additions and 20 deletions

View File

@ -0,0 +1,74 @@
From 9d3cf2e519291f1931fb25ef6a3b2c609e48a787 Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Fri, 19 Jul 2013 08:56:38 +1000
Subject: [PATCH] dix: scale y back instead of x up when pre-scaling
coordinates
The peculiar way we handle coordinates results in relative coordinates on
absolute devices being added to the last value, then that value is mapped to
the screen (taking the device dimensions into account). From that mapped
value we get the final coordinates, both screen and device coordinates.
To avoid uneven scaling on relative coordinates, they are pre-scaled by
screen ratio:resolution:device ratio factor before being mapped. This
ensures that a circle drawn on the device is a circle on the screen.
Previously, we used the ratio to scale x up. Synaptics already does its own
scaling based on the resolution and that is done by scaling y down by the
ratio. So we can remove the code from the driver and get approximately the
same behaviour here.
Minor ABI bump, so we can remove this from synaptics.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
---
dix/getevents.c | 6 +++---
hw/xfree86/common/xf86Module.h | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/dix/getevents.c b/dix/getevents.c
index 51d4fd4..f5ab8c4 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -773,7 +773,7 @@ add_to_scroll_valuator(DeviceIntPtr dev, ValuatorMask *mask, int valuator, doubl
static void
scale_for_device_resolution(DeviceIntPtr dev, ValuatorMask *mask)
{
- double x;
+ double y;
ValuatorClassPtr v = dev->valuator;
int xrange = v->axes[0].max_value - v->axes[0].min_value + 1;
int yrange = v->axes[1].max_value - v->axes[1].min_value + 1;
@@ -783,14 +783,14 @@ scale_for_device_resolution(DeviceIntPtr dev, ValuatorMask *mask)
double resolution_ratio = 1.0;
double ratio;
- if (!valuator_mask_fetch_double(mask, 0, &x))
+ if (!valuator_mask_fetch_double(mask, 1, &y))
return;
if (v->axes[0].resolution != 0 && v->axes[1].resolution != 0)
resolution_ratio = 1.0 * v->axes[0].resolution/v->axes[1].resolution;
ratio = device_ratio/resolution_ratio/screen_ratio;
- valuator_mask_set_double(mask, 0, x * ratio);
+ valuator_mask_set_double(mask, 1, y / ratio);
}
/**
diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index 1393427..e0cec05 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -81,7 +81,7 @@ typedef enum {
*/
#define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4)
#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(14, 1)
-#define ABI_XINPUT_VERSION SET_ABI_VERSION(19, 1)
+#define ABI_XINPUT_VERSION SET_ABI_VERSION(19, 2)
#define ABI_EXTENSION_VERSION SET_ABI_VERSION(7, 0)
#define ABI_FONT_VERSION SET_ABI_VERSION(0, 6)
--
1.8.2.1

View File

@ -52,20 +52,3 @@ Section "InputClass"
MatchDriver "evdev"
Option "TypeName" "MOUSE"
EndSection
# synaptics resolution and axis dimensions are not representative of the
# actual device dimensions, partially because what the kernel exports as
# axis range is the what "fingers of typical size are used on TouchPads
# mounted in typical bezel" produce (synaptics interfacing guide, p 23).
# Even with the axis ranges corrected to what (my) touchpad actually
# produces, the values are even further off, essentially stopping Y
# movement if the server takes resolution into account.
# So for the sake of my sanity, disable synaptics axis resolution by default
# so the server can take the resolution from good devices and use that
# for adjusting movement
Section "InputClass"
Identifier "Synaptics resolution set to 0"
MatchDriver "synaptics"
Option "VertResolution" "0"
Option "HorizResolution" "0"
EndSection

View File

@ -19,7 +19,7 @@
%global videodrv_major 14
%global videodrv_minor 1
%global xinput_major 19
%global xinput_minor 1
%global xinput_minor 2
%global extension_major 7
%global extension_minor 0
%endif
@ -42,7 +42,7 @@
Summary: X.Org X11 X server
Name: xorg-x11-server
Version: 1.14.2
Release: 5%{?gitdate:.%{gitdate}}%{dist}
Release: 6%{?gitdate:.%{gitdate}}%{dist}
URL: http://www.x.org
License: MIT
Group: User Interface/X
@ -105,9 +105,12 @@ Patch7052: 0001-xf86-return-NULL-for-compat-output-if-no-outputs.patch
# mustard: make the default queue length bigger to calm abrt down
Patch7064: 0001-mieq-Bump-default-queue-size-to-512.patch
# scale events from abs devices in relative mode to something useful
Patch8003: 0004-dix-pre-scale-x-by-the-screen-device-resolution-rati.patch
Patch8004: 0005-dix-scale-y-back-instead-of-x-up-when-pre-scaling-co.patch
# touch-grab-race condition bug backports
# https://bugs.freedesktop.org/show_bug.cgi?id=56578
Patch8003: 0004-dix-pre-scale-x-by-the-screen-device-resolution-rati.patch
Patch8005: 0006-Xi-not-having-an-ownership-mask-does-not-mean-automa.patch
Patch8006: 0007-dix-don-t-prepend-an-activated-passive-grab-to-the-l.patch
Patch8007: 0008-Xi-if-we-delivered-a-TouchEnd-to-a-passive-grab-end-.patch
@ -628,6 +631,12 @@ rm -rf $RPM_BUILD_ROOT
%{xserver_source_dir}
%changelog
* Fri Jul 19 2013 Peter Hutterer <peter.hutterer@redhat.com> 1.14.2-6
- Add new version of the resolution-based scaling patch - scale y down
instead of x up. That gives almost the same behaviour as current
synaptics. Drop the synaptics quirk, this needs to be now removed from the
driver.
* Mon Jul 15 2013 Peter Hutterer <peter.hutterer@redhat.com> 1.14.2-5
- Fix logspam when trying to free a non-existant grab.
- Update touch patch to upstream version (from fdo #66720)