Module: wine Branch: master Commit: 700b6182a48f1ee066392dc5bba14d7dcf9cf22b URL: https://source.winehq.org/git/wine.git/?a=commit;h=700b6182a48f1ee066392dc5b... Author: Alexandre Julliard <julliard(a)winehq.org> Date: Fri Aug 24 12:27:26 2018 +0200 user32: Switch to the window DPI awareness for non-client painting. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/painting.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c index 66e69f4..313c5fa 100644 --- a/dlls/user32/painting.c +++ b/dlls/user32/painting.c @@ -421,11 +421,14 @@ static void make_dc_dirty( struct dce *dce ) */ void invalidate_dce( WND *win, const RECT *extra_rect ) { + DPI_AWARENESS_CONTEXT context; RECT window_rect; struct dce *dce; if (!win->parent) return; + context = SetThreadDpiAwarenessContext( GetWindowDpiAwarenessContext( win->obj.handle )); + GetWindowRect( win->obj.handle, &window_rect ); TRACE("%p parent %p %s (%s)\n", @@ -460,6 +463,7 @@ void invalidate_dce( WND *win, const RECT *extra_rect ) make_dc_dirty( dce ); } } + SetThreadDpiAwarenessContext( context ); } /*********************************************************************** @@ -652,9 +656,12 @@ static HRGN send_ncpaint( HWND hwnd, HWND *child, UINT *flags ) if (whole_rgn) { + DPI_AWARENESS_CONTEXT context; RECT client, window, update; INT type; + context = SetThreadDpiAwarenessContext( GetWindowDpiAwarenessContext( hwnd )); + /* check if update rgn overlaps with nonclient area */ type = GetRgnBox( whole_rgn, &update ); WIN_GetRectangles( hwnd, COORDS_SCREEN, &window, &client ); @@ -684,6 +691,7 @@ static HRGN send_ncpaint( HWND hwnd, HWND *child, UINT *flags ) if (*flags & UPDATE_NONCLIENT) SendMessageW( hwnd, WM_NCPAINT, (WPARAM)whole_rgn, 0 ); if (whole_rgn > (HRGN)1) DeleteObject( whole_rgn ); } + SetThreadDpiAwarenessContext( context ); } return client_rgn; } @@ -1364,10 +1372,13 @@ BOOL WINAPI ValidateRect( HWND hwnd, const RECT *rect ) */ INT WINAPI GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase ) { + DPI_AWARENESS_CONTEXT context; INT retval = ERROR; UINT flags = UPDATE_NOCHILDREN; HRGN update_rgn; + context = SetThreadDpiAwarenessContext( GetWindowDpiAwarenessContext( hwnd )); + if (erase) flags |= UPDATE_NONCLIENT | UPDATE_ERASE; if ((update_rgn = send_ncpaint( hwnd, NULL, &flags ))) @@ -1381,6 +1392,7 @@ INT WINAPI GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase ) /* map region to client coordinates */ map_window_region( 0, hwnd, hrgn ); } + SetThreadDpiAwarenessContext( context ); return retval; } @@ -1390,6 +1402,7 @@ INT WINAPI GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase ) */ BOOL WINAPI GetUpdateRect( HWND hwnd, LPRECT rect, BOOL erase ) { + DPI_AWARENESS_CONTEXT context; UINT flags = UPDATE_NOCHILDREN; HRGN update_rgn; BOOL need_erase; @@ -1404,7 +1417,10 @@ BOOL WINAPI GetUpdateRect( HWND hwnd, LPRECT rect, BOOL erase ) { HDC hdc = GetDCEx( hwnd, 0, DCX_USESTYLE ); DWORD layout = SetLayout( hdc, 0 ); /* MapWindowPoints mirrors already */ + context = SetThreadDpiAwarenessContext( GetWindowDpiAwarenessContext( hwnd )); MapWindowPoints( 0, hwnd, (LPPOINT)rect, 2 ); + SetThreadDpiAwarenessContext( context ); + *rect = rect_win_to_thread_dpi( hwnd, *rect ); DPtoLP( hdc, (LPPOINT)rect, 2 ); SetLayout( hdc, layout ); ReleaseDC( hwnd, hdc ); @@ -1429,12 +1445,15 @@ INT WINAPI ExcludeUpdateRgn( HDC hdc, HWND hwnd ) if (ret != ERROR) { + DPI_AWARENESS_CONTEXT context; POINT pt; + context = SetThreadDpiAwarenessContext( GetWindowDpiAwarenessContext( hwnd )); GetDCOrgEx( hdc, &pt ); MapWindowPoints( 0, hwnd, &pt, 1 ); OffsetRgn( update_rgn, -pt.x, -pt.y ); ret = ExtSelectClipRgn( hdc, update_rgn, RGN_DIFF ); + SetThreadDpiAwarenessContext( context ); } DeleteObject( update_rgn ); return ret;