From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/input.c | 27 ++++++++++++++++----------- dlls/win32u/sysparams.c | 26 -------------------------- dlls/win32u/win32u_private.h | 1 - 3 files changed, 16 insertions(+), 38 deletions(-)
diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 252ae78e6a0..084ee561f30 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -2640,6 +2640,12 @@ static BOOL is_captured_by_system(void) return NtUserGetGUIThreadInfo( GetCurrentThreadId(), &info ) && info.hwndCapture && (info.flags & (GUI_INMOVESIZE | GUI_INMENUMODE)); }
+static BOOL is_fullscreen( const MONITORINFO *info, const RECT *rect ) +{ + return rect->left <= info->rcMonitor.left && rect->right >= info->rcMonitor.right && + rect->top <= info->rcMonitor.top && rect->bottom >= info->rcMonitor.bottom; +} + /*********************************************************************** * clip_fullscreen_window * @@ -2649,9 +2655,9 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset ) { struct user_thread_info *thread_info = get_user_thread_info(); MONITORINFO monitor_info = {.cbSize = sizeof(MONITORINFO)}; - RECT rect, virtual_rect; + RECT monitor_rect, window_rect, virtual_rect; DWORD style; - UINT dpi, ctx; + UINT ctx; BOOL ret;
if (hwnd == NtUserGetDesktopWindow()) return FALSE; @@ -2663,19 +2669,18 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset ) /* maximized windows don't count as full screen */ if ((style & WS_MAXIMIZE) && (style & WS_CAPTION) == WS_CAPTION) return FALSE;
- dpi = get_dpi_for_window( hwnd ); - if (!get_window_rect( hwnd, &rect, dpi )) return FALSE; - if (!is_window_rect_full_screen( &rect, dpi )) return FALSE; - if (is_captured_by_system()) return FALSE; - if (NtGetTickCount() - thread_info->clipping_reset < 1000) return FALSE; - if (!reset && clipping_cursor && thread_info->clipping_cursor) return FALSE; /* already clipping */ - ctx = set_thread_dpi_awareness_context( NTUSER_DPI_PER_MONITOR_AWARE ); + ret = get_window_rect( hwnd, &window_rect, get_thread_dpi() ); monitor_info = monitor_info_from_window( hwnd, MONITOR_DEFAULTTONEAREST ); virtual_rect = get_virtual_screen_rect( get_thread_dpi(), MDT_DEFAULT ); - rect = map_rect_virt_to_raw( monitor_info.rcMonitor, get_thread_dpi() ); + monitor_rect = map_rect_virt_to_raw( monitor_info.rcMonitor, get_thread_dpi() ); set_thread_dpi_awareness_context( ctx );
+ if (!ret || !is_fullscreen( &monitor_info, &window_rect )) return FALSE; + if (is_captured_by_system()) return FALSE; + if (NtGetTickCount() - thread_info->clipping_reset < 1000) return FALSE; + if (!reset && clipping_cursor && thread_info->clipping_cursor) return FALSE; /* already clipping */ + if (!grab_fullscreen) { if (!EqualRect( &monitor_info.rcMonitor, &virtual_rect )) return FALSE; @@ -2687,7 +2692,7 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset ) SERVER_START_REQ( set_cursor ) { req->flags = SET_CURSOR_CLIP | SET_CURSOR_FSCLIP; - req->clip = wine_server_rectangle( rect ); + req->clip = wine_server_rectangle( monitor_rect ); ret = !wine_server_call( req ); } SERVER_END_REQ; diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 93009f6e1e0..48b6e034be1 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2929,32 +2929,6 @@ RECT get_virtual_screen_rect( UINT dpi, MONITOR_DPI_TYPE type ) return rect; }
-BOOL is_window_rect_full_screen( const RECT *rect, UINT dpi ) -{ - struct monitor *monitor; - BOOL ret = FALSE; - - if (!lock_display_devices( FALSE )) return FALSE; - - LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry ) - { - RECT monrect; - - if (!is_monitor_active( monitor ) || monitor->is_clone) continue; - - monrect = monitor_get_rect( monitor, dpi, MDT_DEFAULT ); - if (rect->left <= monrect.left && rect->right >= monrect.right && - rect->top <= monrect.top && rect->bottom >= monrect.bottom) - { - ret = TRUE; - break; - } - } - - unlock_display_devices(); - return ret; -} - static UINT get_display_index( const UNICODE_STRING *name ) { static const WCHAR displayW[] = {'\','\','.','\','D','I','S','P','L','A','Y'}; diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index ba0a9834d9f..7bbbef49ebc 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -169,7 +169,6 @@ extern UINT set_thread_dpi_awareness_context( UINT context ); extern UINT get_thread_dpi_awareness_context(void); extern RECT get_virtual_screen_rect( UINT dpi, MONITOR_DPI_TYPE type ); extern BOOL is_exiting_thread( DWORD tid ); -extern BOOL is_window_rect_full_screen( const RECT *rect, UINT dpi ); extern POINT map_dpi_point( POINT pt, UINT dpi_from, UINT dpi_to ); extern RECT map_dpi_rect( RECT rect, UINT dpi_from, UINT dpi_to ); extern HRGN map_dpi_region( HRGN region, UINT dpi_from, UINT dpi_to );