diff --git a/freeglut/freeglut/src/fg_menu.c b/freeglut/freeglut/src/fg_menu.c index 61ffe55..d3c435f 100644 --- a/freeglut/freeglut/src/fg_menu.c +++ b/freeglut/freeglut/src/fg_menu.c @@ -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 && diff --git a/freeglut/freeglut/src/mswin/fg_menu_mswin.c b/freeglut/freeglut/src/mswin/fg_menu_mswin.c index 2db1ea7..9df001e 100644 --- a/freeglut/freeglut/src/mswin/fg_menu_mswin.c +++ b/freeglut/freeglut/src/mswin/fg_menu_mswin.c @@ -29,8 +29,6 @@ #include #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); } };