clicking in another window also no longer closed the menu unless focus was changed...
authorDiederick Niehorster <dcnieho@gmail.com>
Sat, 6 Apr 2013 10:17:04 +0000 (10:17 +0000)
committerDiederick Niehorster <dcnieho@gmail.com>
Sat, 6 Apr 2013 10:17:04 +0000 (10:17 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1610 7f0cb862-5218-0410-a997-914c9d46530a

src/fg_menu.c
src/mswin/fg_menu_mswin.c

index 61ffe55..d3c435f 100644 (file)
@@ -568,7 +568,8 @@ GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,
      *    location.
      *  - Down-click any button outside the menu, menu active:
      *    deactivate the menu, and potentially activate a new menu
-     *    at the new mouse location
+     *    at the new mouse location. This includes clicks in
+     *    different windows of course
      *  - Down-click any button inside the menu, menu active:
      *    select the menu entry and deactivate the menu
      *  - Up-click the menu button, menu not active:  nothing happens
@@ -631,6 +632,15 @@ GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,
 
         is_handled = GL_TRUE;
     }
+    else if ( fgStructure.Menus.First ) /* Don't have to check whether this was a downpress or an uppress, there is no way to get an uppress in another window before a downpress... */
+    {
+        /* if another window than the one clicked in has an open menu, close it */
+        SFG_Menu *menu = fgGetActiveMenu();
+        if ( menu ) /* any open menu? */
+            fgDeactivateMenu( menu->ParentWindow );
+
+        /* Leave is_handled to false, we didn't do anything relevant from the perspective of the window that was clicked */
+    }
 
     /* No active menu, let's check whether we need to activate one. */
     if( !is_clicked &&
index 2db1ea7..9df001e 100644 (file)
@@ -29,8 +29,6 @@
 #include <GL/freeglut.h>
 #include "../fg_internal.h"
 
-extern void fghGetClientArea( RECT *clientRect, const SFG_Window *window, BOOL posIsOutside );
-extern SFG_Window* fghWindowUnderCursor(SFG_Window *window);
 
 
 GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )
@@ -41,10 +39,8 @@ GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )
 
 void fgPlatformCheckMenuDeactivate()
 {
-    /* 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;
 
@@ -53,36 +49,8 @@ void fgPlatformCheckMenuDeactivate()
 
     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*/
-            fgDeactivateMenu(menu->ParentWindow);
-        else if (!wnd->IsMenu)      /* Make sure we don't kill the menu when trying to enter a submenu */
-        {
-            /* we need to know if user clicked a child window, any displayable area clicked that is not the menu's parent window should close the menu */
-            wnd = fghWindowUnderCursor(wnd);
-            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(&clientArea,menu->ParentWindow, FALSE);
-                GetCursorPos(&mouse_pos);
-                if ( !PtInRect( &clientArea, mouse_pos ) )
-                    fgDeactivateMenu(menu->ParentWindow);
-            }
-        }
+        printf("focus menu close\n");
+        fgDeactivateMenu(menu->ParentWindow);
     }
 };