[PATCH v2 1/5] win32u: Move GetMenuDefaultItem implementation from user32.

Jacek Caban wine at gitlab.winehq.org
Mon Jun 27 06:21:25 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