From: Jacek Caban jacek@codeweavers.com
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 );