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