From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/mdi.c | 20 ++------------------ dlls/user32/win.c | 24 +++--------------------- dlls/user32/win.h | 2 -- dlls/win32u/window.c | 8 ++++++++ include/ntuser.h | 12 ++++++++++++ 5 files changed, 25 insertions(+), 41 deletions(-)
diff --git a/dlls/user32/mdi.c b/dlls/user32/mdi.c index d8d26a3b2f1..12dd61c5376 100644 --- a/dlls/user32/mdi.c +++ b/dlls/user32/mdi.c @@ -194,22 +194,7 @@ const struct builtin_class_descr MDICLIENT_builtin_class =
static MDICLIENTINFO *get_client_info( HWND client ) { - MDICLIENTINFO *ret = NULL; - WND *win = WIN_GetPtr( client ); - if (win) - { - if (win == WND_OTHER_PROCESS || win == WND_DESKTOP) - { - if (IsWindow(client)) WARN( "client %p belongs to other process\n", client ); - return NULL; - } - if (win->flags & WIN_ISMDICLIENT) - ret = ((MDICLIENTINFO **)win->wExtra)[1]; - else - WARN( "%p is not an MDI client\n", client ); - WIN_ReleasePtr( win ); - } - return ret; + return NtUserGetMDIClientInfo( client ); }
static BOOL is_close_enabled(HWND hwnd, HMENU hSysMenu) @@ -1038,8 +1023,7 @@ LRESULT MDIClientWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM if (message == WM_NCCREATE) { if (!(ci = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ci) ))) return 0; - SetWindowLongPtrW( hwnd, sizeof(void *), (ULONG_PTR)ci ); - win_set_flags( hwnd, WIN_ISMDICLIENT, 0 ); + NtUserSetMDIClientInfo( hwnd, ci ); } return unicode ? DefWindowProcW( hwnd, message, wParam, lParam ) : DefWindowProcA( hwnd, message, wParam, lParam ); diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 23263166eeb..5cbef6d2342 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -128,7 +128,7 @@ BOOL is_desktop_window( HWND hwnd ) * or WND_OTHER_PROCESS if handle may be valid in other process. * If ret value is a valid pointer, it must be released with WIN_ReleasePtr. */ -WND *WIN_GetPtr( HWND hwnd ) +static WND *WIN_GetPtr( HWND hwnd ) { WND *ptr = (void *)NtUserCallTwoParam( HandleToUlong(hwnd), NTUSER_OBJ_WINDOW, NtUserGetHandlePtr ); if (ptr == WND_OTHER_PROCESS && is_desktop_window( hwnd )) ptr = WND_DESKTOP; @@ -139,7 +139,7 @@ WND *WIN_GetPtr( HWND hwnd ) /*********************************************************************** * WIN_ReleasePtr */ -void WIN_ReleasePtr( WND *ptr ) +static void WIN_ReleasePtr( WND *ptr ) { assert( ptr && ptr != OBJ_OTHER_PROCESS ); NtUserCallOneParam( 1, NtUserLock ); @@ -168,24 +168,6 @@ HWND WIN_IsCurrentThread( HWND hwnd ) }
-/*********************************************************************** - * win_set_flags - * - * Set the flags of a window and return the previous value. - */ -UINT win_set_flags( HWND hwnd, UINT set_mask, UINT clear_mask ) -{ - UINT ret; - WND *ptr = WIN_GetPtr( hwnd ); - - if (!ptr || ptr == WND_OTHER_PROCESS || ptr == WND_DESKTOP) return 0; - ret = ptr->flags; - ptr->flags = (ret & ~clear_mask) | set_mask; - WIN_ReleasePtr( ptr ); - return ret; -} - - /*********************************************************************** * WIN_GetFullHandle * @@ -494,7 +476,7 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module, POINT pos[2]; UINT id = 0;
- if (!(win_get_flags( cs->hwndParent ) & WIN_ISMDICLIENT)) + if (!NtUserGetMDIClientInfo( cs->hwndParent )) { WARN("WS_EX_MDICHILD, but parent %p is not MDIClient\n", cs->hwndParent); return 0; diff --git a/dlls/user32/win.h b/dlls/user32/win.h index 8ef090fe983..5b744ade004 100644 --- a/dlls/user32/win.h +++ b/dlls/user32/win.h @@ -36,8 +36,6 @@ struct tagDIALOGINFO; /* Window functions */ extern HWND get_hwnd_message_parent(void) DECLSPEC_HIDDEN; extern BOOL is_desktop_window( HWND hwnd ) DECLSPEC_HIDDEN; -extern WND *WIN_GetPtr( HWND hwnd ) DECLSPEC_HIDDEN; -extern void WIN_ReleasePtr( WND *ptr ) DECLSPEC_HIDDEN; extern HWND WIN_GetFullHandle( HWND hwnd ) DECLSPEC_HIDDEN; extern HWND WIN_IsCurrentProcess( HWND hwnd ) DECLSPEC_HIDDEN; extern HWND WIN_IsCurrentThread( HWND hwnd ) DECLSPEC_HIDDEN; diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 41cfde752c7..ef8d3dea19e 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -5410,6 +5410,10 @@ ULONG_PTR WINAPI NtUserCallHwnd( HWND hwnd, DWORD code ) case NtUserCallHwnd_GetDialogInfo: return (ULONG_PTR)get_dialog_info( hwnd );
+ case NtUserCallHwnd_GetMDIClientInfo: + if (!(win_get_flags( hwnd ) & WIN_ISMDICLIENT)) return 0; + return get_window_long_ptr( hwnd, sizeof(void *), FALSE ); + case NtUserCallHwnd_GetWindowContextHelpId: return get_window_context_help_id( hwnd );
@@ -5548,6 +5552,10 @@ ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code ) case NtUserCallHwndParam_SetDialogInfo: return set_dialog_info( hwnd, (void *)param );
+ case NtUserCallHwndParam_SetMDIClientInfo: + NtUserSetWindowLongPtr( hwnd, sizeof(void *), param, FALSE ); + return win_set_flags( hwnd, WIN_ISMDICLIENT, 0 ); + case NtUserCallHwndParam_SetWindowContextHelpId: return set_window_context_help_id( hwnd, param );
diff --git a/include/ntuser.h b/include/ntuser.h index 65abfc65b18..882bd4fad30 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -1101,6 +1101,7 @@ enum NtUserCallHwnd_GetDefaultImeWindow, NtUserCallHwnd_GetDialogInfo, NtUserCallHwnd_GetDpiForWindow, + NtUserCallHwnd_GetMDIClientInfo, NtUserCallHwnd_GetParent, NtUserCallHwnd_GetWindowContextHelpId, NtUserCallHwnd_GetWindowDpiAwarenessContext, @@ -1148,6 +1149,11 @@ static inline UINT NtUserGetDpiForWindow( HWND hwnd ) return NtUserCallHwnd( hwnd, NtUserCallHwnd_GetDpiForWindow ); }
+static inline void *NtUserGetMDIClientInfo( HWND hwnd ) +{ + return (void *)NtUserCallHwnd( hwnd, NtUserCallHwnd_GetMDIClientInfo ); +} + static inline HWND NtUserGetParent( HWND hwnd ) { return UlongToHandle( NtUserCallHwnd( hwnd, NtUserCallHwnd_GetParent )); @@ -1228,6 +1234,7 @@ enum NtUserCallHwndParam_MonitorFromWindow, NtUserCallHwndParam_ScreenToClient, NtUserCallHwndParam_SetDialogInfo, + NtUserCallHwndParam_SetMDIClientInfo, NtUserCallHwndParam_SetWindowContextHelpId, NtUserCallHwndParam_SetWindowPixelFormat, NtUserCallHwndParam_ShowOwnedPopups, @@ -1394,6 +1401,11 @@ static inline void NtUserSetDialogInfo( HWND hwnd, void *info ) NtUserCallHwndParam( hwnd, (UINT_PTR)info, NtUserCallHwndParam_SetDialogInfo ); }
+static inline void NtUserSetMDIClientInfo( HWND hwnd, void *info ) +{ + NtUserCallHwndParam( hwnd, (UINT_PTR)info, NtUserCallHwndParam_SetMDIClientInfo ); +} + static inline BOOL NtUserSetWindowContextHelpId( HWND hwnd, DWORD id ) { return NtUserCallHwndParam( hwnd, id, NtUserCallHwndParam_SetWindowContextHelpId );