mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
aa8b27c396
This update supersede user32-rawinput-mouse-experimental, removing.
92 lines
3.8 KiB
Diff
92 lines
3.8 KiB
Diff
From 63298efb1ad8f04f38f7e1bc518bec7786192d26 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
|
|
Date: Fri, 8 Mar 2024 11:11:27 +0100
|
|
Subject: [PATCH 7/7] winex11: Send relative RawMotion events position
|
|
unprocessed.
|
|
|
|
This makes relative raw input independent from cursor speed, as it is
|
|
the case on Windows. Absolute raw input is already translated to
|
|
virtual desktop space, and cursor speed is meaningless in this case.
|
|
|
|
This does not support mixed relative/absolute X/Y axis.
|
|
---
|
|
dlls/winex11.drv/mouse.c | 20 +++++++++++++++-----
|
|
1 file changed, 15 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
|
|
index 6557331df22..d26ed5d794b 100644
|
|
--- a/dlls/winex11.drv/mouse.c
|
|
+++ b/dlls/winex11.drv/mouse.c
|
|
@@ -1763,13 +1763,13 @@ static BOOL X11DRV_DeviceChanged( XGenericEventCookie *xev )
|
|
return TRUE;
|
|
}
|
|
|
|
-static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
|
|
+static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input, BOOL send_raw )
|
|
{
|
|
struct x11drv_thread_data *thread_data = x11drv_thread_data();
|
|
XIValuatorClassInfo *x = &thread_data->x_valuator, *y = &thread_data->y_valuator;
|
|
+ const double *values = event->valuators.values, *raw_values = event->raw_values;
|
|
const UINT absolute_flags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK;
|
|
- double x_value = 0, y_value = 0, x_scale, y_scale;
|
|
- const double *values = event->valuators.values;
|
|
+ double x_raw = 0, y_raw = 0, x_value = 0, y_value = 0, x_scale, y_scale;
|
|
RECT virtual_rect;
|
|
int i;
|
|
|
|
@@ -1798,16 +1798,19 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
|
|
if (!XIMaskIsSet( event->valuators.mask, i )) continue;
|
|
if (i == x->number)
|
|
{
|
|
+ x_raw = *raw_values;
|
|
x_value = *values;
|
|
if (x->mode == XIModeRelative) x->value += x_value * x_scale;
|
|
else x->value = (x_value - x->min) * x_scale;
|
|
}
|
|
if (i == y->number)
|
|
{
|
|
+ y_raw = *raw_values;
|
|
y_value = *values;
|
|
if (y->mode == XIModeRelative) y->value += y_value * y_scale;
|
|
else y->value = (y_value - y->min) * y_scale;
|
|
}
|
|
+ raw_values++;
|
|
values++;
|
|
}
|
|
|
|
@@ -1818,6 +1821,13 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
|
|
TRACE( "event %f,%f value %f,%f absolute input %d,%d\n", x_value, y_value, x->value, y->value,
|
|
(int)input->mi.dx, (int)input->mi.dy );
|
|
}
|
|
+ else if (send_raw)
|
|
+ {
|
|
+ input->mi.dx = round( x_raw );
|
|
+ input->mi.dy = round( y_raw );
|
|
+ TRACE( "event %f,%f raw value %f,%f, raw input %d,%d\n", x_value, y_value, x_raw, y_raw,
|
|
+ (int)input->mi.dx, (int)input->mi.dy );
|
|
+ }
|
|
else if (!(input->mi.dx = round( x->value )) && !(input->mi.dy = round( y->value )))
|
|
{
|
|
TRACE( "event %f,%f value %f,%f, accumulating motion\n", x_value, y_value, x->value, y->value );
|
|
@@ -1857,7 +1867,7 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
|
|
input.mi.dwExtraInfo = 0;
|
|
input.mi.dx = 0;
|
|
input.mi.dy = 0;
|
|
- if (!map_raw_event_coords( event, &input )) return FALSE;
|
|
+ if (!map_raw_event_coords( event, &input, flags & SEND_HWMSG_NO_MSG )) return FALSE;
|
|
if (!(input.mi.dwFlags & MOUSEEVENTF_MOVE)) return FALSE;
|
|
|
|
NtUserSendHardwareInput( 0, flags, &input, 0 );
|
|
@@ -1906,7 +1916,7 @@ static BOOL X11DRV_RawButtonEvent( XGenericEventCookie *cookie )
|
|
input.mi.dwExtraInfo = 0;
|
|
input.mi.dx = 0;
|
|
input.mi.dy = 0;
|
|
- map_raw_event_coords( event, &input );
|
|
+ map_raw_event_coords( event, &input, TRUE );
|
|
|
|
NtUserSendHardwareInput( 0, SEND_HWMSG_NO_MSG, &input, 0 );
|
|
return TRUE;
|
|
--
|
|
2.43.0
|
|
|