Jacek Caban : user32: Use win32u to get and set MDI client info.
Alexandre Julliard
julliard at winehq.org
Fri Aug 5 14:42:32 CDT 2022
Module: wine
Branch: master
Commit: c0b62eb5aef8b58c903521685a155b224b38b6a9
URL: https://gitlab.winehq.org/wine/wine/-/commit/c0b62eb5aef8b58c903521685a155b224b38b6a9
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jul 28 21:26:31 2022 +0200
user32: Use win32u to get and set MDI client info.
---
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 );
More information about the wine-cvs
mailing list