From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/mouse.c | 53 ++++++++++++++++++---------------- dlls/winex11.drv/x11drv.h | 5 ++-- dlls/winex11.drv/x11drv_main.c | 3 +- 3 files changed, 33 insertions(+), 28 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index f02ca5355c5..3036f3db9e3 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -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; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index dbf7d07e3d4..e8a87283fe2 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -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 );
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 25a36cb8c0c..097dd9c3dc8 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -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; }