Alexandre Julliard : winex11: Use the labels to find the mouse motion valuators for XInput2.
Alexandre Julliard
julliard at winehq.org
Thu Aug 16 15:26:07 CDT 2012
Module: wine
Branch: master
Commit: ff60249cab238bed124b98a7624ccfe415f8648e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ff60249cab238bed124b98a7624ccfe415f8648e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Aug 15 22:05:07 2012 +0200
winex11: Use the labels to find the mouse motion valuators for XInput2.
---
dlls/winex11.drv/mouse.c | 50 +++++++++++++++++++++------------------
dlls/winex11.drv/x11drv.h | 2 +
dlls/winex11.drv/x11drv_main.c | 2 +
3 files changed, 31 insertions(+), 23 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 369d492..e8ba8e3 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -257,7 +257,7 @@ static void enable_xinput2(void)
XIEventMask mask;
XIDeviceInfo *devices;
unsigned char mask_bits[XIMaskLen(XI_LASTEVENT)];
- int i, j;
+ int i, j, count;
if (!xinput2_available) return;
@@ -279,21 +279,18 @@ static void enable_xinput2(void)
for (i = 0; i < data->xi2_device_count; ++i)
{
if (devices[i].use != XIMasterPointer) continue;
- for (j = 0; j < devices[i].num_classes; j++)
+ for (j = count = 0; j < devices[i].num_classes; j++)
{
XIValuatorClassInfo *class = (XIValuatorClassInfo *)devices[i].classes[j];
if (devices[i].classes[j]->type != XIValuatorClass) continue;
- if (class->number != 0 && class->number != 1) continue;
- TRACE( "Device %u (%s) class %u num %u %f,%f res %u mode %u\n",
+ TRACE( "Device %u (%s) num %u %f,%f res %u mode %u label %s\n",
devices[i].deviceid, debugstr_a(devices[i].name),
- j, class->number, class->min, class->max, class->resolution, class->mode );
- if (class->mode == XIModeAbsolute)
- {
- TRACE( "Device is absolute, not enabling XInput2\n" );
- goto done;
- }
+ 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++;
}
+ if (count < 2) continue;
TRACE( "Using %u (%s) as core pointer\n",
devices[i].deviceid, debugstr_a(devices[i].name) );
data->xi2_core_pointer = devices[i].deviceid;
@@ -318,7 +315,6 @@ static void enable_xinput2(void)
}
}
-done:
wine_tsx11_unlock();
#endif
}
@@ -1523,11 +1519,8 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
input.u.mi.dwFlags = MOUSEEVENTF_MOVE;
input.u.mi.time = EVENT_x11_time_to_win32_time( event->time );
input.u.mi.dwExtraInfo = 0;
-
- if (XIMaskIsSet( event->valuators.mask, 0 )) dx = *values++;
- if (XIMaskIsSet( event->valuators.mask, 1 )) dy = *values++;
- input.u.mi.dx = dx;
- input.u.mi.dy = dy;
+ input.u.mi.dx = 0;
+ input.u.mi.dy = 0;
wine_tsx11_lock();
for (i = 0; i < thread_data->xi2_device_count; ++i)
@@ -1538,13 +1531,24 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
XIValuatorClassInfo *class = (XIValuatorClassInfo *)devices[i].classes[j];
if (devices[i].classes[j]->type != XIValuatorClass) continue;
- if (class->min >= class->max) continue;
- if (class->number == 0)
- input.u.mi.dx = dx * (virtual_screen_rect.right - virtual_screen_rect.left)
- / (class->max - class->min);
- else if (class->number == 1)
- input.u.mi.dy = dy * (virtual_screen_rect.bottom - virtual_screen_rect.top)
- / (class->max - class->min);
+ if (XIMaskIsSet( event->valuators.mask, class->number ))
+ {
+ double val = *values++;
+ if (class->label == x11drv_atom( Rel_X ))
+ {
+ input.u.mi.dx = dx = val;
+ if (class->min < class->max)
+ input.u.mi.dx = val * (virtual_screen_rect.right - virtual_screen_rect.left)
+ / (class->max - class->min);
+ }
+ else if (class->label == x11drv_atom( Rel_Y ))
+ {
+ input.u.mi.dy = dy = val;
+ if (class->min < class->max)
+ input.u.mi.dy = val * (virtual_screen_rect.bottom - virtual_screen_rect.top)
+ / (class->max - class->min);
+ }
+ }
}
break;
}
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 99efdb52..f24ccdc 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -407,6 +407,8 @@ enum x11drv_atoms
XATOM_RAW_ASCENT,
XATOM_RAW_DESCENT,
XATOM_RAW_CAP_HEIGHT,
+ XATOM_Rel_X,
+ XATOM_Rel_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 f660953..1499329 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -127,6 +127,8 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
"RAW_ASCENT",
"RAW_DESCENT",
"RAW_CAP_HEIGHT",
+ "Rel X",
+ "Rel Y",
"WM_PROTOCOLS",
"WM_DELETE_WINDOW",
"WM_STATE",
More information about the wine-cvs
mailing list