Module: wine Branch: master Commit: 441522add7943e0bfa3cbd81a9d8f93062ba2b6a URL: https://source.winehq.org/git/wine.git/?a=commit;h=441522add7943e0bfa3cbd81a...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Mar 9 15:22:39 2022 +0100
win32u: Move GetWindowInfo implementation from user32.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/win.c | 21 ++------------------- dlls/win32u/input.c | 8 ++++++++ dlls/win32u/win32u_private.h | 1 + dlls/win32u/window.c | 20 ++++++++++++++++++++ include/ntuser.h | 1 + 5 files changed, 32 insertions(+), 19 deletions(-)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 98396293912..bb792037640 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -3214,26 +3214,9 @@ UINT WINAPI GetWindowModuleFileNameW( HWND hwnd, LPWSTR module, UINT size ) * * Note: tests show that Windows doesn't check cbSize of the structure. */ -BOOL WINAPI DECLSPEC_HOTPATCH GetWindowInfo( HWND hwnd, PWINDOWINFO pwi) +BOOL WINAPI DECLSPEC_HOTPATCH GetWindowInfo( HWND hwnd, WINDOWINFO *info ) { - RECT rcWindow, rcClient; - - if (!WIN_GetRectangles( hwnd, COORDS_SCREEN, &rcWindow, &rcClient )) return FALSE; - if (!pwi) return FALSE; - - pwi->rcWindow = rcWindow; - pwi->rcClient = rcClient; - pwi->dwStyle = GetWindowLongW(hwnd, GWL_STYLE); - pwi->dwExStyle = GetWindowLongW(hwnd, GWL_EXSTYLE); - pwi->dwWindowStatus = ((GetActiveWindow() == hwnd) ? WS_ACTIVECAPTION : 0); - - pwi->cxWindowBorders = pwi->rcClient.left - pwi->rcWindow.left; - pwi->cyWindowBorders = pwi->rcWindow.bottom - pwi->rcClient.bottom; - - pwi->atomWindowType = GetClassLongW( hwnd, GCW_ATOM ); - pwi->wCreatorVersion = 0x0400; - - return TRUE; + return NtUserCallHwndParam( hwnd, (UINT_PTR)info, NtUserGetWindowInfo ); }
/****************************************************************************** diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 72af32fd471..71f30e7ae20 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -1078,3 +1078,11 @@ HWND WINAPI NtUserGetForegroundWindow(void) SERVER_END_REQ; return ret; } + +/* see GetActiveWindow */ +HWND get_active_window(void) +{ + GUITHREADINFO info; + info.cbSize = sizeof(info); + return NtUserGetGUIThreadInfo( GetCurrentThreadId(), &info ) ? info.hwndActive : 0; +} diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 988a009d874..7c8134367c2 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -275,6 +275,7 @@ extern BOOL unhook_windows_hook( INT id, HOOKPROC proc ) DECLSPEC_HIDDEN;
/* input.c */ extern LONG global_key_state_counter DECLSPEC_HIDDEN; +extern HWND get_active_window(void) DECLSPEC_HIDDEN; extern BOOL get_cursor_pos( POINT *pt ) DECLSPEC_HIDDEN; extern DWORD get_input_state(void) DECLSPEC_HIDDEN;
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 84aa052a231..19b2b4335f8 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -1139,6 +1139,24 @@ BOOL get_window_rect( HWND hwnd, RECT *rect ) return get_window_rects( hwnd, COORDS_SCREEN, rect, NULL, get_thread_dpi() ); }
+/* see GetWindowInfo */ +static BOOL get_window_info( HWND hwnd, WINDOWINFO *info ) +{ + + if (!info || !get_window_rects( hwnd, COORDS_SCREEN, &info->rcWindow, + &info->rcClient, get_thread_dpi() )) + return FALSE; + + info->dwStyle = get_window_long( hwnd, GWL_STYLE ); + info->dwExStyle = get_window_long( hwnd, GWL_EXSTYLE ); + info->dwWindowStatus = get_active_window() == hwnd ? WS_ACTIVECAPTION : 0; + info->cxWindowBorders = info->rcClient.left - info->rcWindow.left; + info->cyWindowBorders = info->rcWindow.bottom - info->rcClient.bottom; + info->atomWindowType = get_class_long( hwnd, GCW_ATOM, FALSE ); + info->wCreatorVersion = 0x0400; + return TRUE; +} + /***************************************************************************** * NtUserGetLayeredWindowAttributes (win32u.@) */ @@ -1339,6 +1357,8 @@ ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code ) return get_class_long_ptr( hwnd, param, FALSE ); case NtUserGetClassWord: return get_class_word( hwnd, param ); + case NtUserGetWindowInfo: + return get_window_info( hwnd, (WINDOWINFO *)param ); case NtUserGetWindowLongA: return get_window_long_size( hwnd, param, sizeof(LONG), TRUE ); case NtUserGetWindowLongW: diff --git a/include/ntuser.h b/include/ntuser.h index f5911d112a2..5192bd63a90 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -160,6 +160,7 @@ enum NtUserGetClassLongPtrA, NtUserGetClassLongPtrW, NtUserGetClassWord, + NtUserGetWindowInfo, NtUserGetWindowLongA, NtUserGetWindowLongW, NtUserGetWindowLongPtrA,