- Patch by David Quintana : Menu info fType and wID have wrong values if the menu has a submenu. See CORE-7966.

svn path=/trunk/; revision=62529
This commit is contained in:
James Tabor 2014-03-18 13:45:38 +00:00
parent 6e6984882a
commit ac46205375
3 changed files with 25 additions and 32 deletions

View file

@ -458,7 +458,7 @@ IntSetMenuInfo(PMENU_OBJECT Menu, PROSMENUINFO lpmi)
PMENU_ITEM item = Menu->MenuItemList; PMENU_ITEM item = Menu->MenuItemList;
for ( i = Menu->MenuInfo.MenuItemCount; i; i--, item = item->Next) for ( i = Menu->MenuInfo.MenuItemCount; i; i--, item = item->Next)
{ {
if ( item->fType & MF_POPUP ) // item->hSubMenu ) if ( item->hSubMenu )
{ {
PMENU_OBJECT SubMenu; PMENU_OBJECT SubMenu;
if (!(SubMenu = UserGetMenuObject(item->hSubMenu))) continue; if (!(SubMenu = UserGetMenuObject(item->hSubMenu))) continue;
@ -539,7 +539,7 @@ IntGetMenuItemByFlag(PMENU_OBJECT Menu, UINT uSearchBy, UINT fFlag,
} }
else else
{ {
if(CurItem->fType & MF_POPUP) if(CurItem->hSubMenu)
{ {
PMENU_OBJECT NewMenu = UserGetMenuObject(CurItem->hSubMenu); PMENU_OBJECT NewMenu = UserGetMenuObject(CurItem->hSubMenu);
if(NewMenu) if(NewMenu)
@ -664,7 +664,7 @@ BOOL FASTCALL
IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINFO lpmii) IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINFO lpmii)
{ {
PMENU_OBJECT SubMenuObject; PMENU_OBJECT SubMenuObject;
UINT fTypeMask = (MFT_BITMAP | MFT_MENUBARBREAK | MFT_MENUBREAK | MFT_OWNERDRAW | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_SEPARATOR | MF_POPUP); UINT fTypeMask = (MFT_BITMAP | MFT_MENUBARBREAK | MFT_MENUBREAK | MFT_OWNERDRAW | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_SEPARATOR);
if(!MenuItem || !MenuObject || !lpmii) if(!MenuItem || !MenuObject || !lpmii)
{ {
@ -752,16 +752,7 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF
if (SubMenuObject != NULL) if (SubMenuObject != NULL)
{ {
SubMenuObject->MenuInfo.Flags |= MNF_POPUP; SubMenuObject->MenuInfo.Flags |= MNF_POPUP;
MenuItem->fType |= MF_POPUP;
} }
else
{
MenuItem->fType &= ~MF_POPUP;
}
}
else
{
MenuItem->fType &= ~MF_POPUP;
} }
} }
@ -1479,7 +1470,7 @@ UINT FASTCALL IntFindSubMenu(HMENU *hMenu, HMENU hSubTarget )
return NO_SELECTED_ITEM; return NO_SELECTED_ITEM;
} }
if (!(mi->fType & MF_POPUP)) continue; if (!(mi->hSubMenu)) continue;
if (mi->hSubMenu == hSubTarget) if (mi->hSubMenu == hSubTarget)
{ {

View file

@ -977,7 +977,7 @@ IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu)
ItemInfo.cbSize = sizeof(MENUITEMINFOW); ItemInfo.cbSize = sizeof(MENUITEMINFOW);
ItemInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_STATE | MIIM_SUBMENU; ItemInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_STATE | MIIM_SUBMENU;
ItemInfo.fType = MF_POPUP; ItemInfo.fType = 0;
ItemInfo.fState = MFS_ENABLED; ItemInfo.fState = MFS_ENABLED;
ItemInfo.dwTypeData = NULL; ItemInfo.dwTypeData = NULL;
ItemInfo.cch = 0; ItemInfo.cch = 0;

View file

@ -399,7 +399,7 @@ static UINT FASTCALL MenuFindSubMenu(HMENU *hmenu, HMENU hSubTarget )
MenuCleanupRosMenuItemInfo(&item); MenuCleanupRosMenuItemInfo(&item);
return NO_SELECTED_ITEM; return NO_SELECTED_ITEM;
} }
if (!(item.fType & MF_POPUP)) continue; if (!(item.hSubMenu)) continue;
if (item.hSubMenu == hSubTarget) { if (item.hSubMenu == hSubTarget) {
MenuCleanupRosMenuItemInfo(&item); MenuCleanupRosMenuItemInfo(&item);
return i; return i;
@ -1214,7 +1214,7 @@ static void FASTCALL MenuDrawMenuItem(HWND hWnd, PROSMENUINFO MenuInfo, HWND Wnd
dis.rcItem.bottom); dis.rcItem.bottom);
SendMessageW(WndOwner, WM_DRAWITEM, 0, (LPARAM) &dis); SendMessageW(WndOwner, WM_DRAWITEM, 0, (LPARAM) &dis);
/* Draw the popup-menu arrow */ /* Draw the popup-menu arrow */
if (lpitem->fType & MF_POPUP) if (lpitem->hSubMenu)
{ {
RECT rectTemp; RECT rectTemp;
CopyRect(&rectTemp, &rect); CopyRect(&rectTemp, &rect);
@ -1352,7 +1352,7 @@ static void FASTCALL MenuDrawMenuItem(HWND hWnd, PROSMENUINFO MenuInfo, HWND Wnd
} }
} }
/* Draw the popup-menu arrow */ /* Draw the popup-menu arrow */
if (lpitem->fType & MF_POPUP) if (lpitem->hSubMenu)
{ {
RECT rectTemp; RECT rectTemp;
CopyRect(&rectTemp, &rect); CopyRect(&rectTemp, &rect);
@ -1706,16 +1706,19 @@ static void FASTCALL MenuSelectItem(HWND hwndOwner, PROSMENUINFO hmenu, UINT wIn
} }
if (sendMenuSelect) if (sendMenuSelect)
{ {
WPARAM wParam = MAKEWPARAM( ItemInfo.fType & MF_POPUP ? wIndex : ItemInfo.wID, WPARAM wParam = MAKEWPARAM( ItemInfo.hSubMenu ? wIndex : ItemInfo.wID,
ItemInfo.fType | ItemInfo.fState | ItemInfo.fType | ItemInfo.fState |
(hmenu->Flags & MNF_SYSDESKMN ? MF_SYSMENU : 0 ) ); (ItemInfo.hSubMenu ? MF_POPUP : 0) |
(hmenu->Flags & MNF_SYSDESKMN ? MF_SYSMENU : 0 ) );
SendMessageW(hwndOwner, WM_MENUSELECT, wParam, (LPARAM) hmenu->Self); SendMessageW(hwndOwner, WM_MENUSELECT, wParam, (LPARAM) hmenu->Self);
} }
} }
} }
else if (sendMenuSelect) { else if (sendMenuSelect)
if(topmenu) { {
if(topmenu)
{
int pos; int pos;
pos = MenuFindSubMenu(&topmenu, hmenu->Self); pos = MenuFindSubMenu(&topmenu, hmenu->Self);
if (pos != NO_SELECTED_ITEM) if (pos != NO_SELECTED_ITEM)
@ -1724,6 +1727,7 @@ static void FASTCALL MenuSelectItem(HWND hwndOwner, PROSMENUINFO hmenu, UINT wIn
&& MenuGetRosMenuItemInfo(topmenu, pos, &ItemInfo)) && MenuGetRosMenuItemInfo(topmenu, pos, &ItemInfo))
{ {
WPARAM wParam = MAKEWPARAM( Pos, ItemInfo.fType | ItemInfo.fState | WPARAM wParam = MAKEWPARAM( Pos, ItemInfo.fType | ItemInfo.fState |
(ItemInfo.hSubMenu ? MF_POPUP : 0) |
(TopMenuInfo.Flags & MNF_SYSDESKMN ? MF_SYSMENU : 0 ) ); (TopMenuInfo.Flags & MNF_SYSDESKMN ? MF_SYSMENU : 0 ) );
SendMessageW(hwndOwner, WM_MENUSELECT, wParam, (LPARAM) topmenu); SendMessageW(hwndOwner, WM_MENUSELECT, wParam, (LPARAM) topmenu);
@ -2100,7 +2104,6 @@ static LPCSTR MENUEX_ParseResource(LPCSTR res, HMENU hMenu)
return NULL; return NULL;
} }
mii.fMask |= MIIM_SUBMENU; mii.fMask |= MIIM_SUBMENU;
mii.fType |= MF_POPUP;
} }
else if (!mii.dwTypeData[0] && !(mii.fType & MF_SEPARATOR)) else if (!mii.dwTypeData[0] && !(mii.fType & MF_SEPARATOR))
{ {
@ -2300,7 +2303,7 @@ MenuShowSubPopup(HWND WndOwner, PROSMENUINFO MenuInfo, BOOL SelectFirst, UINT Fl
MenuCleanupRosMenuItemInfo(&ItemInfo); MenuCleanupRosMenuItemInfo(&ItemInfo);
return MenuInfo->Self; return MenuInfo->Self;
} }
if (0 == (ItemInfo.fType & MF_POPUP) || 0 != (ItemInfo.fState & (MF_GRAYED | MF_DISABLED))) if (0 == (ItemInfo.hSubMenu) || 0 != (ItemInfo.fState & (MF_GRAYED | MF_DISABLED)))
{ {
MenuCleanupRosMenuItemInfo(&ItemInfo); MenuCleanupRosMenuItemInfo(&ItemInfo);
return MenuInfo->Self; return MenuInfo->Self;
@ -2441,7 +2444,7 @@ MenuHideSubPopups(HWND WndOwner, PROSMENUINFO MenuInfo,
MenuInitRosMenuItemInfo(&ItemInfo); MenuInitRosMenuItemInfo(&ItemInfo);
ItemInfo.fMask |= MIIM_FTYPE | MIIM_STATE; ItemInfo.fMask |= MIIM_FTYPE | MIIM_STATE;
if (! MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo) if (! MenuGetRosMenuItemInfo(MenuInfo->Self, MenuInfo->FocusedItem, &ItemInfo)
|| 0 == (ItemInfo.fType & MF_POPUP) || 0 == (ItemInfo.hSubMenu)
|| 0 == (ItemInfo.fState & MF_MOUSESELECT)) || 0 == (ItemInfo.fState & MF_MOUSESELECT))
{ {
MenuCleanupRosMenuItemInfo(&ItemInfo); MenuCleanupRosMenuItemInfo(&ItemInfo);
@ -2526,7 +2529,7 @@ MenuExecFocusedItem(MTRACKER *Mt, PROSMENUINFO MenuInfo, UINT Flags)
TRACE("%p %08x %p\n", MenuInfo, ItemInfo.wID, ItemInfo.hSubMenu); TRACE("%p %08x %p\n", MenuInfo, ItemInfo.wID, ItemInfo.hSubMenu);
if (0 == (ItemInfo.fType & MF_POPUP)) if (0 == (ItemInfo.hSubMenu))
{ {
if (0 == (ItemInfo.fState & (MF_GRAYED | MF_DISABLED)) if (0 == (ItemInfo.fState & (MF_GRAYED | MF_DISABLED))
&& 0 == (ItemInfo.fType & MF_SEPARATOR)) && 0 == (ItemInfo.fType & MF_SEPARATOR))
@ -2660,7 +2663,7 @@ MenuButtonUp(MTRACKER *Mt, HMENU PtMenu, UINT Flags)
if (0 <= Id && MenuGetRosMenuItemInfo(MenuInfo.Self, Id, &ItemInfo) && if (0 <= Id && MenuGetRosMenuItemInfo(MenuInfo.Self, Id, &ItemInfo) &&
MenuInfo.FocusedItem == Id) MenuInfo.FocusedItem == Id)
{ {
if (0 == (ItemInfo.fType & MF_POPUP)) if (0 == (ItemInfo.hSubMenu))
{ {
INT ExecutedMenuId = MenuExecFocusedItem(Mt, &MenuInfo, Flags); INT ExecutedMenuId = MenuExecFocusedItem(Mt, &MenuInfo, Flags);
MenuCleanupRosMenuItemInfo(&ItemInfo); MenuCleanupRosMenuItemInfo(&ItemInfo);
@ -2709,7 +2712,7 @@ MenuPtMenu(HMENU Menu, POINT Pt)
{ {
MenuInitRosMenuItemInfo(&ItemInfo); MenuInitRosMenuItemInfo(&ItemInfo);
if (MenuGetRosMenuItemInfo(MenuInfo.Self, MenuInfo.FocusedItem, &ItemInfo) && if (MenuGetRosMenuItemInfo(MenuInfo.Self, MenuInfo.FocusedItem, &ItemInfo) &&
0 != (ItemInfo.fType & MF_POPUP) && 0 != (ItemInfo.hSubMenu) &&
0 != (ItemInfo.fState & MF_MOUSESELECT)) 0 != (ItemInfo.fState & MF_MOUSESELECT))
{ {
Ret = MenuPtMenu(ItemInfo.hSubMenu, Pt); Ret = MenuPtMenu(ItemInfo.hSubMenu, Pt);
@ -2823,7 +2826,7 @@ MenuGetSubPopup(HMENU Menu)
MenuCleanupRosMenuItemInfo(&ItemInfo); MenuCleanupRosMenuItemInfo(&ItemInfo);
return NULL; return NULL;
} }
if (0 != (ItemInfo.fType & MF_POPUP) && 0 != (ItemInfo.fState & MF_MOUSESELECT)) if (0 != (ItemInfo.hSubMenu) && 0 != (ItemInfo.fState & MF_MOUSESELECT))
{ {
MenuCleanupRosMenuItemInfo(&ItemInfo); MenuCleanupRosMenuItemInfo(&ItemInfo);
return ItemInfo.hSubMenu; return ItemInfo.hSubMenu;
@ -3883,7 +3886,6 @@ MenuSetItemData(
if(Flags & MF_POPUP) if(Flags & MF_POPUP)
{ {
mii->fType |= MF_POPUP;
mii->fMask |= MIIM_SUBMENU; mii->fMask |= MIIM_SUBMENU;
mii->hSubMenu = (HMENU)IDNewItem; mii->hSubMenu = (HMENU)IDNewItem;
} }
@ -3993,7 +3995,7 @@ MenuCheckMenuRadioItem(HMENU hMenu, UINT idFirst, UINT idLast, UINT idCheck, UIN
if (0 != (Items[i].fType & MF_MENUBARBREAK)) continue; if (0 != (Items[i].fType & MF_MENUBARBREAK)) continue;
if (0 != (Items[i].fType & MF_SEPARATOR)) continue; if (0 != (Items[i].fType & MF_SEPARATOR)) continue;
if ((Items[i].fType & MF_POPUP) && (uFlags == MF_BYCOMMAND)) if ((Items[i].hSubMenu) && (uFlags == MF_BYCOMMAND))
{ {
MenuCheckMenuRadioItem(Items[i].hSubMenu, idFirst, idLast, idCheck, uFlags, bCheck, pChecked, pUnchecked, pMenuChanged); MenuCheckMenuRadioItem(Items[i].hSubMenu, idFirst, idLast, idCheck, uFlags, bCheck, pChecked, pUnchecked, pMenuChanged);
continue; continue;
@ -4897,7 +4899,7 @@ ModifyMenuA(
if(!MenuGetRosMenuItemInfo( hMnu, uPosition, &rmii)) return FALSE; if(!MenuGetRosMenuItemInfo( hMnu, uPosition, &rmii)) return FALSE;
if ((rmii.fType & MF_POPUP) && (uFlags & MF_POPUP) && (rmii.hSubMenu != (HMENU)uIDNewItem)) if (rmii.hSubMenu && (uFlags & MF_POPUP) && (rmii.hSubMenu != (HMENU)uIDNewItem))
NtUserDestroyMenu( rmii.hSubMenu ); /* ModifyMenu() spec */ NtUserDestroyMenu( rmii.hSubMenu ); /* ModifyMenu() spec */
MenuCleanupRosMenuItemInfo( &rmii ); MenuCleanupRosMenuItemInfo( &rmii );
@ -4944,7 +4946,7 @@ ModifyMenuW(
if(!MenuGetRosMenuItemInfo( hMnu, uPosition, &rmii)) return FALSE; if(!MenuGetRosMenuItemInfo( hMnu, uPosition, &rmii)) return FALSE;
if ((rmii.fType & MF_POPUP) && (uFlags & MF_POPUP) && (rmii.hSubMenu != (HMENU)uIDNewItem)) if (rmii.hSubMenu && (uFlags & MF_POPUP) && (rmii.hSubMenu != (HMENU)uIDNewItem))
NtUserDestroyMenu( rmii.hSubMenu ); /* ModifyMenu() spec */ NtUserDestroyMenu( rmii.hSubMenu ); /* ModifyMenu() spec */
MenuCleanupRosMenuItemInfo( &rmii ); MenuCleanupRosMenuItemInfo( &rmii );