redisplay is now also on the work list instead of handled separately
[freeglut] / src / mswin / fg_menu_mswin.c
index 0d6a599..93c538e 100644 (file)
@@ -29,7 +29,6 @@
 #include <GL/freeglut.h>
 #include "../fg_internal.h"
 
-extern RECT fghGetClientArea( const SFG_Window *window, BOOL wantPosOutside );
 
 
 GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )
@@ -38,47 +37,24 @@ GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )
     *y = glutGet ( GLUT_SCREEN_HEIGHT );
 }
 
-void fgPlatformCheckMenuDeactivate()
+void fgPlatformCheckMenuDeactivate(HWND newFocusWnd)
 {
-    /* 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.
+    /* User/system switched application focus.
+     * If we have an open menu, close it.
      */
     SFG_Menu* menu = NULL;
 
-    if ( fgStructure.Menus.First )
+    if ( fgState.ActiveMenus )
         menu = fgGetActiveMenu();
 
     if ( menu )
     {
-        SFG_Window* wnd = NULL;
-        HWND hwnd = GetFocus();  /* Get window with current focus - NULL for non freeglut windows */
-        if (hwnd)
-            /* See which of our windows it is */
-            wnd = fgWindowByHandle(hwnd);
-
-        if (!hwnd || !wnd)
-            /* User switched to another application*/
+        if (newFocusWnd != menu->Window->Window.Handle)
+            /* When in GameMode, the menu's parent window will lose focus when the menu is opened.
+             * This is sadly necessary as we need to do an activating ShowWindow() for the menu
+             * to pop up over the gamemode window
+             */
             fgDeactivateMenu(menu->ParentWindow);
-        else if (!wnd->IsMenu)      /* Make sure we don't kill the menu when trying to enter a submenu */
-        {
-            if (wnd!=menu->ParentWindow)
-                /* User switched to another FreeGLUT window */
-                fgDeactivateMenu(menu->ParentWindow);
-            else
-            {
-                /* Check if focus lost because non-client area of
-                * window was pressed (pressing on client area is
-                * handled in fgCheckActiveMenu)
-                */
-                POINT mouse_pos;
-                RECT clientArea = fghGetClientArea(menu->ParentWindow, GL_FALSE);
-                GetCursorPos(&mouse_pos);
-                if ( !PtInRect( &clientArea, mouse_pos ) )
-                    fgDeactivateMenu(menu->ParentWindow);
-            }
-        }
     }
 };