fixes two cases of menu's not closing when they should:
[freeglut] / src / mswin / fg_main_mswin.c
index c777b46..c72e467 100644 (file)
@@ -493,13 +493,33 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         break;
 
     case WM_KILLFOCUS:
-/*        printf("WM_KILLFOCUS: %p\n", window ); */
+/*        printf("WM_KILLFOCUS (ismenu: %i): %p\n", window->IsMenu, window ); */
         lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
         INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );
 
+        /* If this is a menu that lost focus, see if user either switched
+           application or FreeGLUT window (if one is running multiple
+           windows). If so, close menu that lost focus.
+         */
         if( window->IsMenu &&
             window->ActiveMenu && window->ActiveMenu->IsActive )
-            fgUpdateMenuHighlight( window->ActiveMenu );
+        {
+            SFG_Window* wnd = NULL;
+            HWND hwnd = GetForegroundWindow();  /* Get window with current focus */
+            if (hwnd)
+                /* See if its one of our windows */
+                wnd = fgWindowByHandle(hwnd);
+
+            if (!hwnd || !wnd)
+                /* User switched to another application*/
+                fgDeactivateMenu(window->ActiveMenu->ParentWindow);
+            else if (
+                ( wnd->IsMenu && wnd->ActiveMenu->ParentWindow!=window->ActiveMenu->ParentWindow) ||    /* Make sure we don't kill the menu when trying to enter a submenu */
+                (!wnd->IsMenu && wnd!=window->ActiveMenu->ParentWindow)
+                )
+                /* User switched to another FreeGLUT window */
+                fgDeactivateMenu(window->ActiveMenu->ParentWindow);
+        }
 
         break;