[PATCH v10 8/9] winex11.drv: Implement native mouse-button raw-input using RawButton*.

Rémi Bernon rbernon at codeweavers.com
Fri Aug 2 03:29:27 CDT 2019


On 8/2/19 8:24 AM, Derek Lesho wrote:
> Signed-off-by: Derek Lesho <dereklesho52 at Gmail.com>
> ---
>   dlls/winex11.drv/mouse.c       | 82 +++++++++++++++++++++++++++++++---
>   dlls/winex11.drv/x11drv.h      |  2 +
>   dlls/winex11.drv/x11drv_main.c |  1 +
>   3 files changed, 80 insertions(+), 5 deletions(-)
> 
> diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
> index 2fd38db263..650e81204d 100644
> --- a/dlls/winex11.drv/mouse.c
> +++ b/dlls/winex11.drv/mouse.c
> @@ -259,6 +259,7 @@ static void update_relative_valuators(XIAnyClassInfo **valuators, int n_valuator
>   
>       thread_data->x_rel_valuator.number = -1;
>       thread_data->y_rel_valuator.number = -1;
> +    thread_data->wheel_valuator.number = -1;
>   
>       for (i = 0; i < n_valuators; i++)
>       {
> @@ -276,6 +277,11 @@ static void update_relative_valuators(XIAnyClassInfo **valuators, int n_valuator
>           {
>               valuator_data = &thread_data->y_rel_valuator;
>           }
> +        else if (class->label == x11drv_atom( Rel_Vert_Scroll ) ||
> +                 (!class->label && class->number == 3 && class->mode == XIModeRelative))
> +        {
> +            valuator_data = &thread_data->wheel_valuator;
> +        }
>   
>           if (valuator_data) {
>               valuator_data->number = class->number;
> @@ -322,6 +328,8 @@ void X11DRV_XInput2_Enable(void)
>       mask.deviceid = XIAllMasterDevices;
>       memset( mask_bits, 0, sizeof(mask_bits) );
>       XISetMask( mask_bits, XI_RawMotion );
> +    XISetMask( mask_bits, XI_RawButtonPress );
> +    XISetMask( mask_bits, XI_RawButtonRelease );
>   
>       /* XInput 2.0 has a problematic behavior where master pointer will
>        * not send raw events to the root window whenever a grab is active
> @@ -380,6 +388,7 @@ void X11DRV_XInput2_Disable(void)
>       pXIFreeDeviceInfo( data->xi2_devices );
>       data->x_rel_valuator.number = -1;
>       data->y_rel_valuator.number = -1;
> +    data->wheel_valuator.number = -1;
>       data->xi2_devices = NULL;
>       data->xi2_core_pointer = 0;
>       data->xi2_current_slave = 0;
> @@ -1762,11 +1771,11 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
>       INPUT input;
>       RAWINPUT raw_input;
>       int i;
> -    double dx = 0, dy = 0, raw_dx = 0, raw_dy = 0, val, raw_val;
> +    double dx = 0, dy = 0, raw_dx = 0, raw_dy = 0, dwheel = 0, val, raw_val;

Nitpick: raw_dwheel / raw_dw to keep names consistent?

>       struct x11drv_thread_data *thread_data = x11drv_thread_data();
> -    struct x11drv_valuator_data *x_rel, *y_rel;
> +    struct x11drv_valuator_data *x_rel, *y_rel, *wheel;
>   
> -    if (thread_data->x_rel_valuator.number < 0 || thread_data->y_rel_valuator.number < 0) return FALSE;
> +    if (thread_data->x_rel_valuator.number < 0 || thread_data->y_rel_valuator.number < 0 || thread_data->wheel_valuator.number < 0) return FALSE;
>       if (!event->valuators.mask_len) return FALSE;
>       if (thread_data->xi2_state < xi_enabled) return FALSE;
>   
> @@ -1799,6 +1808,7 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
>   
>       x_rel = &thread_data->x_rel_valuator;
>       y_rel = &thread_data->y_rel_valuator;
> +    wheel = &thread_data->wheel_valuator;
>   
>       input.type = INPUT_MOUSE;
>       input.u.mi.mouseData   = 0;
> @@ -1817,7 +1827,7 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
>   
>       virtual_rect = get_virtual_screen_rect();
>   
> -    for (i = 0; i <= max ( x_rel->number, y_rel->number ); i++)
> +    for (i = 0; i <= max( wheel->number, max( x_rel->number, y_rel->number ) ); i++)
>       {
>           if (!XIMaskIsSet( event->valuators.mask, i )) continue;
>           val = *values++;
> @@ -1840,6 +1850,8 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
>   
>               raw_input.data.mouse.lLastY = raw_dy = raw_val;
>           }
> +        if (i == wheel->number)
> +            dwheel = raw_val;
>       }
>   
>       if (broken_rawevents && is_old_motion_event( xev->serial ))
> @@ -1854,12 +1866,67 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
>           __wine_send_input( 0, &input );
>       }
>   
> -    TRACE("raw event %f,%f\n",  raw_dx, raw_dy);
> +    if (dwheel)
> +    {
> +        raw_input.data.mouse.u.usButtonFlags = RI_MOUSE_WHEEL;
> +        raw_input.data.mouse.u.usButtonData  = dwheel * 8;
> +    }
> +
> +    TRACE("raw event %f,%f + %f\n",  raw_dx, raw_dy, dwheel);
>       __wine_send_raw_input( &raw_input );
>   
>       return TRUE;
>   }
>   
> +/***********************************************************************
> + *           X11DRV_RawButton
> + */
> +static BOOL X11DRV_RawButton( XGenericEventCookie *xev )
> +{
> +    RAWINPUT ri;
> +
> +    static const unsigned short raw_button_press_flags[] = {
> +        0,                              /* 0 = unused */
> +        RI_MOUSE_LEFT_BUTTON_DOWN,      /* 1 */
> +        RI_MOUSE_MIDDLE_BUTTON_DOWN,    /* 2 */
> +        RI_MOUSE_RIGHT_BUTTON_DOWN,     /* 3 */
> +        0,                              /* 4 = unknown */
> +        0,                              /* 5 = unknown */
> +        0,                              /* 6 = unknown */
> +        0,                              /* 7 = unknown */
> +        RI_MOUSE_BUTTON_4_DOWN,         /* 8 */
> +        RI_MOUSE_BUTTON_5_DOWN          /* 9 */
> +    };
> +
> +    static const unsigned short raw_button_release_flags[] = {
> +        0,                            /* 0 = unused */
> +        RI_MOUSE_LEFT_BUTTON_UP,      /* 1 */
> +        RI_MOUSE_MIDDLE_BUTTON_UP,    /* 2 */
> +        RI_MOUSE_RIGHT_BUTTON_UP,     /* 3 */
> +        0,                            /* 4 = unknown */
> +        0,                            /* 5 = unknown */
> +        0,                            /* 6 = unknown */
> +        0,                            /* 7 = unknown */
> +        RI_MOUSE_BUTTON_4_UP,         /* 8 */
> +        RI_MOUSE_BUTTON_5_UP          /* 9 */
> +    };
> +
> +    int detail = ((XIRawEvent*)xev->data)->detail;
> +    if (detail > 9) return TRUE;
> +
> +    ri.header.dwType = RIM_TYPEMOUSE;
> +    ri.data.mouse.u.usButtonFlags = xev->evtype == XI_RawButtonPress ? raw_button_press_flags[detail] : raw_button_release_flags[detail] ;
> +    ri.data.mouse.u.usButtonData = 0;
> +    ri.data.mouse.lLastX = 0;
> +    ri.data.mouse.lLastY = 0;
> +    ri.data.mouse.ulExtraInformation = 0;
> +
> +    if (ri.data.mouse.u.usButtonFlags)
> +        __wine_send_raw_input( &ri );
> +
> +    return TRUE;
> +}
> +
>   #endif /* HAVE_X11_EXTENSIONS_XINPUT2_H */
>   
>   
> @@ -1924,6 +1991,11 @@ BOOL X11DRV_GenericEvent( HWND hwnd, XEvent *xev )
>       case XI_RawMotion:
>           ret = X11DRV_RawMotion( event );
>           break;
> +    case XI_RawButtonPress:
> +        /* fall through */
> +    case XI_RawButtonRelease:
> +        ret = X11DRV_RawButton( event );
> +        break;
>   
>       default:
>           TRACE( "Unhandled event %#x\n", event->evtype );
> diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
> index 2223629c7b..c74f1493c0 100644
> --- a/dlls/winex11.drv/x11drv.h
> +++ b/dlls/winex11.drv/x11drv.h
> @@ -342,6 +342,7 @@ struct x11drv_thread_data
>       int      xi2_device_count;
>       struct x11drv_valuator_data x_rel_valuator;
>       struct x11drv_valuator_data y_rel_valuator;
> +    struct x11drv_valuator_data wheel_valuator;
>       int      xi2_core_pointer;     /* XInput2 core pointer id */
>       int      xi2_current_slave;    /* Current slave driving the Core pointer */
>   };
> @@ -427,6 +428,7 @@ enum x11drv_atoms
>       XATOM_RAW_CAP_HEIGHT,
>       XATOM_Rel_X,
>       XATOM_Rel_Y,
> +    XATOM_Rel_Vert_Scroll,
>       XATOM_WM_PROTOCOLS,
>       XATOM_WM_DELETE_WINDOW,
>       XATOM_WM_STATE,
> diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
> index 214c101b67..86b6efac08 100644
> --- a/dlls/winex11.drv/x11drv_main.c
> +++ b/dlls/winex11.drv/x11drv_main.c
> @@ -120,6 +120,7 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
>       "RAW_CAP_HEIGHT",
>       "Rel X",
>       "Rel Y",
> +    "Rel Vert Scroll",
>       "WM_PROTOCOLS",
>       "WM_DELETE_WINDOW",
>       "WM_STATE",
> 


-- 
Rémi Bernon <rbernon at codeweavers.com>



More information about the wine-devel mailing list