1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

winex11: Initialize XInput2 extension on every thread.

This commit is contained in:
Rémi Bernon 2024-01-28 18:22:51 +01:00 committed by Alexandre Julliard
parent 1a757a0146
commit b7867059ce
3 changed files with 33 additions and 28 deletions

View file

@ -266,17 +266,6 @@ static void enable_xinput2(void)
if (!xinput2_available) return;
if (data->xi2_state == xi_unknown)
{
int major = 2, minor = 2;
if (!pXIQueryVersion( data->display, &major, &minor )) data->xi2_state = xi_disabled;
else
{
data->xi2_state = xi_unavailable;
WARN( "X Input 2 not available\n" );
}
}
if (data->xi2_state == xi_unavailable) return;
if (!pXIGetClientPointer( data->display, None, &data->xinput2_pointer )) return;
mask.mask = mask_bits;
@ -292,8 +281,6 @@ static void enable_xinput2(void)
pointer_info = pXIQueryDevice( data->display, data->xinput2_pointer, &count );
update_relative_valuators( pointer_info->classes, pointer_info->num_classes );
pXIFreeDeviceInfo( pointer_info );
data->xi2_state = xi_enabled;
}
#endif
@ -307,10 +294,7 @@ static void disable_xinput2(void)
struct x11drv_thread_data *data = x11drv_thread_data();
XIEventMask mask;
if (data->xi2_state != xi_enabled) return;
TRACE( "disabling\n" );
data->xi2_state = xi_disabled;
if (!xinput2_available) return;
mask.mask = NULL;
mask.mask_len = 0;
@ -326,6 +310,26 @@ static void disable_xinput2(void)
}
/***********************************************************************
* x11drv_xinput_init
*/
void x11drv_xinput2_init( struct x11drv_thread_data *data )
{
#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
int major = 2, minor = 2;
if (!xinput2_available || pXIQueryVersion( data->display, &major, &minor ))
{
WARN( "XInput 2.0 not available\n" );
xinput2_available = FALSE;
return;
}
TRACE( "XInput2 %d.%d available\n", major, minor );
#endif
}
/***********************************************************************
* grab_clipping_window
*
@ -352,17 +356,16 @@ static BOOL grab_clipping_window( const RECT *clip )
WARN( "refusing to clip to %s\n", wine_dbgstr_rect(clip) );
return FALSE;
}
/* enable XInput2 unless we are already clipping */
if (!data->clipping_cursor) enable_xinput2();
if (data->xi2_state != xi_enabled)
if (!xinput2_available)
{
WARN( "XInput2 not supported, refusing to clip to %s\n", wine_dbgstr_rect(clip) );
NtUserClipCursor( NULL );
return TRUE;
}
/* enable XInput2 unless we are already clipping */
if (!data->clipping_cursor) enable_xinput2();
TRACE( "clipping to %s win %lx\n", wine_dbgstr_rect(clip), clip_window );
if (!data->clipping_cursor) XUnmapWindow( data->display, clip_window );
@ -1646,7 +1649,7 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
if (x->number < 0 || y->number < 0) return FALSE;
if (!event->valuators.mask_len) return FALSE;
if (thread_data->xi2_state != xi_enabled) return FALSE;
if (!xinput2_available) return FALSE;
if (event->deviceid != thread_data->xinput2_pointer) return FALSE;
virtual_rect = NtUserGetVirtualScreenRect();
@ -1721,9 +1724,9 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
/***********************************************************************
* X11DRV_XInput2_Init
* x11drv_xinput2_load
*/
void X11DRV_XInput2_Init(void)
void x11drv_xinput2_load(void)
{
#if defined(SONAME_LIBXI) && defined(HAVE_X11_EXTENSIONS_XINPUT2_H)
int event, error;

View file

@ -263,7 +263,6 @@ extern void X11DRV_ThreadDetach(void);
/* X11 driver internal functions */
extern void X11DRV_Xcursor_Init(void);
extern void X11DRV_XInput2_Init(void);
extern DWORD copy_image_bits( BITMAPINFO *info, BOOL is_r8g8b8, XImage *image,
const struct gdi_image_bits *src_bits, struct gdi_image_bits *dst_bits,
@ -393,7 +392,6 @@ struct x11drv_thread_data
Window clip_window; /* window used for cursor clipping */
BOOL clipping_cursor; /* whether thread is currently clipping the cursor */
#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
enum { xi_unavailable = -1, xi_unknown, xi_disabled, xi_enabled } xi2_state; /* XInput2 state */
XIValuatorClassInfo x_valuator;
XIValuatorClassInfo y_valuator;
int xinput2_pointer; /* XInput2 master pointer device id */
@ -575,6 +573,9 @@ extern BOOL X11DRV_MappingNotify( HWND hWnd, XEvent *event );
extern BOOL X11DRV_GenericEvent( HWND hwnd, XEvent *event );
extern int xinput2_opcode;
extern void x11drv_xinput2_load(void);
extern void x11drv_xinput2_init( struct x11drv_thread_data *data );
extern Bool (*pXGetEventData)( Display *display, XEvent /*XGenericEventCookie*/ *event );
extern void (*pXFreeEventData)( Display *display, XEvent /*XGenericEventCookie*/ *event );

View file

@ -697,7 +697,7 @@ static NTSTATUS x11drv_init( void *arg )
#ifdef SONAME_LIBXCOMPOSITE
X11DRV_XComposite_Init();
#endif
X11DRV_XInput2_Init();
x11drv_xinput2_load();
XkbUseExtension( gdi_display, NULL, NULL );
X11DRV_InitKeyboard( gdi_display );
@ -786,6 +786,7 @@ struct x11drv_thread_data *x11drv_init_thread_data(void)
NtUserGetThreadInfo()->driver_data = (UINT_PTR)data;
if (use_xim) xim_thread_attach( data );
x11drv_xinput2_init( data );
return data;
}