From: Rémi Bernon <rbernon(a)codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58844 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58443 --- dlls/win32u/window.c | 28 +++++++++++++++++++++++++--- dlls/wow64win/user.c | 18 +++++++++++++++--- include/ntuser.h | 19 +++++++++++++------ 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 66d270fd3a2..a5094e82de5 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -5992,6 +5992,19 @@ static BOOL set_raw_window_pos( HWND hwnd, RECT rect, UINT flags, BOOL internal return NtUserSetWindowPos( hwnd, 0, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, flags ); } +static BOOL get_present_rect( HWND hwnd, RECT *rect, UINT dpi ) +{ + UINT dpi_from = get_dpi_for_window( hwnd ); + WND *win; + + if (!(win = get_win_ptr( hwnd )) || win == WND_OTHER_PROCESS || win == WND_DESKTOP) return FALSE; + if (dpi != -1) *rect = map_dpi_rect( win->present_rect, dpi_from, dpi ); + else *rect = map_rect_virt_to_raw( win->present_rect, dpi_from ); + release_win_ptr( win ); + + return !IsRectEmpty( rect ); +} + /***************************************************************************** * NtUserCallHwnd (win32u.@) */ @@ -6111,11 +6124,20 @@ ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code ) case NtUserCallHwndParam_GetWindowLongPtrW: return get_window_long_ptr( hwnd, param, FALSE ); - case NtUserCallHwndParam_GetWindowRects: + case NtUserCallHwndParam_GetWindowRect: + { + struct get_window_rects_params *params = (void *)param; + return get_window_rect( hwnd, params->rect, params->dpi ); + } + case NtUserCallHwndParam_GetClientRect: + { + struct get_window_rects_params *params = (void *)param; + return get_client_rect( hwnd, params->rect, params->dpi ); + } + case NtUserCallHwndParam_GetPresentRect: { struct get_window_rects_params *params = (void *)param; - return params->client ? get_client_rect( hwnd, params->rect, params->dpi ) - : get_window_rect( hwnd, params->rect, params->dpi ); + return get_present_rect( hwnd, params->rect, params->dpi ); } case NtUserCallHwndParam_GetWindowRelative: diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index b728e7c01d7..8304517fbf7 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1681,18 +1681,30 @@ NTSTATUS WINAPI wow64_NtUserCallHwndParam( UINT *args ) return NtUserCallHwndParam( hwnd, (UINT_PTR)&info, code ); } - case NtUserCallHwndParam_GetWindowRects: + case NtUserCallHwndParam_GetWindowRect: + { + struct + { + ULONG rect; + UINT dpi; + } *params32 = UlongToPtr( param ); + struct get_window_rects_params params; + + params.rect = UlongToPtr( params32->rect ); + params.dpi = params32->dpi; + return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, code ); + } + + case NtUserCallHwndParam_GetClientRect: { struct { ULONG rect; - BOOL client; UINT dpi; } *params32 = UlongToPtr( param ); struct get_window_rects_params params; params.rect = UlongToPtr( params32->rect ); - params.client = params32->client; params.dpi = params32->dpi; return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, code ); } diff --git a/include/ntuser.h b/include/ntuser.h index 78eee8f17d5..068055a87cf 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -1404,7 +1404,9 @@ enum NtUserCallHwndParam_GetWindowLongW, NtUserCallHwndParam_GetWindowLongPtrA, NtUserCallHwndParam_GetWindowLongPtrW, - NtUserCallHwndParam_GetWindowRects, + NtUserCallHwndParam_GetWindowRect, + NtUserCallHwndParam_GetClientRect, + NtUserCallHwndParam_GetPresentRect, NtUserCallHwndParam_GetWindowRelative, NtUserCallHwndParam_GetWindowThread, NtUserCallHwndParam_GetWindowWord, @@ -1424,7 +1426,6 @@ enum struct get_window_rects_params { RECT *rect; - BOOL client; UINT dpi; }; @@ -1465,8 +1466,14 @@ static inline WORD NtUserGetClassWord( HWND hwnd, INT offset ) static inline BOOL NtUserGetClientRect( HWND hwnd, RECT *rect, UINT dpi ) { - struct get_window_rects_params params = {.rect = rect, .client = TRUE, .dpi = dpi}; - return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, NtUserCallHwndParam_GetWindowRects ); + struct get_window_rects_params params = {.rect = rect, .dpi = dpi}; + return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, NtUserCallHwndParam_GetClientRect ); +} + +static inline BOOL NtUserGetPresentRect( HWND hwnd, RECT *rect, UINT dpi ) +{ + struct get_window_rects_params params = {.rect = rect, .dpi = dpi}; + return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, NtUserCallHwndParam_GetPresentRect ); } struct get_scroll_info_params @@ -1508,8 +1515,8 @@ static inline LONG NtUserGetWindowLongW( HWND hwnd, INT offset ) static inline BOOL NtUserGetWindowRect( HWND hwnd, RECT *rect, UINT dpi ) { - struct get_window_rects_params params = {.rect = rect, .client = FALSE, .dpi = dpi}; - return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, NtUserCallHwndParam_GetWindowRects ); + struct get_window_rects_params params = {.rect = rect, .dpi = dpi}; + return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, NtUserCallHwndParam_GetWindowRect ); } static inline HWND NtUserGetWindowRelative( HWND hwnd, UINT rel ) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9721