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,