winex11.drv: Fixed XInput2 errors with mislabeled mice axis. (try 2)
Christopher Cope
ccope3 at utk.edu
Wed May 1 07:01:18 CDT 2013
The previous patch worked for me, but I made the checking more concrete.
-------------- next part --------------
>From 4f52dfc05c3b3219e9c873230fdb2c919a7d6760 Mon Sep 17 00:00:00 2001
From: Christopher Cope <ccope3 at utk.edu>
Date: Wed, 1 May 2013 07:54:32 -0400
Subject: winex11.drv: Fixed XInput2 errors with mislabeled mice axis.
---
dlls/winex11.drv/mouse.c | 12 ++++++++----
dlls/winex11.drv/x11drv.h | 2 ++
dlls/winex11.drv/x11drv_main.c | 2 ++
3 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 168914f..38aa285 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -286,8 +286,10 @@ static void enable_xinput2(void)
class->number, class->min, class->max, class->resolution, class->mode,
XGetAtomName( data->display, class->label ));
if (class->label == x11drv_atom( Rel_X ) || class->label == x11drv_atom( Rel_Y )) count++;
- /* workaround for drivers that don't provide labels */
- if (!class->label && class->number <= 1 && class->mode == XIModeRelative) count++;
+ /* workaround for drivers that don't provide correct labels */
+ if (((!class->label && class->number <= 1) || class->label == x11drv_atom( Abs_X ) ||
+ class->label == x11drv_atom( Abs_Y ))
+ && class->mode == XIModeRelative) count++;
}
if (count < 2) continue;
TRACE( "Using %u (%s) as core pointer\n",
@@ -1639,7 +1641,8 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
{
double val = *values++;
if (class->label == x11drv_atom( Rel_X ) ||
- (!class->label && class->number == 0 && class->mode == XIModeRelative))
+ (((!class->label && class->number == 0) || class->label == x11drv_atom( Abs_X ))
+ && class->mode == XIModeRelative))
{
input.u.mi.dx = dx = val;
if (class->min < class->max)
@@ -1647,7 +1650,8 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
/ (class->max - class->min);
}
else if (class->label == x11drv_atom( Rel_Y ) ||
- (!class->label && class->number == 1 && class->mode == XIModeRelative))
+ (((!class->label && class->number == 1) || class->label == x11drv_atom( Abs_Y ))
+ && class->mode == XIModeRelative))
{
input.u.mi.dy = dy = val;
if (class->min < class->max)
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index bfcea89..440dc1e 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -407,6 +407,8 @@ enum x11drv_atoms
XATOM_RAW_CAP_HEIGHT,
XATOM_Rel_X,
XATOM_Rel_Y,
+ XATOM_Abs_X,
+ XATOM_Abs_Y,
XATOM_WM_PROTOCOLS,
XATOM_WM_DELETE_WINDOW,
XATOM_WM_STATE,
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 329fea5..ce5fd6a 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -120,6 +120,8 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
"RAW_CAP_HEIGHT",
"Rel X",
"Rel Y",
+ "Abs X",
+ "Abs Y",
"WM_PROTOCOLS",
"WM_DELETE_WINDOW",
"WM_STATE",
--
1.7.9
More information about the wine-patches
mailing list