From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 23 +++++++++++++++++++++++ dlls/win32u/win32u_private.h | 1 + dlls/win32u/window.c | 8 +++++++- 3 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index a5e6a244264..2522ade91e4 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2248,6 +2248,29 @@ RECT map_dpi_rect( RECT rect, UINT dpi_from, UINT dpi_to ) return rect; }
+/********************************************************************** + * map_dpi_region + */ +HRGN map_dpi_region( HRGN hrgn, UINT dpi_from, UINT dpi_to ) +{ + RGNDATA *data; + UINT i, size; + + if (!(size = NtGdiGetRegionData( hrgn, 0, NULL ))) return 0; + if (!(data = malloc( size ))) return 0; + NtGdiGetRegionData( hrgn, size, data ); + + if (dpi_from && dpi_to && dpi_from != dpi_to) + { + RECT *rects = (RECT *)data->Buffer; + for (i = 0; i < data->rdh.nCount; i++) rects[i] = map_dpi_rect( rects[i], dpi_from, dpi_to ); + } + + hrgn = NtGdiExtCreateRegion( NULL, data->rdh.dwSize + data->rdh.nRgnSize, data ); + free( data ); + return hrgn; +} + /********************************************************************** * map_dpi_point */ diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 47b50c87f14..0fce687cb18 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -182,6 +182,7 @@ extern RECT get_virtual_screen_rect( UINT dpi ); extern BOOL is_exiting_thread( DWORD tid ); 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 ); extern BOOL message_beep( UINT i ); extern POINT point_phys_to_win_dpi( HWND hwnd, POINT pt ); extern POINT point_thread_to_win_dpi( HWND hwnd, POINT pt ); diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index f17e45231ad..f80cb64f204 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -2233,8 +2233,14 @@ int WINAPI NtUserSetWindowRgn( HWND hwnd, HRGN hrgn, BOOL redraw ) { UINT swp_flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE; + HRGN monitor_hrgn; + if (!redraw) swp_flags |= SWP_NOREDRAW; - user_driver->pSetWindowRgn( hwnd, hrgn, redraw ); + + monitor_hrgn = map_dpi_region( hrgn, get_thread_dpi(), get_win_monitor_dpi( hwnd ) ); + user_driver->pSetWindowRgn( hwnd, monitor_hrgn, redraw ); + if (monitor_hrgn) NtGdiDeleteObjectApp( monitor_hrgn ); + NtUserSetWindowPos( hwnd, 0, 0, 0, 0, 0, swp_flags ); if (hrgn) NtGdiDeleteObjectApp( hrgn ); }