Jacek Caban : win32u: Move NtUserThunkedMenuInfo implementation from user32.

Alexandre Julliard julliard at winehq.org
Fri Apr 22 14:46:04 CDT 2022


Module: wine
Branch: master
Commit: 99b94fcc743e17c1ba03c51ab3d53c6f99c5fad4
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=99b94fcc743e17c1ba03c51ab3d53c6f99c5fad4

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Apr 22 14:45:11 2022 +0200

win32u: Move NtUserThunkedMenuInfo implementation from user32.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/menu.c      | 50 +++++++---------------------------------------
 dlls/win32u/menu.c      | 53 +++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/win32u/syscall.c   |  1 +
 dlls/win32u/win32u.spec |  2 +-
 dlls/wow64win/syscall.h |  1 +
 dlls/wow64win/user.c    | 29 +++++++++++++++++++++++++++
 include/ntuser.h        |  1 +
 7 files changed, 93 insertions(+), 44 deletions(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index b1f038938f6..36aed74c6c6 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -5073,54 +5073,18 @@ BOOL WINAPI CheckMenuRadioItem(HMENU hMenu, UINT first, UINT last,
 
 /**********************************************************************
  *		SetMenuInfo    (USER32.@)
- *
- * FIXME
- *	actually use the items to draw the menu
- *      (recalculate and/or redraw)
  */
-static BOOL menu_SetMenuInfo( HMENU hMenu, LPCMENUINFO lpmi)
+BOOL WINAPI SetMenuInfo( HMENU menu, const MENUINFO *info )
 {
-    POPUPMENU *menu;
-    if( !(menu = MENU_GetMenu(hMenu))) return FALSE;
-
-    if (lpmi->fMask & MIM_BACKGROUND)
-        menu->hbrBack = lpmi->hbrBack;
-
-    if (lpmi->fMask & MIM_HELPID)
-        menu->dwContextHelpID = lpmi->dwContextHelpID;
-
-    if (lpmi->fMask & MIM_MAXHEIGHT)
-        menu->cyMax = lpmi->cyMax;
+    TRACE( "(%p %p)\n", menu, info );
 
-    if (lpmi->fMask & MIM_MENUDATA)
-        menu->dwMenuData = lpmi->dwMenuData;
-
-    if (lpmi->fMask & MIM_STYLE)
-        menu->dwStyle = lpmi->dwStyle;
-
-    if( lpmi->fMask & MIM_APPLYTOSUBMENUS) {
-        int i;
-        MENUITEM *item = menu->items;
-        for( i = menu->nItems; i; i--, item++)
-            if( item->fType & MF_POPUP)
-                menu_SetMenuInfo( item->hSubMenu, lpmi);
+    if (!info || info->cbSize != sizeof(*info))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER);
+        return FALSE;
     }
-    return TRUE;
-}
 
-BOOL WINAPI SetMenuInfo (HMENU hMenu, LPCMENUINFO lpmi)
-{
-    TRACE("(%p %p)\n", hMenu, lpmi);
-    if( lpmi && (lpmi->cbSize == sizeof( MENUINFO)) && (menu_SetMenuInfo( hMenu, lpmi))) {
-	if( lpmi->fMask & MIM_STYLE) {
-	    if (lpmi->dwStyle & MNS_AUTODISMISS) FIXME("MNS_AUTODISMISS unimplemented\n");
-	    if (lpmi->dwStyle & MNS_DRAGDROP) FIXME("MNS_DRAGDROP unimplemented\n");
-	    if (lpmi->dwStyle & MNS_MODELESS) FIXME("MNS_MODELESS unimplemented\n");
-	}
-        return TRUE;
-    }
-    SetLastError( ERROR_INVALID_PARAMETER);
-    return FALSE;
+    return NtUserThunkedMenuInfo( menu, info );
 }
 
 /**********************************************************************
diff --git a/dlls/win32u/menu.c b/dlls/win32u/menu.c
index fd4e1f74039..dee68a95aa2 100644
--- a/dlls/win32u/menu.c
+++ b/dlls/win32u/menu.c
@@ -451,6 +451,59 @@ BOOL WINAPI NtUserGetMenuItemRect( HWND hwnd, HMENU handle, UINT item, RECT *rec
     return TRUE;
 }
 
+static BOOL set_menu_info( HMENU handle, const MENUINFO *info )
+{
+    POPUPMENU *menu;
+
+    if (!(menu = grab_menu_ptr( handle ))) return FALSE;
+
+    if (info->fMask & MIM_BACKGROUND) menu->hbrBack = info->hbrBack;
+    if (info->fMask & MIM_HELPID)     menu->dwContextHelpID = info->dwContextHelpID;
+    if (info->fMask & MIM_MAXHEIGHT)  menu->cyMax = info->cyMax;
+    if (info->fMask & MIM_MENUDATA)   menu->dwMenuData = info->dwMenuData;
+    if (info->fMask & MIM_STYLE)      menu->dwStyle = info->dwStyle;
+
+    if (info->fMask & MIM_APPLYTOSUBMENUS)
+    {
+        int i;
+        MENUITEM *item = menu->items;
+        for (i = menu->nItems; i; i--, item++)
+            if (item->fType & MF_POPUP)
+                set_menu_info( item->hSubMenu, info);
+    }
+
+    release_menu_ptr( menu );
+    return TRUE;
+}
+
+/**********************************************************************
+ *           NtUserThunkedMenuInfo    (win32u.@)
+ */
+BOOL WINAPI NtUserThunkedMenuInfo( HMENU menu, const MENUINFO *info )
+{
+    TRACE( "(%p %p)\n", menu, info );
+
+    if (!info)
+    {
+        SetLastError( ERROR_NOACCESS );
+        return FALSE;
+    }
+
+    if (!set_menu_info( menu, info ))
+    {
+        SetLastError( ERROR_INVALID_MENU_HANDLE );
+        return FALSE;
+    }
+
+    if (info->fMask & MIM_STYLE)
+    {
+        if (info->dwStyle & MNS_AUTODISMISS) FIXME("MNS_AUTODISMISS unimplemented\n");
+        if (info->dwStyle & MNS_DRAGDROP) FIXME("MNS_DRAGDROP unimplemented\n");
+        if (info->dwStyle & MNS_MODELESS) FIXME("MNS_MODELESS unimplemented\n");
+    }
+    return TRUE;
+}
+
 /* see GetMenuInfo */
 BOOL get_menu_info( HMENU handle, MENUINFO *info )
 {
diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c
index 3ac03cef0d9..d543465d4d7 100644
--- a/dlls/win32u/syscall.c
+++ b/dlls/win32u/syscall.c
@@ -166,6 +166,7 @@ static void * const syscalls[] =
     NtUserSetTimer,
     NtUserSetWinEventHook,
     NtUserSetWindowsHookEx,
+    NtUserThunkedMenuInfo,
     NtUserUnhookWinEvent,
     NtUserUnhookWindowsHookEx,
     NtUserWindowFromDC,
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index 67d6aa6b48d..cfbf4ac1ad1 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -1274,7 +1274,7 @@
 @ stdcall NtUserSystemParametersInfo(long long ptr long)
 @ stdcall NtUserSystemParametersInfoForDpi(long long ptr long long)
 @ stub NtUserTestForInteractiveUser
-@ stub NtUserThunkedMenuInfo
+@ stdcall -syscall NtUserThunkedMenuInfo(long ptr)
 @ stub NtUserThunkedMenuItemInfo
 @ stdcall NtUserToUnicodeEx(long long ptr ptr long long long)
 @ stub NtUserTrackMouseEvent
diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h
index 52df3a4d67c..f3cee62b577 100644
--- a/dlls/wow64win/syscall.h
+++ b/dlls/wow64win/syscall.h
@@ -153,6 +153,7 @@
     SYSCALL_ENTRY( NtUserSetTimer ) \
     SYSCALL_ENTRY( NtUserSetWinEventHook ) \
     SYSCALL_ENTRY( NtUserSetWindowsHookEx ) \
+    SYSCALL_ENTRY( NtUserThunkedMenuInfo ) \
     SYSCALL_ENTRY( NtUserUnhookWinEvent ) \
     SYSCALL_ENTRY( NtUserUnhookWindowsHookEx ) \
     SYSCALL_ENTRY( NtUserWindowFromDC )
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index 9c2169cf886..38905fd8a57 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -658,3 +658,32 @@ NTSTATUS WINAPI wow64_NtUserSetMenuContextHelpId( UINT *args )
 
     return NtUserSetMenuContextHelpId( menu, id );
 }
+
+NTSTATUS WINAPI wow64_NtUserThunkedMenuInfo( UINT *args )
+{
+    HMENU menu = get_handle( &args );
+    const struct
+    {
+        DWORD cbSize;
+        DWORD fMask;
+        DWORD dwStyle;
+        UINT  cyMax;
+        ULONG hbrBack;
+        DWORD dwContextHelpID;
+        ULONG dwMenuData;
+    } *info32 = get_ptr( &args );
+    MENUINFO info;
+
+    if (info32)
+    {
+        info.cbSize = sizeof(info);
+        info.fMask = info32->fMask;
+        info.dwStyle = info32->dwStyle;
+        info.cyMax = info32->cyMax;
+        info.hbrBack = UlongToHandle( info32->hbrBack );
+        info.dwContextHelpID = info32->dwContextHelpID;
+        info.dwMenuData = info32->dwMenuData;
+    }
+
+    return NtUserThunkedMenuInfo( menu, info32 ? &info : NULL );
+}
diff --git a/include/ntuser.h b/include/ntuser.h
index 1a5d255133c..cdac581f193 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -580,6 +580,7 @@ BOOL    WINAPI NtUserShowWindow( HWND hwnd, INT cmd );
 BOOL    WINAPI NtUserShowWindowAsync( HWND hwnd, INT cmd );
 BOOL    WINAPI NtUserSystemParametersInfo( UINT action, UINT val, void *ptr, UINT winini );
 BOOL    WINAPI NtUserSystemParametersInfoForDpi( UINT action, UINT val, PVOID ptr, UINT winini, UINT dpi );
+BOOL    WINAPI NtUserThunkedMenuInfo( HMENU menu, const MENUINFO *info );
 INT     WINAPI NtUserToUnicodeEx( UINT virt, UINT scan, const BYTE *state,
                                   WCHAR *str, int size, UINT flags, HKL layout );
 INT     WINAPI NtUserTranslateAccelerator( HWND hwnd, HACCEL accel, MSG *msg );




More information about the wine-cvs mailing list