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;
}