- moving to a new way of handling window changes (position, size, visibility)
[freeglut] / src / mswin / fg_menu_mswin.c
index 0d6a599..2db1ea7 100644 (file)
@@ -29,7 +29,8 @@
 #include <GL/freeglut.h>
 #include "../fg_internal.h"
 
-extern RECT fghGetClientArea( const SFG_Window *window, BOOL wantPosOutside );
+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 )
@@ -63,17 +64,20 @@ void fgPlatformCheckMenuDeactivate()
             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)
-                */
+                 * window was pressed (pressing on client area is
+                 * handled in fgCheckActiveMenu)
+                 */
                 POINT mouse_pos;
-                RECT clientArea = fghGetClientArea(menu->ParentWindow, GL_FALSE);
+                RECT clientArea;
+                fghGetClientArea(&clientArea,menu->ParentWindow, FALSE);
                 GetCursorPos(&mouse_pos);
                 if ( !PtInRect( &clientArea, mouse_pos ) )
                     fgDeactivateMenu(menu->ParentWindow);