diff -urN wine-11.16-orig/dlls/winex11.drv/mouse.c wine-11.16/dlls/winex11.drv/mouse.c --- wine-11.16-orig/dlls/winex11.drv/mouse.c 2026-08-22 05:25:07 +0900 +++ wine-11.16/dlls/winex11.drv/mouse.c 2026-09-04 18:01:44 +0900 @@ -479,43 +479,60 @@ } -/* Map the input event coordinates so they're relative to the desktop. */ -static POINT map_event_coords( HWND hwnd, Window window, Window event_root, POINT root, POINT src ) +/* Map the input event coordinates so they're relative to the desktop. + * Return whether the coordinates were inside the window */ +static BOOL map_event_coords( HWND hwnd, Window window, Window event_root, POINT root, POINT src, POINT *dst ) { struct x11drv_thread_data *thread_data; struct x11drv_win_data *data; - POINT dst = src; + BOOL inside; - TRACE( "hwnd %p, window %lx, event_root %lx, root %s, src %s\n", hwnd, window, event_root, - wine_dbgstr_point( &root ), wine_dbgstr_point( &src ) ); + TRACE( "hwnd %p, window %lx, event_root %lx, root %s, src %s, dst %p\n", hwnd, window, event_root, + wine_dbgstr_point( &root ), wine_dbgstr_point( &src ), dst ); - if (window == root_window) dst = root_to_virtual_screen( src.x, src.y ); - else if (event_root == root_window) dst = root_to_virtual_screen( root.x, root.y ); + *dst = src; + inside = TRUE; + data = hwnd ? get_win_data( hwnd ) : NULL; + + if (window == root_window) *dst = root_to_virtual_screen( src.x, src.y ); + else if (event_root == root_window) *dst = root_to_virtual_screen( root.x, root.y ); else if (!hwnd) { thread_data = x11drv_thread_data(); - if (!thread_data->clipping_cursor) return dst; - if (thread_data->clip_window != window) return dst; - dst.x += clip_rect.left; - dst.y += clip_rect.top; + if (thread_data->clipping_cursor && thread_data->clip_window == window) + { + dst->x += clip_rect.left; + dst->y += clip_rect.top; + } } - else if ((data = get_win_data( hwnd ))) + else if (data) { if (window == data->client_window) { - dst.x += data->rects.client.left; - dst.y += data->rects.client.top; + dst->x += data->rects.client.left; + dst->y += data->rects.client.top; + if (dst->x >= data->rects.client.right - data->rects.client.left) + inside = FALSE; + if (dst->y >= data->rects.client.bottom - data->rects.client.top) + inside = FALSE; } else { - dst.x += data->rects.visible.left; - dst.y += data->rects.visible.top; + dst->x += data->rects.visible.left; + dst->y += data->rects.visible.top; + if (dst->x >= data->rects.visible.right - data->rects.visible.left) + inside = FALSE; + if (dst->y >= data->rects.visible.bottom - data->rects.visible.top) + inside = FALSE; } - release_win_data( data ); + if (dst->x < 0 || dst->y < 0) inside = FALSE; } - TRACE( "mapped %s to %s\n", wine_dbgstr_point( &src ), wine_dbgstr_point( &dst ) ); - return dst; + if (data) release_win_data( data ); + + TRACE( "mapped %s to %s (inside=%d)\n", + wine_dbgstr_point( &src ), wine_dbgstr_point( dst ), inside ); + return inside; } static void send_mouse_input( HWND hwnd, POINT pos, UINT flags, UINT data, UINT time, const struct raw_mouse *raw ) @@ -1501,8 +1518,8 @@ release_win_data( data ); } - pt = map_event_coords( hwnd, event->window, event->root, root, pt ); - send_mouse_input( hwnd, pt, MOUSEEVENTF_ABSOLUTE | flags, button_down_data[button], time, NULL ); + if (map_event_coords( hwnd, event->window, event->root, root, pt, &pt )) + send_mouse_input( hwnd, pt, MOUSEEVENTF_ABSOLUTE | flags, button_down_data[button], time, NULL ); return TRUE; } @@ -1520,8 +1537,8 @@ TRACE( "hwnd %p/%lx button %u pos %s\n", hwnd, event->window, button, wine_dbgstr_point( &pt ) ); - pt = map_event_coords( hwnd, event->window, event->root, root, pt ); - send_mouse_input( hwnd, pt, MOUSEEVENTF_ABSOLUTE | flags, button_up_data[button], time, NULL ); + if (map_event_coords( hwnd, event->window, event->root, root, pt, &pt )) + send_mouse_input( hwnd, pt, MOUSEEVENTF_ABSOLUTE | flags, button_up_data[button], time, NULL ); return TRUE; } @@ -1544,7 +1561,7 @@ return FALSE; } - pt = map_event_coords( hwnd, event->window, event->root, root, pt ); + map_event_coords( hwnd, event->window, event->root, root, pt, &pt ); send_mouse_input( hwnd, pt, MOUSEEVENTF_ABSOLUTE, 0, time, NULL ); return TRUE; } @@ -1571,7 +1588,7 @@ return FALSE; } - pt = map_event_coords( hwnd, event->window, event->root, root, pt ); + map_event_coords( hwnd, event->window, event->root, root, pt, &pt ); send_mouse_input( hwnd, pt, MOUSEEVENTF_ABSOLUTE, 0, time, NULL ); return TRUE; } @@ -1687,7 +1704,7 @@ int flags = 0; POINT pos; - pt = map_event_coords( hwnd, event->event, event->root, root, pt ); + map_event_coords( hwnd, event->event, event->root, root, pt, &pt ); pos.x = pt.x * 65535 / (virtual.right - virtual.left); pos.y = pt.y * 65535 / (virtual.bottom - virtual.top);