Signed-off-by: Derek Lesho dereklesho52@Gmail.com --- dlls/winex11.drv/mouse.c | 150 ++++++++++++++++----------------- dlls/winex11.drv/x11drv.h | 8 +- dlls/winex11.drv/x11drv_main.c | 4 + 3 files changed, 81 insertions(+), 81 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index f737a306a5..f328eb369c 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -284,15 +284,31 @@ static void update_relative_valuators(XIAnyClassInfo **valuators, int n_valuator } #endif
+/*********************************************************************** + * inform_wineserver + */ +static void inform_wineserver(void) +{ + static int once = 0; + if (!once) + { + RAWINPUT raw_input; + raw_input.header.dwType = RIM_ENABLE_NATIVE_MOUSE_MOVE; + __wine_send_raw_input(&raw_input); + once = 1; + } +} +
/*********************************************************************** - * enable_xinput2 + * X11DRV_XInput2_Enable */ -static void enable_xinput2(void) +void X11DRV_XInput2_Enable(void) { #ifdef HAVE_X11_EXTENSIONS_XINPUT2_H struct x11drv_thread_data *data = x11drv_thread_data(); XIEventMask mask; + int core_pointer; XIDeviceInfo *pointer_info; unsigned char mask_bits[XIMaskLen(XI_LASTEVENT)]; int count; @@ -301,7 +317,7 @@ static void enable_xinput2(void)
if (data->xi2_state == xi_unknown) { - int major = 2, minor = 0; + int major = 2, minor = 1; if (!pXIQueryVersion( data->display, &major, &minor )) data->xi2_state = xi_disabled; else { @@ -310,64 +326,65 @@ static void enable_xinput2(void) } } if (data->xi2_state == xi_unavailable) return; - if (!pXIGetClientPointer( data->display, None, &data->xi2_core_pointer )) return; + if (!pXIGetClientPointer( data->display, None, &core_pointer )) return;
mask.mask = mask_bits; mask.mask_len = sizeof(mask_bits); - mask.deviceid = XIAllDevices; + mask.deviceid = XIAllMasterDevices; memset( mask_bits, 0, sizeof(mask_bits) ); - XISetMask( mask_bits, XI_DeviceChanged ); XISetMask( mask_bits, XI_RawMotion ); - XISetMask( mask_bits, XI_ButtonPress );
pXISelectEvents( data->display, DefaultRootWindow( data->display ), &mask, 1 );
- pointer_info = pXIQueryDevice( data->display, data->xi2_core_pointer, &count ); + pointer_info = pXIQueryDevice( data->display, core_pointer, &count ); update_relative_valuators( pointer_info->classes, pointer_info->num_classes ); pXIFreeDeviceInfo( pointer_info );
- /* This device info list is only used to find the initial current slave if - * no XI_DeviceChanged events happened. If any hierarchy change occurred that - * might be relevant here (eg. user switching mice after (un)plugging), a - * XI_DeviceChanged event will point us to the right slave. So this list is - * safe to be obtained statically at enable_xinput2() time. - */ - if (data->xi2_devices) pXIFreeDeviceInfo( data->xi2_devices ); - data->xi2_devices = pXIQueryDevice( data->display, XIAllDevices, &data->xi2_device_count ); - data->xi2_current_slave = 0; - data->xi2_state = xi_enabled; + + inform_wineserver(); #endif }
/*********************************************************************** - * disable_xinput2 + * X11DRV_XInput2_Disable */ -static void disable_xinput2(void) +void X11DRV_XInput2_Disable(void) { #ifdef HAVE_X11_EXTENSIONS_XINPUT2_H struct x11drv_thread_data *data = x11drv_thread_data(); XIEventMask mask;
- if (data->xi2_state != xi_enabled) return; + if (data->xi2_state < xi_enabled) return;
TRACE( "disabling\n" ); data->xi2_state = xi_disabled;
mask.mask = NULL; mask.mask_len = 0; - mask.deviceid = XIAllDevices; + mask.deviceid = XIAllMasterDevices;
pXISelectEvents( data->display, DefaultRootWindow( data->display ), &mask, 1 ); - pXIFreeDeviceInfo( data->xi2_devices ); data->x_rel_valuator.number = -1; data->y_rel_valuator.number = -1; - data->xi2_devices = NULL; - data->xi2_core_pointer = 0; - data->xi2_current_slave = 0; #endif }
+static void use_xinput2_path(void) +{ + struct x11drv_thread_data *thread_data = x11drv_thread_data(); + + if (thread_data->xi2_state == xi_enabled) + thread_data->xi2_state = xi_extra; +} + +static void disable_xinput2_path(void) +{ + struct x11drv_thread_data *thread_data = x11drv_thread_data(); + + if (thread_data->xi2_state == xi_extra) + thread_data->xi2_state = xi_enabled; +}
/*********************************************************************** * grab_clipping_window @@ -393,9 +410,9 @@ static BOOL grab_clipping_window( const RECT *clip ) return TRUE;
/* enable XInput2 unless we are already clipping */ - if (!data->clip_hwnd) enable_xinput2(); + if (!data->clip_hwnd) use_xinput2_path();
- if (data->xi2_state != xi_enabled) + if (data->xi2_state < xi_extra) { WARN( "XInput2 not supported, refusing to clip to %s\n", wine_dbgstr_rect(clip) ); DestroyWindow( msg_hwnd ); @@ -423,7 +440,7 @@ static BOOL grab_clipping_window( const RECT *clip )
if (!clipping_cursor) { - disable_xinput2(); + disable_xinput2_path(); DestroyWindow( msg_hwnd ); return FALSE; } @@ -489,7 +506,7 @@ LRESULT clip_cursor_notify( HWND hwnd, HWND new_clip_hwnd ) TRACE( "clip hwnd reset from %p\n", hwnd ); data->clip_hwnd = 0; data->clip_reset = GetTickCount(); - disable_xinput2(); + disable_xinput2_path(); DestroyWindow( hwnd ); } else if (hwnd == GetForegroundWindow()) /* request to clip */ @@ -1701,22 +1718,6 @@ BOOL X11DRV_EnterNotify( HWND hwnd, XEvent *xev )
#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
-/*********************************************************************** - * X11DRV_DeviceChanged - */ -static BOOL X11DRV_DeviceChanged( XGenericEventCookie *xev ) -{ - XIDeviceChangedEvent *event = xev->data; - struct x11drv_thread_data *data = x11drv_thread_data(); - - if (event->deviceid != data->xi2_core_pointer) return FALSE; - if (event->reason != XISlaveSwitch) return FALSE; - - update_relative_valuators( event->classes, event->num_classes ); - data->xi2_current_slave = event->sourceid; - return TRUE; -} - /*********************************************************************** * X11DRV_RawMotion */ @@ -1724,46 +1725,36 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev ) { XIRawEvent *event = xev->data; const double *values = event->valuators.values; + const double *raw_values = event->raw_values; RECT virtual_rect; INPUT input; + RAWINPUT raw_input; int i; - double dx = 0, dy = 0, val; + double dx = 0, dy = 0, raw_dx = 0, raw_dy = 0, val, raw_val; struct x11drv_thread_data *thread_data = x11drv_thread_data(); struct x11drv_valuator_data *x_rel, *y_rel;
if (thread_data->x_rel_valuator.number < 0 || thread_data->y_rel_valuator.number < 0) return FALSE; if (!event->valuators.mask_len) return FALSE; - if (thread_data->xi2_state != xi_enabled) return FALSE; - - /* If there is no slave currently detected, no previous motion nor device - * change events were received. Look it up now on the device list in this - * case. - */ - if (!thread_data->xi2_current_slave) - { - XIDeviceInfo *devices = thread_data->xi2_devices; - - for (i = 0; i < thread_data->xi2_device_count; i++) - { - if (devices[i].use != XISlavePointer) continue; - if (devices[i].deviceid != event->deviceid) continue; - if (devices[i].attachment != thread_data->xi2_core_pointer) continue; - thread_data->xi2_current_slave = event->deviceid; - break; - } - } - - if (event->deviceid != thread_data->xi2_current_slave) return FALSE; + if (thread_data->xi2_state < xi_enabled) return FALSE;
x_rel = &thread_data->x_rel_valuator; y_rel = &thread_data->y_rel_valuator;
+ input.type = INPUT_MOUSE; input.u.mi.mouseData = 0; input.u.mi.dwFlags = MOUSEEVENTF_MOVE; input.u.mi.time = EVENT_x11_time_to_win32_time( event->time ); input.u.mi.dwExtraInfo = 0; - input.u.mi.dx = 0; - input.u.mi.dy = 0; + input.u.mi.dx = 0; + input.u.mi.dy = 0; + + raw_input.header.dwType = RIM_TYPEMOUSE; + raw_input.data.mouse.u.usButtonFlags = 0; + raw_input.data.mouse.u.usButtonData = 0; + raw_input.data.mouse.ulExtraInformation = 0; + raw_input.data.mouse.lLastX = 0; + raw_input.data.mouse.lLastY = 0;
virtual_rect = get_virtual_screen_rect();
@@ -1771,12 +1762,15 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev ) { if (!XIMaskIsSet( event->valuators.mask, i )) continue; val = *values++; + raw_val = *raw_values++; if (i == x_rel->number) { input.u.mi.dx = dx = val; if (x_rel->min < x_rel->max) input.u.mi.dx = val * (virtual_rect.right - virtual_rect.left) / (x_rel->max - x_rel->min); + + raw_input.data.mouse.lLastX = raw_dx = raw_val; } if (i == y_rel->number) { @@ -1784,6 +1778,8 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev ) if (y_rel->min < y_rel->max) input.u.mi.dy = val * (virtual_rect.bottom - virtual_rect.top) / (y_rel->max - y_rel->min); + + raw_input.data.mouse.lLastY = raw_dy = raw_val; } }
@@ -1793,10 +1789,15 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev ) return FALSE; }
- TRACE( "pos %d,%d (event %f,%f)\n", input.u.mi.dx, input.u.mi.dy, dx, dy ); + if (thread_data->xi2_state == xi_extra) + { + TRACE( "pos %d,%d (event %f,%f)\n", input.u.mi.dx, input.u.mi.dy, dx, dy ); + __wine_send_input( 0, &input ); + } + + TRACE("raw event %f,%f\n", raw_dx, raw_dy); + __wine_send_raw_input( &raw_input );
- input.type = INPUT_MOUSE; - __wine_send_input( 0, &input ); return TRUE; }
@@ -1858,9 +1859,6 @@ BOOL X11DRV_GenericEvent( HWND hwnd, XEvent *xev )
switch (event->evtype) { - case XI_DeviceChanged: - ret = X11DRV_DeviceChanged( event ); - break; case XI_RawMotion: ret = X11DRV_RawMotion( event ); break; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index a0308b0675..a6d64f4383 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -194,6 +194,8 @@ extern BOOL X11DRV_UnrealizePalette( HPALETTE hpal ) DECLSPEC_HIDDEN;
extern void X11DRV_Xcursor_Init(void) DECLSPEC_HIDDEN; extern void X11DRV_XInput2_Init(void) DECLSPEC_HIDDEN; +extern void X11DRV_XInput2_Enable(void) DECLSPEC_HIDDEN; +extern void X11DRV_XInput2_Disable(void) DECLSPEC_HIDDEN;
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, @@ -335,13 +337,9 @@ struct x11drv_thread_data HWND clip_hwnd; /* message window stored in desktop while clipping is active */ DWORD clip_reset; /* time when clipping was last reset */ HKL kbd_layout; /* active keyboard layout */ - enum { xi_unavailable = -1, xi_unknown, xi_disabled, xi_enabled } xi2_state; /* XInput2 state */ - void *xi2_devices; /* list of XInput2 devices (valid when state is enabled) */ - int xi2_device_count; + enum { xi_unavailable = -1, xi_unknown, xi_disabled, xi_enabled, xi_extra } xi2_state; /* XInput2 state */ struct x11drv_valuator_data x_rel_valuator; struct x11drv_valuator_data y_rel_valuator; - int xi2_core_pointer; /* XInput2 core pointer id */ - int xi2_current_slave; /* Current slave driving the Core pointer */ };
extern struct x11drv_thread_data *x11drv_init_thread_data(void) DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index e67a3c05a9..351ab89781 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -610,6 +610,8 @@ void CDECL X11DRV_ThreadDetach(void)
if (data) { + X11DRV_XInput2_Disable(); + if (data->xim) XCloseIM( data->xim ); if (data->font_set) XFreeFontSet( data->display, data->font_set ); XCloseDisplay( data->display ); @@ -680,6 +682,8 @@ struct x11drv_thread_data *x11drv_init_thread_data(void)
if (use_xim) X11DRV_SetupXIM();
+ X11DRV_XInput2_Enable(); + return data; }