[PATCH v9 7/8] winex11.drv: Implement native mouse-button raw-input using RawButton*.
Derek Lesho
dereklesho52 at gmail.com
Mon Jul 29 12:04:08 CDT 2019
Thank you, I was trying to find a better way to get the mouse wheel
valuator but documentation is sparse (or I just can't find it) so I
just set it manually.
Thank you for the other two points and the ones in patch 3 + patch 5.
I'll address those soon.
On Mon, Jul 29, 2019 at 10:22 AM Rémi Bernon <rbernon at codeweavers.com> wrote:
>
> On 7/27/19 1:19 AM, Derek Lesho wrote:
> > Signed-off-by: Derek Lesho <dereklesho52 at Gmail.com>
> > ---
> > dlls/winex11.drv/mouse.c | 97 +++++++++++++++++++++++++++++++++++++--
> > dlls/winex11.drv/x11drv.h | 1 +
> > 2 files changed, 93 insertions(+), 5 deletions(-)
> >
> > diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
> > index 7423f946b9..9259907eb5 100644
> > --- a/dlls/winex11.drv/mouse.c
> > +++ b/dlls/winex11.drv/mouse.c
> > @@ -257,6 +257,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++)
> > {
> > @@ -274,6 +275,10 @@ static void update_relative_valuators(XIAnyClassInfo **valuators, int n_valuator
> > {
> > valuator_data = &thread_data->y_rel_valuator;
> > }
> > + else if (class->number == 3) /* scroll wheel */
> > + {
> > + valuator_data = &thread_data->wheel_valuator;
> > + }
> >
>
> You can do the same check as the other ifs here, just add a
> Rel_Vert_Scroll enumeration in x11drv.h (and the corresponding string
> with spaces, in x11drv_main.c).
>
> >
> > - 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;
> > + }
> > +
> > + TRACE("raw event %f,%f + %f\n", raw_dx, raw_dy, dwheel);
> > __wine_send_raw_input( &raw_input );
> >
> > return TRUE;
> > }
>
> As said in my other mail, I believe there may be a 8x scaling factor for
> the mouse wheel between XInput2 and Windows.
>
> > +/***********************************************************************
> > + * 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;
> > +
> > + __wine_send_raw_input( &ri );
> > +
> > + return TRUE;
> > +}
> > +
> It may worth it to skip sending empty rawinput here, it looks like that
> XInput2 sends RawButton events in addition to the RawMotion events for
> the mouse wheel.
> --
> Rémi Bernon <rbernon at codeweavers.com>
>
>
More information about the wine-devel
mailing list