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:
parent
7ae2b6eee1
commit
123c48b2ae
@ -568,7 +568,8 @@ GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,
|
|||||||
* location.
|
* location.
|
||||||
* - Down-click any button outside the menu, menu active:
|
* - Down-click any button outside the menu, menu active:
|
||||||
* deactivate the menu, and potentially activate a new menu
|
* 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:
|
* - Down-click any button inside the menu, menu active:
|
||||||
* select the menu entry and deactivate the menu
|
* select the menu entry and deactivate the menu
|
||||||
* - Up-click the menu button, menu not active: nothing happens
|
* - 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;
|
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. */
|
/* No active menu, let's check whether we need to activate one. */
|
||||||
if( !is_clicked &&
|
if( !is_clicked &&
|
||||||
|
@ -29,8 +29,6 @@
|
|||||||
#include <GL/freeglut.h>
|
#include <GL/freeglut.h>
|
||||||
#include "../fg_internal.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 )
|
GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )
|
||||||
@ -41,10 +39,8 @@ GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )
|
|||||||
|
|
||||||
void fgPlatformCheckMenuDeactivate()
|
void fgPlatformCheckMenuDeactivate()
|
||||||
{
|
{
|
||||||
/* If we have an open menu, see if the open menu should be closed
|
/* User/system switched application focus.
|
||||||
* when focus was lost because user either switched
|
* If we have an open menu, close it.
|
||||||
* application or FreeGLUT window (if one is running multiple
|
|
||||||
* windows). If so, close menu the active menu.
|
|
||||||
*/
|
*/
|
||||||
SFG_Menu* menu = NULL;
|
SFG_Menu* menu = NULL;
|
||||||
|
|
||||||
@ -53,36 +49,8 @@ void fgPlatformCheckMenuDeactivate()
|
|||||||
|
|
||||||
if ( menu )
|
if ( menu )
|
||||||
{
|
{
|
||||||
SFG_Window* wnd = NULL;
|
printf("focus menu close\n");
|
||||||
HWND hwnd = GetFocus(); /* Get window with current focus - NULL for non freeglut windows */
|
fgDeactivateMenu(menu->ParentWindow);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user