[PATCH 3/6] user32: Don't rely on HMENU for finding menu items

Nikolay Sivov nsivov at codeweavers.com
Tue Apr 10 01:36:52 CDT 2018


From: Andrew Eikum <aeikum at codeweavers.com>

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/user32/menu.c | 174 ++++++++++++++++++++++++++++++-----------------------
 1 file changed, 98 insertions(+), 76 deletions(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 71bd5dd51a..f5176fdeca 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -565,17 +565,19 @@ static UINT  MENU_GetStartOfPrevColumn(
 /***********************************************************************
  *           MENU_FindItem
  *
- * Find a menu item. Return a pointer on the item, and modifies *hmenu
+ * Find a menu item. Return a pointer on the item, and modifies *pmenu
  * in case the item was in a sub-menu.
  */
-static MENUITEM *MENU_FindItem( HMENU *hmenu, UINT *nPos, UINT wFlags )
+static MENUITEM *MENU_FindItem( POPUPMENU **pmenu, UINT *nPos, UINT wFlags )
 {
-    POPUPMENU *menu;
+    POPUPMENU *menu = *pmenu;
     MENUITEM *fallback = NULL;
     UINT fallback_pos = 0;
     UINT i;
 
-    if ((*hmenu == (HMENU)0xffff) || (!(menu = MENU_GetMenu(*hmenu)))) return NULL;
+    if (!menu)
+        return NULL;
+
     if (wFlags & MF_BYPOSITION)
     {
 	if (*nPos >= menu->nItems) return NULL;
@@ -588,11 +590,11 @@ static MENUITEM *MENU_FindItem( HMENU *hmenu, UINT *nPos, UINT wFlags )
 	{
 	    if (item->fType & MF_POPUP)
 	    {
-		HMENU hsubmenu = item->hSubMenu;
-		MENUITEM *subitem = MENU_FindItem( &hsubmenu, nPos, wFlags );
+                POPUPMENU *submenu = MENU_GetMenu(item->hSubMenu);
+                MENUITEM *subitem = MENU_FindItem( &submenu, nPos, wFlags );
 		if (subitem)
 		{
-		    *hmenu = hsubmenu;
+		    *pmenu = submenu;
 		    return subitem;
 		}
 		else if (item->wID == *nPos)
@@ -623,25 +625,27 @@ static MENUITEM *MENU_FindItem( HMENU *hmenu, UINT *nPos, UINT wFlags )
  * *hmenu in case it is found in another sub-menu.
  * If the submenu cannot be found, NO_SELECTED_ITEM is returned.
  */
-static UINT MENU_FindSubMenu( HMENU *hmenu, HMENU hSubTarget )
+static UINT MENU_FindSubMenu( POPUPMENU **pmenu, POPUPMENU *subTarget )
 {
-    POPUPMENU *menu;
+    POPUPMENU *menu = *pmenu;
     UINT i;
     MENUITEM *item;
-    if (((*hmenu)==(HMENU)0xffff) ||
-            (!(menu = MENU_GetMenu(*hmenu))))
+
+    if (!menu)
         return NO_SELECTED_ITEM;
+
     item = menu->items;
     for (i = 0; i < menu->nItems; i++, item++) {
         if(!(item->fType & MF_POPUP)) continue;
-        if (item->hSubMenu == hSubTarget) {
+        if (item->hSubMenu == MENU_GetHandle(subTarget))
+        {
             return i;
         }
         else  {
-            HMENU hsubmenu = item->hSubMenu;
-            UINT pos = MENU_FindSubMenu( &hsubmenu, hSubTarget );
+            POPUPMENU *submenu = MENU_GetMenu(item->hSubMenu);
+            UINT pos = MENU_FindSubMenu( &submenu, subTarget );
             if (pos != NO_SELECTED_ITEM) {
-                *hmenu = hsubmenu;
+                *pmenu = submenu;
                 return pos;
             }
         }
@@ -750,16 +754,16 @@ static enum hittest MENU_FindItemByCoords( const POPUPMENU *menu, POINT pt, UINT
  * Find the menu item selected by a key press.
  * Return item id, -1 if none, -2 if we should close the menu.
  */
-static UINT MENU_FindItemByKey( HWND hwndOwner, HMENU hmenu,
+static UINT MENU_FindItemByKey( HWND hwndOwner, POPUPMENU *menu,
                                 WCHAR key, BOOL forceMenuChar )
 {
-    TRACE("\tlooking for '%c' (0x%02x) in [%p]\n", (char)key, key, hmenu );
+    TRACE("\tlooking for '%c' (0x%02x) in [%p]\n", (char)key, key, menu );
 
-    if (!IsMenu( hmenu )) hmenu = GetSubMenu( get_win_sys_menu(hwndOwner), 0);
+    if (!menu)
+        menu = MENU_GetMenu(GetSubMenu( get_win_sys_menu(hwndOwner), 0));
 
-    if (hmenu)
+    if (menu)
     {
-	POPUPMENU *menu = MENU_GetMenu( hmenu );
 	MENUITEM *item = menu->items;
 	LRESULT menuchar;
 
@@ -785,7 +789,7 @@ static UINT MENU_FindItemByKey( HWND hwndOwner, HMENU hmenu,
 	     }
 	}
 	menuchar = SendMessageW( hwndOwner, WM_MENUCHAR,
-                                 MAKEWPARAM( key, menu->wFlags ), (LPARAM)hmenu );
+                                 MAKEWPARAM( key, menu->wFlags ), (LPARAM)MENU_GetHandle(menu) );
 	if (HIWORD(menuchar) == MNC_EXECUTE) return LOWORD(menuchar);
 	if (HIWORD(menuchar) == MNC_CLOSE) return (UINT)(-2);
     }
@@ -2005,7 +2009,7 @@ MENU_EnsureMenuItemVisible(LPPOPUPMENU lppop, UINT wIndex, HDC hdc)
  *           MENU_SelectItem
  */
 static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex,
-                             BOOL sendMenuSelect, HMENU topmenu )
+                             BOOL sendMenuSelect, HMENU htopmenu )
 {
     LPPOPUPMENU lppop;
     HDC hdc;
@@ -2053,14 +2057,17 @@ static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex,
         }
     }
     else if (sendMenuSelect) {
-        if(topmenu){
+        POPUPMENU *topmenu;
+
+        if (htopmenu && (topmenu = MENU_GetMenu(htopmenu)))
+        {
             int pos;
-            if((pos=MENU_FindSubMenu(&topmenu, hmenu))!=NO_SELECTED_ITEM){
-                POPUPMENU *ptm = MENU_GetMenu( topmenu );
-                MENUITEM *ip = &ptm->items[pos];
+            if ((pos=MENU_FindSubMenu(&topmenu, lppop)) != NO_SELECTED_ITEM)
+            {
+                MENUITEM *ip = &topmenu->items[pos];
                 SendMessageW( hwndOwner, WM_MENUSELECT, MAKEWPARAM(pos,
                          ip->fType | ip->fState |
-                         (ptm->wFlags & MF_SYSMENU)), (LPARAM)topmenu);
+                         (topmenu->wFlags & MF_SYSMENU)), (LPARAM)htopmenu);
             }
         }
     }
@@ -2126,7 +2133,7 @@ static MENUITEM *MENU_InsertItem( HMENU hMenu, UINT pos, UINT flags )
         if (pos > menu->nItems)
             pos = menu->nItems;
     } else {
-        if (!MENU_FindItem( &hMenu, &pos, flags ))
+        if (!MENU_FindItem( &menu, &pos, flags ))
             pos = menu->nItems;
         else {
             if (!(menu = MENU_GetMenu( hMenu )))
@@ -3258,7 +3265,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y,
 		      /* We will find a better way real soon... */
 		    if (msg.wParam < 32) break;
 
-		    pos = MENU_FindItemByKey( mt.hOwnerWnd, mt.hCurrentMenu,
+		    pos = MENU_FindItemByKey( mt.hOwnerWnd, MENU_GetMenu(mt.hCurrentMenu),
                                               LOWORD(msg.wParam), FALSE );
 		    if (pos == (UINT)-2) fEndMenu = TRUE;
 		    else if (pos == (UINT)-1) MessageBeep(0);
@@ -3444,7 +3451,7 @@ void MENU_TrackKbdMenuBar( HWND hwnd, UINT wParam, WCHAR wChar)
 
     if( wChar && wChar != ' ' )
     {
-        uItem = MENU_FindItemByKey( hwnd, hTrackMenu, wChar, (wParam & HTSYSMENU) );
+        uItem = MENU_FindItemByKey( hwnd, MENU_GetMenu(hTrackMenu), wChar, (wParam & HTSYSMENU) );
         if ( uItem >= (UINT)(-2) )
         {
             if( uItem == (UINT)(-1) ) MessageBeep(0);
@@ -3681,10 +3688,11 @@ BOOL WINAPI ChangeMenuW( HMENU hMenu, UINT pos, LPCWSTR data,
  */
 DWORD WINAPI CheckMenuItem( HMENU hMenu, UINT id, UINT flags )
 {
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
     MENUITEM *item;
     DWORD ret;
 
-    if (!(item = MENU_FindItem( &hMenu, &id, flags ))) return -1;
+    if (!(item = MENU_FindItem( &menu, &id, flags ))) return -1;
     ret = item->fState & MF_CHECKED;
     if (flags & MF_CHECKED) item->fState |= MF_CHECKED;
     else item->fState &= ~MF_CHECKED;
@@ -3707,7 +3715,7 @@ BOOL WINAPI EnableMenuItem( HMENU hMenu, UINT wItemID, UINT wFlags )
     if (!(menu = MENU_GetMenu(hMenu)))
 	return (UINT)-1;
 
-    if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags )))
+    if (!(item = MENU_FindItem( &menu, &wItemID, wFlags )))
 	return (UINT)-1;
 
     oldflags = item->fState & (MF_GRAYED | MF_DISABLED);
@@ -3745,12 +3753,14 @@ INT WINAPI GetMenuStringA(
 	LPSTR str,	/* [out] outbuffer. If NULL, func returns entry length*/
 	INT nMaxSiz,	/* [in] length of buffer. if 0, func returns entry len*/
 	UINT wFlags	/* [in] MF_ flags */
-) {
+)
+{
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
     MENUITEM *item;
 
     TRACE("menu=%p item=%04x ptr=%p len=%d flags=%04x\n", hMenu, wItemID, str, nMaxSiz, wFlags );
     if (str && nMaxSiz) str[0] = '\0';
-    if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) {
+    if (!(item = MENU_FindItem( &menu, &wItemID, wFlags ))) {
         SetLastError( ERROR_MENU_ITEM_NOT_FOUND);
         return 0;
     }
@@ -3769,11 +3779,12 @@ INT WINAPI GetMenuStringA(
 INT WINAPI GetMenuStringW( HMENU hMenu, UINT wItemID,
                                LPWSTR str, INT nMaxSiz, UINT wFlags )
 {
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
     MENUITEM *item;
 
     TRACE("menu=%p item=%04x ptr=%p len=%d flags=%04x\n", hMenu, wItemID, str, nMaxSiz, wFlags );
     if (str && nMaxSiz) str[0] = '\0';
-    if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) {
+    if (!(item = MENU_FindItem( &menu, &wItemID, wFlags ))) {
         SetLastError( ERROR_MENU_ITEM_NOT_FOUND);
         return 0;
     }
@@ -3794,13 +3805,15 @@ INT WINAPI GetMenuStringW( HMENU hMenu, UINT wItemID,
 BOOL WINAPI HiliteMenuItem( HWND hWnd, HMENU hMenu, UINT wItemID,
                                 UINT wHilite )
 {
-    LPPOPUPMENU menu;
-    TRACE("(%p, %p, %04x, %04x);\n", hWnd, hMenu, wItemID, wHilite);
-    if (!MENU_FindItem( &hMenu, &wItemID, wHilite )) return FALSE;
-    if (!(menu = MENU_GetMenu(hMenu))) return FALSE;
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
+    MENUITEM *item;
+
+    TRACE("(%p, %p, %04x, %04x)\n", hWnd, hMenu, wItemID, wHilite);
+
+    if (!(item = MENU_FindItem( &menu, &wItemID, wHilite ))) return FALSE;
     if (menu->FocusedItem == wItemID) return TRUE;
     MENU_HideSubPopups( hWnd, menu, FALSE, 0 );
-    MENU_SelectItem( hWnd, hMenu, wItemID, TRUE, 0 );
+    MENU_SelectItem( hWnd, MENU_GetHandle(menu), wItemID, TRUE, 0 );
     return TRUE;
 }
 
@@ -3810,13 +3823,15 @@ BOOL WINAPI HiliteMenuItem( HWND hWnd, HMENU hMenu, UINT wItemID,
  */
 UINT WINAPI GetMenuState( HMENU hMenu, UINT wItemID, UINT wFlags )
 {
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
     MENUITEM *item;
+
     TRACE("(menu=%p, id=%04x, flags=%04x);\n", hMenu, wItemID, wFlags);
-    if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return -1;
+    if (!(item = MENU_FindItem( &menu, &wItemID, wFlags ))) return -1;
     debug_print_menuitem ("  item: ", item, "");
     if (item->fType & MF_POPUP)
     {
-	POPUPMENU *menu = MENU_GetMenu( item->hSubMenu );
+        menu = MENU_GetMenu( item->hSubMenu );
 	if (!menu) return -1;
 	else return (menu->nItems << 8) | ((item->fState|item->fType) & 0xff);
     }
@@ -3847,9 +3862,10 @@ INT WINAPI GetMenuItemCount( HMENU hMenu )
  */
 UINT WINAPI GetMenuItemID( HMENU hMenu, INT nPos )
 {
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
     MENUITEM * lpmi;
 
-    if (!(lpmi = MENU_FindItem(&hMenu,(UINT*)&nPos,MF_BYPOSITION))) return -1;
+    if (!(lpmi = MENU_FindItem(&menu, (UINT *)&nPos, MF_BYPOSITION))) return -1;
     if (lpmi->fType & MF_POPUP) return -1;
     return lpmi->wID;
 
@@ -3976,15 +3992,14 @@ BOOL WINAPI AppendMenuW( HMENU hMenu, UINT flags,
  */
 BOOL WINAPI RemoveMenu( HMENU hMenu, UINT nPos, UINT wFlags )
 {
-    LPPOPUPMENU	menu;
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
     MENUITEM *item;
 
     TRACE("(menu=%p pos=%04x flags=%04x)\n",hMenu, nPos, wFlags);
-    if (!(item = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE;
-    if (!(menu = MENU_GetMenu(hMenu))) return FALSE;
+    if (!(item = MENU_FindItem( &menu, &nPos, wFlags ))) return FALSE;
 
     /* Remove item */
-    if ((item->fType & MF_POPUP) && item->hSubMenu)
+    if (item->fType & MF_POPUP)
         MENU_ReleaseMenu(MENU_GetMenu(item->hSubMenu));
 
     MENU_FreeItemData( item );
@@ -4016,7 +4031,8 @@ BOOL WINAPI RemoveMenu( HMENU hMenu, UINT nPos, UINT wFlags )
  */
 BOOL WINAPI DeleteMenu( HMENU hMenu, UINT nPos, UINT wFlags )
 {
-    MENUITEM *item = MENU_FindItem( &hMenu, &nPos, wFlags );
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
+    MENUITEM *item = MENU_FindItem( &menu, &nPos, wFlags );
     if (!item) return FALSE;
     if (item->fType & MF_POPUP) DestroyMenu( item->hSubMenu );
       /* nPos is now the position of the item */
@@ -4031,6 +4047,7 @@ BOOL WINAPI DeleteMenu( HMENU hMenu, UINT nPos, UINT wFlags )
 BOOL WINAPI ModifyMenuW( HMENU hMenu, UINT pos, UINT flags,
                          UINT_PTR id, LPCWSTR str )
 {
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
     MENUITEM *item;
     MENUITEMINFOW mii;
 
@@ -4039,13 +4056,13 @@ BOOL WINAPI ModifyMenuW( HMENU hMenu, UINT pos, UINT flags,
     else
         TRACE("%p %d %04x %04lx %p\n", hMenu, pos, flags, id, str );
 
-    if (!(item = MENU_FindItem( &hMenu, &pos, flags )))
+    if (!(item = MENU_FindItem( &menu, &pos, flags )))
     {
         /* workaround for Word 95: pretend that SC_TASKLIST item exists */
         if (pos == SC_TASKLIST && !(flags & MF_BYPOSITION)) return TRUE;
         return FALSE;
     }
-    MENU_GetMenu(hMenu)->Height = 0; /* force size recalculate */
+    menu->Height = 0; /* force size recalculation */
     MENU_mnu2mnuii( flags, id, str, &mii);
     return SetMenuItemInfo_common( item, &mii, TRUE);
 }
@@ -4106,9 +4123,10 @@ DWORD WINAPI GetMenuCheckMarkDimensions(void)
 BOOL WINAPI SetMenuItemBitmaps( HMENU hMenu, UINT nPos, UINT wFlags,
                                     HBITMAP hNewUnCheck, HBITMAP hNewCheck)
 {
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
     MENUITEM *item;
 
-    if (!(item = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE;
+    if (!(item = MENU_FindItem( &menu, &nPos, wFlags ))) return FALSE;
 
     if (!hNewCheck && !hNewUnCheck)
     {
@@ -4410,9 +4428,10 @@ BOOL WINAPI SetMenu( HWND hWnd, HMENU hMenu )
  */
 HMENU WINAPI GetSubMenu( HMENU hMenu, INT nPos )
 {
+    POPUPMENU *menu = MENU_GetMenu(hMenu);
     MENUITEM * lpmi;
 
-    if (!(lpmi = MENU_FindItem(&hMenu,(UINT*)&nPos,MF_BYPOSITION))) return 0;
+    if (!(lpmi = MENU_FindItem(&menu, (UINT *)&nPos, MF_BYPOSITION))) return 0;
     if (!(lpmi->fType & MF_POPUP)) return 0;
     return lpmi->hSubMenu;
 }
@@ -4618,7 +4637,8 @@ BOOL WINAPI IsMenu(HMENU hmenu)
 static BOOL GetMenuItemInfo_common ( HMENU hmenu, UINT item, BOOL bypos,
 					LPMENUITEMINFOW lpmii, BOOL unicode)
 {
-    MENUITEM *menu = MENU_FindItem (&hmenu, &item, bypos ? MF_BYPOSITION : 0);
+    POPUPMENU *popup = MENU_GetMenu(hmenu);
+    MENUITEM *menu = MENU_FindItem (&popup, &item, bypos ? MF_BYPOSITION : 0);
 
     debug_print_menuitem("GetMenuItemInfo_common: ", menu, "");
 
@@ -4936,6 +4956,7 @@ static BOOL MENU_NormalizeMenuItemInfoStruct( const MENUITEMINFOW *pmii_in,
 BOOL WINAPI SetMenuItemInfoA(HMENU hmenu, UINT item, BOOL bypos,
                                  const MENUITEMINFOA *lpmii)
 {
+    POPUPMENU *menu = MENU_GetMenu(hmenu);
     MENUITEM *menuitem;
     MENUITEMINFOW mii;
 
@@ -4943,7 +4964,7 @@ BOOL WINAPI SetMenuItemInfoA(HMENU hmenu, UINT item, BOOL bypos,
 
     if (!MENU_NormalizeMenuItemInfoStruct( (const MENUITEMINFOW *)lpmii, &mii )) return FALSE;
 
-    if (!(menuitem = MENU_FindItem( &hmenu, &item, bypos? MF_BYPOSITION : 0 )))
+    if (!(menuitem = MENU_FindItem( &menu, &item, bypos? MF_BYPOSITION : 0 )))
     {
         /* workaround for Word 95: pretend that SC_TASKLIST item exists */
         if (item == SC_TASKLIST && !bypos) return TRUE;
@@ -4958,13 +4979,14 @@ BOOL WINAPI SetMenuItemInfoA(HMENU hmenu, UINT item, BOOL bypos,
 BOOL WINAPI SetMenuItemInfoW(HMENU hmenu, UINT item, BOOL bypos,
                                  const MENUITEMINFOW *lpmii)
 {
+    POPUPMENU *menu = MENU_GetMenu(hmenu);
     MENUITEM *menuitem;
     MENUITEMINFOW mii;
 
     TRACE("hmenu %p, item %u, by pos %d, info %p\n", hmenu, item, bypos, lpmii);
 
     if (!MENU_NormalizeMenuItemInfoStruct( lpmii, &mii )) return FALSE;
-    if (!(menuitem = MENU_FindItem( &hmenu, &item, bypos? MF_BYPOSITION : 0 )))
+    if (!(menuitem = MENU_FindItem( &menu, &item, bypos? MF_BYPOSITION : 0 )))
     {
         /* workaround for Word 95: pretend that SC_TASKLIST item exists */
         if (item == SC_TASKLIST && !bypos) return TRUE;
@@ -5107,10 +5129,10 @@ BOOL WINAPI CheckMenuRadioItem(HMENU hMenu,
 				   UINT first, UINT last, UINT check,
 				   UINT bypos)
 {
+    POPUPMENU *m_first, *m_check;
     BOOL done = FALSE;
     UINT i;
     MENUITEM *mi_first = NULL, *mi_check;
-    HMENU m_first, m_check;
 
     for (i = first; i <= last; i++)
     {
@@ -5118,7 +5140,7 @@ BOOL WINAPI CheckMenuRadioItem(HMENU hMenu,
 
         if (!mi_first)
         {
-            m_first = hMenu;
+            m_first = MENU_GetMenu(hMenu);
             mi_first = MENU_FindItem(&m_first, &pos, bypos);
             if (!mi_first) continue;
             mi_check = mi_first;
@@ -5126,7 +5148,7 @@ BOOL WINAPI CheckMenuRadioItem(HMENU hMenu,
         }
         else
         {
-            m_check = hMenu;
+            m_check = MENU_GetMenu(hMenu);
             mi_check = MENU_FindItem(&m_check, &pos, bypos);
             if (!mi_check) continue;
         }
@@ -5161,18 +5183,15 @@ BOOL WINAPI CheckMenuRadioItem(HMENU hMenu,
  */
 BOOL WINAPI GetMenuItemRect(HWND hwnd, HMENU hMenu, UINT uItem, RECT *rect)
 {
-     POPUPMENU *menu;
+     POPUPMENU *menu = MENU_GetMenu(hMenu);
      MENUITEM *item;
 
      TRACE("(%p,%p,%d,%p)\n", hwnd, hMenu, uItem, rect);
 
-     item = MENU_FindItem (&hMenu, &uItem, MF_BYPOSITION);
+     item = MENU_FindItem (&menu, &uItem, MF_BYPOSITION);
      if ((rect == NULL) || (item == NULL))
          return FALSE;
 
-     menu = MENU_GetMenu(hMenu);
-     if (!menu) return FALSE;
-
      if (!hwnd) hwnd = menu->hWnd;
      if (!hwnd) return FALSE;
 
@@ -5384,17 +5403,20 @@ static BOOL translate_accelerator( HWND hWnd, UINT message, WPARAM wParam, LPARA
         mesg = 1;
     else
     {
-        HMENU hMenu, hSubMenu, hSysMenu;
+        HMENU hMenu, hSysMenu;
+        POPUPMENU *menu, *subMenu, *sysMenu;
         UINT uSysStat = (UINT)-1, uStat = (UINT)-1, nPos;
 
         hMenu = (GetWindowLongW( hWnd, GWL_STYLE ) & WS_CHILD) ? 0 : GetMenu(hWnd);
+        menu = MENU_GetMenu(hMenu);
         hSysMenu = get_win_sys_menu( hWnd );
+        sysMenu = MENU_GetMenu(hSysMenu);
 
         /* find menu item and ask application to initialize it */
         /* 1. in the system menu */
-        hSubMenu = hSysMenu;
+        subMenu = sysMenu;
         nPos = cmd;
-        if(MENU_FindItem(&hSubMenu, &nPos, MF_BYCOMMAND))
+        if (MENU_FindItem(&subMenu, &nPos, MF_BYCOMMAND))
         {
             if (GetCapture())
                 mesg = 2;
@@ -5403,20 +5425,20 @@ static BOOL translate_accelerator( HWND hWnd, UINT message, WPARAM wParam, LPARA
             else
             {
                 SendMessageW(hWnd, WM_INITMENU, (WPARAM)hSysMenu, 0L);
-                if(hSubMenu != hSysMenu)
+                if (subMenu != sysMenu)
                 {
-                    nPos = MENU_FindSubMenu(&hSysMenu, hSubMenu);
-                    TRACE_(accel)("hSysMenu = %p, hSubMenu = %p, nPos = %d\n", hSysMenu, hSubMenu, nPos);
-                    SendMessageW(hWnd, WM_INITMENUPOPUP, (WPARAM)hSubMenu, MAKELPARAM(nPos, TRUE));
+                    nPos = MENU_FindSubMenu(&sysMenu, subMenu);
+                    TRACE_(accel)("sysMenu = %p, subMenu = %p, nPos = %d\n", sysMenu, subMenu, nPos);
+                    SendMessageW(hWnd, WM_INITMENUPOPUP, (WPARAM)MENU_GetHandle(subMenu), MAKELPARAM(nPos, TRUE));
                 }
                 uSysStat = GetMenuState(GetSubMenu(hSysMenu, 0), cmd, MF_BYCOMMAND);
             }
         }
         else /* 2. in the window's menu */
         {
-            hSubMenu = hMenu;
+            subMenu = menu;
             nPos = cmd;
-            if(MENU_FindItem(&hSubMenu, &nPos, MF_BYCOMMAND))
+            if (MENU_FindItem(&subMenu, &nPos, MF_BYCOMMAND))
             {
                 if (GetCapture())
                     mesg = 2;
@@ -5425,11 +5447,11 @@ static BOOL translate_accelerator( HWND hWnd, UINT message, WPARAM wParam, LPARA
                 else
                 {
                     SendMessageW(hWnd, WM_INITMENU, (WPARAM)hMenu, 0L);
-                    if(hSubMenu != hMenu)
+                    if (subMenu != menu)
                     {
-                        nPos = MENU_FindSubMenu(&hMenu, hSubMenu);
-                        TRACE_(accel)("hMenu = %p, hSubMenu = %p, nPos = %d\n", hMenu, hSubMenu, nPos);
-                        SendMessageW(hWnd, WM_INITMENUPOPUP, (WPARAM)hSubMenu, MAKELPARAM(nPos, FALSE));
+                        nPos = MENU_FindSubMenu(&menu, subMenu);
+                        TRACE_(accel)("hMenu = %p, subMenu = %p, nPos = %d\n", hMenu, subMenu, nPos);
+                        SendMessageW(hWnd, WM_INITMENUPOPUP, (WPARAM)MENU_GetHandle(subMenu), MAKELPARAM(nPos, FALSE));
                     }
                     uStat = GetMenuState(hMenu, cmd, MF_BYCOMMAND);
                 }
-- 
2.16.3




More information about the wine-devel mailing list