From: Dmitry Timoshkov dmitry@baikal.ru
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/win32u/dce.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/dlls/win32u/dce.c b/dlls/win32u/dce.c index 6ff79c7b13a..9572053aa55 100644 --- a/dlls/win32u/dce.c +++ b/dlls/win32u/dce.c @@ -1446,14 +1446,21 @@ BOOL WINAPI NtUserGetUpdateRect( HWND hwnd, RECT *rect, BOOL erase )
if (rect && NtGdiGetRgnBox( update_rgn, rect ) != NULLREGION) { - HDC hdc = NtUserGetDCEx( hwnd, 0, DCX_USESTYLE ); - DWORD layout = NtGdiSetLayout( hdc, -1, 0 ); /* map_window_points mirrors already */ UINT win_dpi = get_dpi_for_window( hwnd ); - map_window_points( 0, hwnd, (POINT *)rect, 2, win_dpi ); - *rect = map_dpi_rect( *rect, win_dpi, get_thread_dpi() ); - NtGdiTransformPoints( hdc, (POINT *)rect, (POINT *)rect, 2, NtGdiDPtoLP ); - NtGdiSetLayout( hdc, -1, layout ); - NtUserReleaseDC( hwnd, hdc ); + RECT client_rect; + + get_window_rects( hwnd, COORDS_SCREEN, NULL, &client_rect, win_dpi ); + if (intersect_rect( rect, rect, &client_rect)) + { + HDC hdc = NtUserGetDCEx( hwnd, 0, DCX_USESTYLE ); + DWORD layout = NtGdiSetLayout( hdc, -1, 0 ); /* map_window_points mirrors already */ + + map_window_points( 0, hwnd, (POINT *)rect, 2, win_dpi ); + *rect = map_dpi_rect( *rect, win_dpi, get_thread_dpi() ); + NtGdiTransformPoints( hdc, (POINT *)rect, (POINT *)rect, 2, NtGdiDPtoLP ); + NtGdiSetLayout( hdc, -1, layout ); + NtUserReleaseDC( hwnd, hdc ); + } } need_erase = send_erase( hwnd, flags, update_rgn, NULL, NULL );