Module: wine Branch: master Commit: 99b94fcc743e17c1ba03c51ab3d53c6f99c5fad4 URL: https://source.winehq.org/git/wine.git/?a=commit;h=99b94fcc743e17c1ba03c51ab...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Apr 22 14:45:11 2022 +0200
win32u: Move NtUserThunkedMenuInfo implementation from user32.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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 );