clicking in another window also no longer closed the menu unless focus was changed. Fixed in click checker in general menu code, so it'll improve menus on X11 as well. Our Windows part now only needed for when losing focus because switching to a non-FreeGLUT window

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1610 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
dcnieho 2013-04-06 10:17:04 +00:00
parent 7ae2b6eee1
commit 123c48b2ae
2 changed files with 15 additions and 37 deletions

View 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 &&

View 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);
}
};