From: Gabriel Ivăncescu gabrielopcode@gmail.com
Since whole_rect / client_rect are updated asynchronously, there may be a small lag between X11 and Wine regarding the expected window position.
Then, as events' x and y fields are reported relative to the X11 window position, this lag can cause inconsistencies when we compute absolute mouse positions.
Also, applications that control their own position while being moved cause additional whole_rect / client_rect updates, before X11 knows about it.
This can make applications like Winamp go nuts when they are being moved and move all over the place "randomly".
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46309 Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/winex11.drv/mouse.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index 66d7d423a62..57cf0725cdd 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -592,13 +592,14 @@ static BOOL is_old_motion_event( unsigned long serial ) * * Map the input event coordinates so they're relative to the desktop. */ -static void map_event_coords( HWND hwnd, Window window, INPUT *input ) +static void map_event_coords( HWND hwnd, Window window, Window event_root, int x_root, int y_root, INPUT *input ) { struct x11drv_thread_data *thread_data; struct x11drv_win_data *data = NULL; POINT pt = { input->u.mi.dx, input->u.mi.dy };
- TRACE( "hwnd %p, window %lx, input %p\n", hwnd, window, input ); + TRACE( "hwnd %p, window %lx, event_root %lx, x_root %d, y_root %d, input %p\n", hwnd, window, event_root, + x_root, y_root, input );
if (!hwnd) { @@ -610,6 +611,7 @@ static void map_event_coords( HWND hwnd, Window window, INPUT *input ) } else if (!(data = get_win_data( hwnd ))) return; else if (window == root_window) pt = root_to_virtual_screen( pt.x, pt.y ); + else if (event_root == root_window) pt = root_to_virtual_screen( x_root, y_root ); else if (window == data->whole_window) { pt.x += data->whole_rect.left - data->client_rect.left; @@ -1704,7 +1706,7 @@ BOOL X11DRV_ButtonPress( HWND hwnd, XEvent *xev ) input.u.mi.dwExtraInfo = 0;
update_user_time( event->time ); - map_event_coords( hwnd, event->window, &input ); + map_event_coords( hwnd, event->window, event->root, event->x_root, event->y_root, &input ); send_mouse_input( hwnd, event->window, event->state, &input ); return TRUE; } @@ -1730,7 +1732,7 @@ BOOL X11DRV_ButtonRelease( HWND hwnd, XEvent *xev ) input.u.mi.time = EVENT_x11_time_to_win32_time( event->time ); input.u.mi.dwExtraInfo = 0;
- map_event_coords( hwnd, event->window, &input ); + map_event_coords( hwnd, event->window, event->root, event->x_root, event->y_root, &input ); send_mouse_input( hwnd, event->window, event->state, &input ); return TRUE; } @@ -1759,7 +1761,7 @@ BOOL X11DRV_MotionNotify( HWND hwnd, XEvent *xev ) TRACE( "pos %d,%d old serial %lu, ignoring\n", input.u.mi.dx, input.u.mi.dy, event->serial ); return FALSE; } - map_event_coords( hwnd, event->window, &input ); + map_event_coords( hwnd, event->window, event->root, event->x_root, event->y_root, &input ); send_mouse_input( hwnd, event->window, event->state, &input ); return TRUE; } @@ -1791,7 +1793,7 @@ BOOL X11DRV_EnterNotify( HWND hwnd, XEvent *xev ) TRACE( "pos %d,%d old serial %lu, ignoring\n", input.u.mi.dx, input.u.mi.dy, event->serial ); return FALSE; } - map_event_coords( hwnd, event->window, &input ); + map_event_coords( hwnd, event->window, event->root, event->x_root, event->y_root, &input ); send_mouse_input( hwnd, event->window, event->state, &input ); return TRUE; }