In win32 a WM_MENUSELECT message should contain the position when the
item refers to a submenu, not the submenu's handle as in win16.

diff --git a/controls/menu.c b/controls/menu.c
index e3ccf55..24b2fc5 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -579,6 +579,39 @@
 }
 
 /***********************************************************************
+ *           MENU_FindSubMenu
+ *
+ * Find a Sub menu. Return the position of the submenu, and modifies 
+ * *hmenu in case it is found in another sub-menu.
+ * If the submenu cannot be found, NO_SELECTED_ITEM is returned.
+ */
+UINT MENU_FindSubMenu( HMENU *hmenu, HMENU hSubTarget )
+{
+    POPUPMENU *menu;
+    UINT i;
+    MENUITEM *item;
+    if (((*hmenu)==0xffff) || 
+            (!(menu = (POPUPMENU *) USER_HEAP_LIN_ADDR(*hmenu)))) 
+        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) {
+            return i;
+        }
+        else  {
+            HMENU hsubmenu = item->hSubMenu;
+            UINT pos = MENU_FindSubMenu( &hsubmenu, hSubTarget );
+            if (pos != NO_SELECTED_ITEM) {
+                *hmenu = hsubmenu;
+                return pos;
+            }
+        }
+    }
+    return NO_SELECTED_ITEM;
+}
+
+/***********************************************************************
  *           MENU_FreeItemData
  */
 static void MENU_FreeItemData( MENUITEM* item )
@@ -1589,7 +1622,7 @@
  *           MENU_SelectItem
  */
 static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex,
-                             BOOL sendMenuSelect )
+                             BOOL sendMenuSelect, HMENU topmenu )
 {
     LPPOPUPMENU lppop;
     HDC hdc;
@@ -1599,10 +1632,6 @@
     lppop = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
     if (!lppop->nItems) return;
 
-    if ((wIndex != NO_SELECTED_ITEM) && 
-	(lppop->items[wIndex].fType & MF_SEPARATOR))
-	wIndex = NO_SELECTED_ITEM;
-
     if (lppop->FocusedItem == wIndex) return;
     if (lppop->wFlags & MF_POPUP) hdc = GetDC( lppop->hWnd );
     else hdc = GetDCEx( lppop->hWnd, 0, DCX_CACHE | DCX_WINDOW);
@@ -1622,20 +1651,32 @@
     lppop->FocusedItem = wIndex;
     if (lppop->FocusedItem != NO_SELECTED_ITEM) 
     {
-	lppop->items[lppop->FocusedItem].fState |= MF_HILITE;
-	MENU_DrawMenuItem( lppop->hWnd, hmenu, hwndOwner, hdc, &lppop->items[lppop->FocusedItem],
-                           lppop->Height, !(lppop->wFlags & MF_POPUP),
-			   ODA_SELECT );
+        if(!(lppop->items[wIndex].fType & MF_SEPARATOR)) {
+            lppop->items[wIndex].fState |= MF_HILITE;
+            MENU_DrawMenuItem( lppop->hWnd, hmenu, hwndOwner, hdc, 
+                    &lppop->items[wIndex], lppop->Height,
+                    !(lppop->wFlags & MF_POPUP), ODA_SELECT );
+        }
         if (sendMenuSelect)
         {
             MENUITEM *ip = &lppop->items[lppop->FocusedItem];
 	    SendMessageA( hwndOwner, WM_MENUSELECT, 
-	                 MAKELONG(ip->wID,ip->fType | (ip->fState | MF_MOUSESELECT)), hmenu);
+                     MAKELONG(ip->fType & MF_POPUP ? wIndex: ip->wID,
+                     ip->fType | ip->fState | MF_MOUSESELECT |
+                     (lppop->wFlags & MF_SYSMENU)), hmenu);
         }
     }
     else if (sendMenuSelect) {
-        SendMessageA( hwndOwner, WM_MENUSELECT, 
-                     MAKELONG( hmenu, lppop->wFlags | MF_MOUSESELECT), hmenu ); 
+        if(topmenu){
+            int pos;
+            if((pos=MENU_FindSubMenu(&topmenu, hmenu))!=NO_SELECTED_ITEM){
+                POPUPMENU *ptm = (POPUPMENU *) USER_HEAP_LIN_ADDR( topmenu );
+                MENUITEM *ip = &ptm->items[pos];
+                SendMessageA( hwndOwner, WM_MENUSELECT, MAKELONG(pos, 
+                         ip->fType | ip->fState | MF_MOUSESELECT |
+                         (ptm->wFlags & MF_SYSMENU)), topmenu);
+            }
+        }
     }
     ReleaseDC( lppop->hWnd, hdc );
 }
@@ -1665,7 +1706,7 @@
 					    ; i += offset)
 	    if (!(menu->items[i].fType & MF_SEPARATOR))
 	    {
-		MENU_SelectItem( hwndOwner, hmenu, i, TRUE );
+		MENU_SelectItem( hwndOwner, hmenu, i, TRUE, 0 );
 		return;
 	    }
     }
@@ -1674,7 +1715,7 @@
 		  i >= 0 && i < menu->nItems ; i += offset)
 	if (!(menu->items[i].fType & MF_SEPARATOR))
 	{
-	    MENU_SelectItem( hwndOwner, hmenu, i, TRUE );
+	    MENU_SelectItem( hwndOwner, hmenu, i, TRUE, 0 );
 	    return;
 	}
 }
@@ -1979,7 +2020,7 @@
 
 	submenu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hsubmenu );
 	MENU_HideSubPopups( hwndOwner, hsubmenu, FALSE );
-	MENU_SelectItem( hwndOwner, hsubmenu, NO_SELECTED_ITEM, sendMenuSelect );
+	MENU_SelectItem( hwndOwner, hsubmenu, NO_SELECTED_ITEM, sendMenuSelect, 0 );
 
 	if (submenu->hWnd == MENU_GetTopPopupWnd()->hwndSelf )
 	{
@@ -2192,11 +2233,11 @@
     {
 	/* both are top level menus (system and menu-bar) */
 	MENU_HideSubPopups( pmt->hOwnerWnd, pmt->hTopMenu, FALSE );
-	MENU_SelectItem( pmt->hOwnerWnd, pmt->hTopMenu, NO_SELECTED_ITEM, FALSE );
+	MENU_SelectItem( pmt->hOwnerWnd, pmt->hTopMenu, NO_SELECTED_ITEM, FALSE, 0 );
         pmt->hTopMenu = hPtMenu;
     }
     else MENU_HideSubPopups( pmt->hOwnerWnd, hPtMenu, FALSE );
-    MENU_SelectItem( pmt->hOwnerWnd, hPtMenu, id, TRUE );
+    MENU_SelectItem( pmt->hOwnerWnd, hPtMenu, id, TRUE, 0 );
 }
 
 
@@ -2304,7 +2345,8 @@
     if( id == NO_SELECTED_ITEM )
     {
 	MENU_SelectItem( pmt->hOwnerWnd, pmt->hCurrentMenu, 
-			 NO_SELECTED_ITEM, TRUE );
+			 NO_SELECTED_ITEM, TRUE, pmt->hTopMenu);
+        
     }
     else if( ptmenu->FocusedItem != id )
     {
@@ -2401,7 +2443,8 @@
 
 	if( hNewMenu != pmt->hTopMenu )
 	{
-	    MENU_SelectItem( pmt->hOwnerWnd, pmt->hTopMenu, NO_SELECTED_ITEM, FALSE );
+	    MENU_SelectItem( pmt->hOwnerWnd, pmt->hTopMenu, NO_SELECTED_ITEM, 
+                    FALSE, 0 );
 	    if( pmt->hCurrentMenu != pmt->hTopMenu ) 
 		MENU_HideSubPopups( pmt->hOwnerWnd, pmt->hTopMenu, FALSE );
 	}
@@ -2414,7 +2457,7 @@
 	}
 
 	pmt->hTopMenu = pmt->hCurrentMenu = hNewMenu; /* all subpopups are hidden */
-	MENU_SelectItem( pmt->hOwnerWnd, pmt->hTopMenu, id, TRUE ); 
+	MENU_SelectItem( pmt->hOwnerWnd, pmt->hTopMenu, id, TRUE, 0 ); 
 
 	return TRUE;
     }
@@ -2478,7 +2521,7 @@
 	NO_SELECTED_ITEM ) {
 	
 	MENU_SelectItem( pmt->hOwnerWnd, pmt->hCurrentMenu,
-			 prevcol, TRUE );
+			 prevcol, TRUE, 0 );
 	return;
     }
 
@@ -2545,7 +2588,7 @@
 	NO_SELECTED_ITEM ) {
 	TRACE("Going to %d.\n", nextcol );
 	MENU_SelectItem( pmt->hOwnerWnd, pmt->hCurrentMenu,
-			 nextcol, TRUE );
+			 nextcol, TRUE, 0 );
 	return;
     }
 
@@ -2686,7 +2729,7 @@
 		case VK_HOME:
 		case VK_END:
 		    MENU_SelectItem( mt.hOwnerWnd, mt.hCurrentMenu, 
-				     NO_SELECTED_ITEM, FALSE );
+				     NO_SELECTED_ITEM, FALSE, 0 );
 		/* fall through */
 		case VK_UP:
 		    MENU_MoveSelection( mt.hOwnerWnd, mt.hCurrentMenu, 
@@ -2751,7 +2794,8 @@
 		    else if (pos == (UINT)-1) MessageBeep(0);
 		    else
 		    {
-			MENU_SelectItem( mt.hOwnerWnd, mt.hCurrentMenu, pos, TRUE );
+			MENU_SelectItem( mt.hOwnerWnd, mt.hCurrentMenu, pos,
+                                TRUE, 0 );
                         executedMenuId = MENU_ExecFocusedItem(&mt,mt.hCurrentMenu, wFlags);
                         fEndMenu = (executedMenuId != -1);
 		    }
@@ -2786,7 +2830,7 @@
 	    ShowWindow( menu->hWnd, SW_HIDE );
 	    uSubPWndLevel = 0;
 	}
-	MENU_SelectItem( mt.hOwnerWnd, mt.hTopMenu, NO_SELECTED_ITEM, FALSE );
+	MENU_SelectItem( mt.hOwnerWnd, mt.hTopMenu, NO_SELECTED_ITEM, FALSE, 0 );
 	SendMessageA( mt.hOwnerWnd, WM_MENUSELECT, MAKELONG(0,0xffff), 0 );
     }
 
@@ -2897,7 +2941,7 @@
 
 	if( hTrackMenu )
 	{
- 	    MENU_SelectItem( wndPtr->hwndSelf, hTrackMenu, uItem, TRUE );
+ 	    MENU_SelectItem( wndPtr->hwndSelf, hTrackMenu, uItem, TRUE, 0 );
 
 	    if( uItem == NO_SELECTED_ITEM )
 		MENU_MoveSelection( wndPtr->hwndSelf, hTrackMenu, ITEM_NEXT );
@@ -3315,7 +3359,7 @@
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return FALSE;
     if (menu->FocusedItem == wItemID) return TRUE;
     MENU_HideSubPopups( hWnd, hMenu, FALSE );
-    MENU_SelectItem( hWnd, hMenu, wItemID, TRUE );
+    MENU_SelectItem( hWnd, hMenu, wItemID, TRUE, 0 );
     return TRUE;
 }