Commit ff60249c authored by Alexandre Julliard's avatar Alexandre Julliard

winex11: Use the labels to find the mouse motion valuators for XInput2.

parent f5790913
...@@ -257,7 +257,7 @@ static void enable_xinput2(void) ...@@ -257,7 +257,7 @@ static void enable_xinput2(void)
XIEventMask mask; XIEventMask mask;
XIDeviceInfo *devices; XIDeviceInfo *devices;
unsigned char mask_bits[XIMaskLen(XI_LASTEVENT)]; unsigned char mask_bits[XIMaskLen(XI_LASTEVENT)];
int i, j; int i, j, count;
if (!xinput2_available) return; if (!xinput2_available) return;
...@@ -279,21 +279,18 @@ static void enable_xinput2(void) ...@@ -279,21 +279,18 @@ static void enable_xinput2(void)
for (i = 0; i < data->xi2_device_count; ++i) for (i = 0; i < data->xi2_device_count; ++i)
{ {
if (devices[i].use != XIMasterPointer) continue; 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]; XIValuatorClassInfo *class = (XIValuatorClassInfo *)devices[i].classes[j];
if (devices[i].classes[j]->type != XIValuatorClass) continue; if (devices[i].classes[j]->type != XIValuatorClass) continue;
if (class->number != 0 && class->number != 1) continue; TRACE( "Device %u (%s) num %u %f,%f res %u mode %u label %s\n",
TRACE( "Device %u (%s) class %u num %u %f,%f res %u mode %u\n",
devices[i].deviceid, debugstr_a(devices[i].name), devices[i].deviceid, debugstr_a(devices[i].name),
j, class->number, class->min, class->max, class->resolution, class->mode ); class->number, class->min, class->max, class->resolution, class->mode,
if (class->mode == XIModeAbsolute) XGetAtomName( data->display, class->label ));
{ if (class->label == x11drv_atom( Rel_X ) || class->label == x11drv_atom( Rel_Y )) count++;
TRACE( "Device is absolute, not enabling XInput2\n" );
goto done;
}
} }
if (count < 2) continue;
TRACE( "Using %u (%s) as core pointer\n", TRACE( "Using %u (%s) as core pointer\n",
devices[i].deviceid, debugstr_a(devices[i].name) ); devices[i].deviceid, debugstr_a(devices[i].name) );
data->xi2_core_pointer = devices[i].deviceid; data->xi2_core_pointer = devices[i].deviceid;
...@@ -318,7 +315,6 @@ static void enable_xinput2(void) ...@@ -318,7 +315,6 @@ static void enable_xinput2(void)
} }
} }
done:
wine_tsx11_unlock(); wine_tsx11_unlock();
#endif #endif
} }
...@@ -1523,11 +1519,8 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev ) ...@@ -1523,11 +1519,8 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
input.u.mi.dwFlags = MOUSEEVENTF_MOVE; input.u.mi.dwFlags = MOUSEEVENTF_MOVE;
input.u.mi.time = EVENT_x11_time_to_win32_time( event->time ); input.u.mi.time = EVENT_x11_time_to_win32_time( event->time );
input.u.mi.dwExtraInfo = 0; input.u.mi.dwExtraInfo = 0;
input.u.mi.dx = 0;
if (XIMaskIsSet( event->valuators.mask, 0 )) dx = *values++; input.u.mi.dy = 0;
if (XIMaskIsSet( event->valuators.mask, 1 )) dy = *values++;
input.u.mi.dx = dx;
input.u.mi.dy = dy;
wine_tsx11_lock(); wine_tsx11_lock();
for (i = 0; i < thread_data->xi2_device_count; ++i) for (i = 0; i < thread_data->xi2_device_count; ++i)
...@@ -1538,13 +1531,24 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev ) ...@@ -1538,13 +1531,24 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
XIValuatorClassInfo *class = (XIValuatorClassInfo *)devices[i].classes[j]; XIValuatorClassInfo *class = (XIValuatorClassInfo *)devices[i].classes[j];
if (devices[i].classes[j]->type != XIValuatorClass) continue; if (devices[i].classes[j]->type != XIValuatorClass) continue;
if (class->min >= class->max) continue; if (XIMaskIsSet( event->valuators.mask, class->number ))
if (class->number == 0) {
input.u.mi.dx = dx * (virtual_screen_rect.right - virtual_screen_rect.left) double val = *values++;
/ (class->max - class->min); if (class->label == x11drv_atom( Rel_X ))
else if (class->number == 1) {
input.u.mi.dy = dy * (virtual_screen_rect.bottom - virtual_screen_rect.top) input.u.mi.dx = dx = val;
/ (class->max - class->min); 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; break;
} }
......
...@@ -407,6 +407,8 @@ enum x11drv_atoms ...@@ -407,6 +407,8 @@ enum x11drv_atoms
XATOM_RAW_ASCENT, XATOM_RAW_ASCENT,
XATOM_RAW_DESCENT, XATOM_RAW_DESCENT,
XATOM_RAW_CAP_HEIGHT, XATOM_RAW_CAP_HEIGHT,
XATOM_Rel_X,
XATOM_Rel_Y,
XATOM_WM_PROTOCOLS, XATOM_WM_PROTOCOLS,
XATOM_WM_DELETE_WINDOW, XATOM_WM_DELETE_WINDOW,
XATOM_WM_STATE, XATOM_WM_STATE,
......
...@@ -127,6 +127,8 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] = ...@@ -127,6 +127,8 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
"RAW_ASCENT", "RAW_ASCENT",
"RAW_DESCENT", "RAW_DESCENT",
"RAW_CAP_HEIGHT", "RAW_CAP_HEIGHT",
"Rel X",
"Rel Y",
"WM_PROTOCOLS", "WM_PROTOCOLS",
"WM_DELETE_WINDOW", "WM_DELETE_WINDOW",
"WM_STATE", "WM_STATE",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment