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