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 1106c265402..d26e7f76bfe 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2249,6 +2249,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 2058d0332f7..b15c8ebd9dd 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -183,6 +183,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 35710f862d5..f1c898446b6 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -2232,8 +2232,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 ); }