Revalidate menu handle in mt.hTopMenu after DispatchMessage.
diff --git a/controls/menu.c b/controls/menu.c
index 9791704..afade7e 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -2907,24 +2907,31 @@
ReleaseCapture();
- menu = MENU_GetMenu( mt.hTopMenu );
-
- if( IsWindow( mt.hOwnerWnd ) )
+ /* If dropdown is still painted and the close box is clicked on
+ then the menu will be destroyed as part of the DispatchMessage above.
+ This will then invalidate the menu handle in mt.hTopMenu. We should
+ check for this first. */
+ if( IsMenu( mt.hTopMenu ) )
{
- MENU_HideSubPopups( mt.hOwnerWnd, mt.hTopMenu, FALSE );
+ menu = MENU_GetMenu( mt.hTopMenu );
- if (menu && menu->wFlags & MF_POPUP)
- {
- ShowWindow( menu->hWnd, SW_HIDE );
- uSubPWndLevel = 0;
- }
- MENU_SelectItem( mt.hOwnerWnd, mt.hTopMenu, NO_SELECTED_ITEM, FALSE, 0 );
- SendMessageA( mt.hOwnerWnd, WM_MENUSELECT, MAKELONG(0,0xffff), 0 );
+ if( IsWindow( mt.hOwnerWnd ) )
+ {
+ MENU_HideSubPopups( mt.hOwnerWnd, mt.hTopMenu, FALSE );
+
+ if (menu && menu->wFlags & MF_POPUP)
+ {
+ ShowWindow( menu->hWnd, SW_HIDE );
+ uSubPWndLevel = 0;
+ }
+ MENU_SelectItem( mt.hOwnerWnd, mt.hTopMenu, NO_SELECTED_ITEM, FALSE, 0 );
+ SendMessageA( mt.hOwnerWnd, WM_MENUSELECT, MAKELONG(0,0xffff), 0 );
+ }
+
+ /* Reset the variable for hiding menu */
+ if( menu ) menu->bTimeToHide = FALSE;
}
- /* Reset the variable for hiding menu */
- menu->bTimeToHide = FALSE;
-
/* The return value is only used by TrackPopupMenu */
return ((executedMenuId != -1) ? executedMenuId : 0);
}