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