Jacek Caban : win32u: Introduce NtUserGetWindowSysSubMenu.
Alexandre Julliard
julliard at winehq.org
Fri Aug 5 14:42:32 CDT 2022
Module: wine
Branch: master
Commit: 224a8fc24ed79a52d69a2cb2cb71cf11b8564f55
URL: https://gitlab.winehq.org/wine/wine/-/commit/224a8fc24ed79a52d69a2cb2cb71cf11b8564f55
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jul 28 19:21:53 2022 +0200
win32u: Introduce NtUserGetWindowSysSubMenu.
And use it for MDI client implementation.
---
dlls/user32/mdi.c | 15 ++++-----------
dlls/win32u/menu.c | 11 +++++++++++
dlls/win32u/win32u_private.h | 1 +
dlls/win32u/window.c | 3 +++
include/ntuser.h | 6 ++++++
5 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/dlls/user32/mdi.c b/dlls/user32/mdi.c
index 11ba1382804..cb278525f13 100644
--- a/dlls/user32/mdi.c
+++ b/dlls/user32/mdi.c
@@ -1359,17 +1359,12 @@ LRESULT WINAPI DefFrameProcW( HWND hwnd, HWND hwndMDIClient,
{
/* control menu is between the frame system menu and
* the first entry of menu bar */
- WND *wndPtr = WIN_GetPtr(hwnd);
-
- if( (wParam == VK_LEFT && GetMenu(hwnd) == next_menu->hmenuIn) ||
- (wParam == VK_RIGHT && GetSubMenu(wndPtr->hSysMenu, 0) == next_menu->hmenuIn) )
+ if ((wParam == VK_LEFT && GetMenu(hwnd) == next_menu->hmenuIn) ||
+ (wParam == VK_RIGHT && NtUserGetWindowSysSubMenu( hwnd ) == next_menu->hmenuIn))
{
- WIN_ReleasePtr(wndPtr);
- wndPtr = WIN_GetPtr(ci->hwndActiveChild);
- next_menu->hmenuNext = GetSubMenu(wndPtr->hSysMenu, 0);
+ next_menu->hmenuNext = NtUserGetWindowSysSubMenu( ci->hwndActiveChild );
next_menu->hwndNext = ci->hwndActiveChild;
}
- WIN_ReleasePtr(wndPtr);
}
return 0;
}
@@ -1551,9 +1546,7 @@ LRESULT WINAPI DefMDIChildProcW( HWND hwnd, UINT message,
if( wParam == VK_LEFT ) /* switch to frame system menu */
{
- WND *wndPtr = WIN_GetPtr( parent );
- next_menu->hmenuNext = GetSubMenu( wndPtr->hSysMenu, 0 );
- WIN_ReleasePtr( wndPtr );
+ next_menu->hmenuNext = NtUserGetWindowSysSubMenu( parent );
}
if( wParam == VK_RIGHT ) /* to frame menu bar */
{
diff --git a/dlls/win32u/menu.c b/dlls/win32u/menu.c
index 641eb926e16..53dcf3ced8e 100644
--- a/dlls/win32u/menu.c
+++ b/dlls/win32u/menu.c
@@ -1619,6 +1619,17 @@ BOOL WINAPI NtUserSetSystemMenu( HWND hwnd, HMENU menu )
return TRUE;
}
+HMENU get_window_sys_sub_menu( HWND hwnd )
+{
+ WND *win;
+ HMENU ret;
+
+ if (!(win = get_win_ptr( hwnd )) || win == WND_OTHER_PROCESS || win == WND_DESKTOP) return 0;
+ ret = win->hSysMenu;
+ release_win_ptr( win );
+ return get_sub_menu( ret, 0 );
+}
+
/**********************************************************************
* NtUserSetMenuDefaultItem (win32u.@)
*/
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index 6e9a1926891..d4b86d1e6a9 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -289,6 +289,7 @@ extern UINT get_menu_bar_height( HWND hwnd, UINT width, INT org_x, INT org_y ) D
extern BOOL get_menu_info( HMENU handle, MENUINFO *info ) DECLSPEC_HIDDEN;
extern INT get_menu_item_count( HMENU handle ) DECLSPEC_HIDDEN;
extern UINT get_menu_state( HMENU handle, UINT item_id, UINT flags ) DECLSPEC_HIDDEN;
+extern HMENU get_window_sys_sub_menu( HWND hwnd ) DECLSPEC_HIDDEN;
extern BOOL is_menu( HMENU handle ) DECLSPEC_HIDDEN;
extern HWND is_menu_active(void) DECLSPEC_HIDDEN;
extern LRESULT popup_menu_window_proc( HWND hwnd, UINT message, WPARAM wparam,
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index 506af7530d3..41cfde752c7 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -5419,6 +5419,9 @@ ULONG_PTR WINAPI NtUserCallHwnd( HWND hwnd, DWORD code )
case NtUserCallHwnd_GetWindowInputContext:
return HandleToUlong( get_window_input_context( hwnd ));
+ case NtUserCallHwnd_GetWindowSysSubMenu:
+ return HandleToUlong( get_window_sys_sub_menu( hwnd ));
+
case NtUserCallHwnd_GetWindowTextLength:
return get_server_window_text( hwnd, NULL, 0 );
diff --git a/include/ntuser.h b/include/ntuser.h
index 86e2d329eb9..65abfc65b18 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -1105,6 +1105,7 @@ enum
NtUserCallHwnd_GetWindowContextHelpId,
NtUserCallHwnd_GetWindowDpiAwarenessContext,
NtUserCallHwnd_GetWindowInputContext,
+ NtUserCallHwnd_GetWindowSysSubMenu,
NtUserCallHwnd_GetWindowTextLength,
NtUserCallHwnd_IsWindow,
NtUserCallHwnd_IsWindowEnabled,
@@ -1163,6 +1164,11 @@ static inline HIMC NtUserGetWindowInputContext( HWND hwnd )
return UlongToHandle( NtUserCallHwnd( hwnd, NtUserCallHwnd_GetWindowInputContext ));
}
+static inline HMENU NtUserGetWindowSysSubMenu( HWND hwnd )
+{
+ return UlongToHandle( NtUserCallHwnd( hwnd, NtUserCallHwnd_GetWindowSysSubMenu ));
+}
+
static inline INT NtUserGetWindowTextLength( HWND hwnd )
{
return NtUserCallHwnd( hwnd, NtUserCallHwnd_GetWindowTextLength );
More information about the wine-cvs
mailing list