win32u: Introduce NtUserGetWindowSysSubMenu.

And use it for MDI client implementation.
This commit is contained in:
Jacek Caban 2022-07-28 19:21:53 +02:00 committed by Alexandre Julliard
parent c4c3e9fee4
commit 224a8fc24e
5 changed files with 25 additions and 11 deletions

View file

@ -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 */
{

View file

@ -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.@)
*/

View file

@ -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,

View file

@ -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 );

View file

@ -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 );