some clean up in WM_KILLFOCUS handler
[freeglut] / src / mswin / fg_main_mswin.c
index c777b46..3e1a86f 100644 (file)
@@ -493,14 +493,54 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         break;
 
     case WM_KILLFOCUS:
-/*        printf("WM_KILLFOCUS: %p\n", window ); */
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
-        INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );
-
-        if( window->IsMenu &&
-            window->ActiveMenu && window->ActiveMenu->IsActive )
-            fgUpdateMenuHighlight( window->ActiveMenu );
+        {
+            SFG_Menu* menu = NULL;
+            printf("WM_KILLFOCUS: %p\n", window ); 
+            lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+            INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );
 
+            /* If we have an open menu, see if the open menu should be closed
+               when focus was lost because user either switched
+               application or FreeGLUT window (if one is running multiple
+               windows). If so, close menu the active menu.
+             */
+            if ( fgStructure.Menus.First )
+                menu = fgGetActiveMenu();
+            
+            if ( menu )
+            {
+                SFG_Window* wnd = NULL;
+                HWND hwnd = GetFocus();  /* Get window with current focus - NULL for non freeglut windows */
+                printf("  hwnd: %p\n",hwnd);
+                if (hwnd)
+                    /* See which of our windows it is */
+                    wnd = fgWindowByHandle(hwnd);
+
+                //printf("  got menu: %p\n",menu);
+
+                printf("  wnd: %p, wnd->AM->PW: %p, menu->PW: %p\n",wnd,wnd&&wnd->ActiveMenu?wnd->ActiveMenu->ParentWindow:0,menu->ParentWindow);
+                if (wnd)
+                    printf("  wnd menu: %i, wnd->ActiveMenu: %p, wnd->Parent: %p\n",wnd->IsMenu,wnd->ActiveMenu,wnd->Parent);
+
+                if (!hwnd || !wnd)
+                {
+                    /* User switched to another application*/
+                    fgDeactivateMenu(menu->ParentWindow);
+                    printf("  -> kill1\n");
+                }
+                else if (!wnd->IsMenu && wnd!=menu->ParentWindow)
+                {
+                    /* User switched to another FreeGLUT window */
+                    fgDeactivateMenu(menu->ParentWindow);
+                    printf("  -> kill2\n");
+
+                }
+                else
+                {
+                    printf("  -> survive\n");
+                }
+            }
+        }
         break;
 
 #if 0