[PATCH 1/5] win32u: Move GetMenuDefaultItem implementation from user32.
Jacek Caban
wine at gitlab.winehq.org
Mon Jun 27 05:18:34 CDT 2022
From: Jacek Caban <jacek at codeweavers.com>
---
dlls/user32/menu.c | 37 ++-----------------------------------
dlls/win32u/menu.c | 42 ++++++++++++++++++++++++++++++++++++++++++
include/ntuser.h | 1 +
3 files changed, 45 insertions(+), 35 deletions(-)
diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 6fb381ea617..afbf4d2fcea 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -911,42 +911,9 @@ BOOL WINAPI SetMenuItemInfoW(HMENU hmenu, UINT item, BOOL bypos,
/**********************************************************************
* GetMenuDefaultItem (USER32.@)
*/
-UINT WINAPI GetMenuDefaultItem(HMENU hmenu, UINT bypos, UINT flags)
+UINT WINAPI GetMenuDefaultItem( HMENU menu, UINT bypos, UINT flags )
{
- POPUPMENU *menu;
- MENUITEM * item;
- UINT i = 0;
-
- TRACE("(%p,%d,%d)\n", hmenu, bypos, flags);
-
- if (!(menu = MENU_GetMenu(hmenu))) return -1;
-
- /* find default item */
- item = menu->items;
-
- /* empty menu */
- if (! item) return -1;
-
- while ( !( item->fState & MFS_DEFAULT ) )
- {
- i++; item++;
- if (i >= menu->nItems ) return -1;
- }
-
- /* default: don't return disabled items */
- if ( (!(GMDI_USEDISABLED & flags)) && (item->fState & MFS_DISABLED )) return -1;
-
- /* search rekursiv when needed */
- if ( (item->fType & MF_POPUP) && (flags & GMDI_GOINTOPOPUPS) )
- {
- UINT ret;
- ret = GetMenuDefaultItem( item->hSubMenu, bypos, flags );
- if ( -1 != ret ) return ret;
-
- /* when item not found in submenu, return the popup item */
- }
- return ( bypos ) ? i : item->wID;
-
+ return NtUserThunkedMenuItemInfo( menu, bypos, flags, NtUserGetMenuDefaultItem, NULL, NULL );
}
diff --git a/dlls/win32u/menu.c b/dlls/win32u/menu.c
index 598576437c6..cf755c57a15 100644
--- a/dlls/win32u/menu.c
+++ b/dlls/win32u/menu.c
@@ -1170,6 +1170,45 @@ static HMENU get_sub_menu( HMENU handle, INT pos )
return submenu;
}
+/* see GetMenuDefaultItem */
+static UINT get_menu_default_item( HMENU handle, UINT bypos, UINT flags )
+{
+ MENUITEM *item = NULL;
+ POPUPMENU *menu;
+ UINT i;
+
+ TRACE( "(%p,%d,%d)\n", handle, bypos, flags );
+
+ if (!(menu = grab_menu_ptr( handle ))) return -1;
+
+ for (i = 0; i < menu->nItems; i++)
+ {
+ if (!(menu->items[i].fState & MFS_DEFAULT)) continue;
+ item = &menu->items[i];
+ break;
+ }
+
+ /* default: don't return disabled items */
+ if (item && (!(GMDI_USEDISABLED & flags)) && (item->fState & MFS_DISABLED)) item = NULL;
+
+ /* search submenu when needed */
+ if (item && (item->fType & MF_POPUP) && (flags & GMDI_GOINTOPOPUPS))
+ {
+ UINT ret = get_menu_default_item( item->hSubMenu, bypos, flags );
+ if (ret != -1)
+ {
+ release_menu_ptr( menu );
+ return ret;
+ }
+ /* when item not found in submenu, return the popup item */
+ }
+
+ if (!item) i = -1;
+ else if (!bypos) i = item->wID;
+ release_menu_ptr( menu );
+ return i;
+}
+
/**********************************************************************
* NtUserThunkedMenuItemInfo (win32u.@)
*/
@@ -1185,6 +1224,9 @@ UINT WINAPI NtUserThunkedMenuItemInfo( HMENU handle, UINT pos, UINT flags, UINT
case NtUserCheckMenuRadioItem:
return check_menu_radio_item( handle, pos, info->cch, info->fMask, flags );
+ case NtUserGetMenuDefaultItem:
+ return get_menu_default_item( handle, pos, flags );
+
case NtUserGetMenuItemID:
if (!(menu = find_menu_item( handle, pos, flags, &i ))) return -1;
ret = menu->items[i].fType & MF_POPUP ? -1 : menu->items[i].wID;
diff --git a/include/ntuser.h b/include/ntuser.h
index bf4e9f4b13a..e1435bc2626 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -225,6 +225,7 @@ enum
NtUserInsertMenuItem,
/* Wine extensions */
NtUserCheckMenuRadioItem,
+ NtUserGetMenuDefaultItem,
NtUserGetMenuItemID,
NtUserGetMenuItemInfoA,
NtUserGetMenuItemInfoW,
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/321
More information about the wine-devel
mailing list