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