diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c index cabfe471e9d..94e462605dd 100644 --- a/dlls/user32/painting.c +++ b/dlls/user32/painting.c @@ -240,31 +240,6 @@ BOOL WINAPI ValidateRect( HWND hwnd, const RECT *rect ) } -/*********************************************************************** - * ExcludeUpdateRgn (USER32.@) - */ -INT WINAPI ExcludeUpdateRgn( HDC hdc, HWND hwnd ) -{ - HRGN update_rgn = CreateRectRgn( 0, 0, 0, 0 ); - INT ret = NtUserGetUpdateRgn( hwnd, update_rgn, FALSE ); - - 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; -} - - static INT scroll_window( HWND hwnd, INT dx, INT dy, const RECT *rect, const RECT *clipRect, HRGN hrgnUpdate, LPRECT rcUpdate, UINT flags, BOOL is_ex ) { diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index af63ae007a1..fcc17aae18e 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -237,7 +237,7 @@ @ stdcall EnumWindowStationsW(ptr long) @ stdcall EnumWindows(ptr long) @ stdcall EqualRect(ptr ptr) -@ stdcall ExcludeUpdateRgn(long long) +@ stdcall ExcludeUpdateRgn(long long) NtUserExcludeUpdateRgn @ stdcall ExitWindowsEx(long long) @ stdcall FillRect(long ptr long) @ stdcall FindWindowA(str str) diff --git a/dlls/win32u/dce.c b/dlls/win32u/dce.c index f0545c8bba4..740c7441a49 100644 --- a/dlls/win32u/dce.c +++ b/dlls/win32u/dce.c @@ -1546,3 +1546,27 @@ BOOL WINAPI NtUserGetUpdateRect( HWND hwnd, RECT *rect, BOOL erase ) if (need_erase) flags |= UPDATE_DELAYED_ERASE; return get_update_flags( hwnd, NULL, &flags ) && (flags & UPDATE_PAINT); } + +/*********************************************************************** + * NtUserExcludeUpdateRgn (win32u.@) + */ +INT WINAPI NtUserExcludeUpdateRgn( HDC hdc, HWND hwnd ) +{ + HRGN update_rgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); + INT ret = NtUserGetUpdateRgn( hwnd, update_rgn, FALSE ); + + if (ret != ERROR) + { + DPI_AWARENESS_CONTEXT context; + POINT pt; + + context = set_thread_dpi_awareness_context( get_window_dpi_awareness_context( hwnd )); + NtGdiGetDCPoint( hdc, NtGdiGetDCOrg, &pt ); + map_window_points( 0, hwnd, &pt, 1, get_thread_dpi() ); + NtGdiOffsetRgn( update_rgn, -pt.x, -pt.y ); + ret = NtGdiExtSelectClipRgn( hdc, update_rgn, RGN_DIFF ); + set_thread_dpi_awareness_context( context ); + } + NtGdiDeleteObjectApp( update_rgn ); + return ret; +} diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index d71807c8c04..d5538848a4f 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1155,6 +1155,7 @@ static struct unix_funcs unix_funcs = NtUserEnumDisplayDevices, NtUserEnumDisplayMonitors, NtUserEnumDisplaySettings, + NtUserExcludeUpdateRgn, NtUserFlashWindowEx, NtUserGetAsyncKeyState, NtUserGetClassInfoEx, diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 8c2073d0fb1..0bc95daafc8 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -879,7 +879,7 @@ @ stdcall NtUserEnumDisplayMonitors(long ptr ptr long) @ stdcall NtUserEnumDisplaySettings(ptr long ptr long) @ stub NtUserEvent -@ stub NtUserExcludeUpdateRgn +@ stdcall NtUserExcludeUpdateRgn(long long) @ stub NtUserFillWindow @ stdcall -syscall NtUserFindExistingCursorIcon(ptr ptr ptr) @ stub NtUserFindWindowEx diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 1ebb60ad6ca..69ddcc83c47 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -217,6 +217,7 @@ struct unix_funcs BOOL (WINAPI *pNtUserEnumDisplayMonitors)( HDC hdc, RECT *rect, MONITORENUMPROC proc, LPARAM lp ); BOOL (WINAPI *pNtUserEnumDisplaySettings)( UNICODE_STRING *device, DWORD mode, DEVMODEW *dev_mode, DWORD flags ); + INT (WINAPI *pNtUserExcludeUpdateRgn)( HDC hdc, HWND hwnd ); BOOL (WINAPI *pNtUserFlashWindowEx)( FLASHWINFO *info ); SHORT (WINAPI *pNtUserGetAsyncKeyState)( INT key ); ATOM (WINAPI *pNtUserGetClassInfoEx)( HINSTANCE instance, UNICODE_STRING *name, WNDCLASSEXW *wc, diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index f29d78c2c52..b5c2b49ce79 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -852,6 +852,12 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD mode, return unix_funcs->pNtUserEnumDisplaySettings( device, mode, dev_mode, flags ); } +INT WINAPI NtUserExcludeUpdateRgn( HDC hdc, HWND hwnd ) +{ + if (!unix_funcs) return ERROR; + return unix_funcs->pNtUserExcludeUpdateRgn( hdc, hwnd ); +} + BOOL WINAPI NtUserFlashWindowEx( FLASHWINFO *info ) { if (!unix_funcs) return FALSE; diff --git a/include/ntuser.h b/include/ntuser.h index eed7e4e78c2..efabbe64ad7 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -436,6 +436,7 @@ NTSTATUS WINAPI NtUserEnumDisplayDevices( UNICODE_STRING *device, DWORD index, BOOL WINAPI NtUserEnumDisplayMonitors( HDC hdc, RECT *rect, MONITORENUMPROC proc, LPARAM lp ); BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD mode, DEVMODEW *dev_mode, DWORD flags ); +INT WINAPI NtUserExcludeUpdateRgn( HDC hdc, HWND hwnd ); HICON WINAPI NtUserFindExistingCursorIcon( UNICODE_STRING *module, UNICODE_STRING *res_name, void *desc ); BOOL WINAPI NtUserFlashWindowEx( FLASHWINFO *info );