Skip to content

Commit 51e9934

Browse files
rbernonjulliard
authored andcommitted
winex11: Always listen to XInput2 device changes events.
1 parent b786705 commit 51e9934

File tree

1 file changed

+24
-17
lines changed

1 file changed

+24
-17
lines changed

dlls/winex11.drv/mouse.c

+24-17
Original file line numberDiff line numberDiff line change
@@ -260,27 +260,18 @@ static void enable_xinput2(void)
260260
{
261261
struct x11drv_thread_data *data = x11drv_thread_data();
262262
XIEventMask mask;
263-
XIDeviceInfo *pointer_info;
264263
unsigned char mask_bits[XIMaskLen(XI_LASTEVENT)];
265-
int count;
266264

267265
if (!xinput2_available) return;
268266

269-
if (!pXIGetClientPointer( data->display, None, &data->xinput2_pointer )) return;
270-
271267
mask.mask = mask_bits;
272268
mask.mask_len = sizeof(mask_bits);
273269
mask.deviceid = XIAllMasterDevices;
274270
memset( mask_bits, 0, sizeof(mask_bits) );
275271
XISetMask( mask_bits, XI_DeviceChanged );
276272
XISetMask( mask_bits, XI_RawMotion );
277273
XISetMask( mask_bits, XI_ButtonPress );
278-
279274
pXISelectEvents( data->display, DefaultRootWindow( data->display ), &mask, 1 );
280-
281-
pointer_info = pXIQueryDevice( data->display, data->xinput2_pointer, &count );
282-
update_relative_valuators( pointer_info->classes, pointer_info->num_classes );
283-
pXIFreeDeviceInfo( pointer_info );
284275
}
285276

286277
#endif
@@ -292,20 +283,17 @@ static void disable_xinput2(void)
292283
{
293284
#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
294285
struct x11drv_thread_data *data = x11drv_thread_data();
286+
unsigned char mask_bits[XIMaskLen(XI_LASTEVENT)];
295287
XIEventMask mask;
296288

297289
if (!xinput2_available) return;
298290

299-
mask.mask = NULL;
300-
mask.mask_len = 0;
291+
mask.mask = mask_bits;
292+
mask.mask_len = sizeof(mask_bits);
301293
mask.deviceid = XIAllMasterDevices;
302-
294+
memset( mask_bits, 0, sizeof(mask_bits) );
295+
XISetMask( mask_bits, XI_DeviceChanged );
303296
pXISelectEvents( data->display, DefaultRootWindow( data->display ), &mask, 1 );
304-
data->x_valuator.number = -1;
305-
data->y_valuator.number = -1;
306-
data->x_valuator.value = 0;
307-
data->y_valuator.value = 0;
308-
data->xinput2_pointer = 0;
309297
#endif
310298
}
311299

@@ -316,7 +304,10 @@ static void disable_xinput2(void)
316304
void x11drv_xinput2_init( struct x11drv_thread_data *data )
317305
{
318306
#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
307+
unsigned char mask_bits[XIMaskLen(XI_LASTEVENT)];
319308
int major = 2, minor = 2;
309+
XIEventMask mask;
310+
int count;
320311

321312
if (!xinput2_available || pXIQueryVersion( data->display, &major, &minor ))
322313
{
@@ -325,6 +316,22 @@ void x11drv_xinput2_init( struct x11drv_thread_data *data )
325316
return;
326317
}
327318

319+
mask.mask = mask_bits;
320+
mask.mask_len = sizeof(mask_bits);
321+
mask.deviceid = XIAllMasterDevices;
322+
memset( mask_bits, 0, sizeof(mask_bits) );
323+
XISetMask( mask_bits, XI_DeviceChanged );
324+
pXISelectEvents( data->display, DefaultRootWindow( data->display ), &mask, 1 );
325+
326+
if (!pXIGetClientPointer( data->display, None, &data->xinput2_pointer ))
327+
WARN( "Failed to get xinput2 master pointer device\n" );
328+
else
329+
{
330+
XIDeviceInfo *pointer_info = pXIQueryDevice( data->display, data->xinput2_pointer, &count );
331+
update_relative_valuators( pointer_info->classes, pointer_info->num_classes );
332+
pXIFreeDeviceInfo( pointer_info );
333+
}
334+
328335
TRACE( "XInput2 %d.%d available\n", major, minor );
329336
#endif
330337
}

0 commit comments

Comments
 (0)