Menu's work again in gamemode too now. We have to do a normal ShowWindow in gamemode, or the menu won't pop up over the gamemode window.
Also now using fgState.ActiveMenus instead of enumerating to see if there is an active menu git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1612 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
parent
60e65375c1
commit
02bb655c5c
@ -632,7 +632,7 @@ 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... */
|
else if ( fgState.ActiveMenus ) /* 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 */
|
/* if another window than the one clicked in has an open menu, close it */
|
||||||
SFG_Menu *menu = fgGetActiveMenu();
|
SFG_Menu *menu = fgGetActiveMenu();
|
||||||
@ -784,7 +784,7 @@ int FGAPIENTRY glutCreateMenu( FGCBMenu callback )
|
|||||||
{
|
{
|
||||||
/* The menu object creation code resides in freeglut_structure.c */
|
/* The menu object creation code resides in freeglut_structure.c */
|
||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateMenu" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateMenu" );
|
||||||
if (fgGetActiveMenu())
|
if (fgState.ActiveMenus)
|
||||||
fgError("Menu manipulation not allowed while menus in use.");
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
return fgCreateMenu( callback )->ID;
|
return fgCreateMenu( callback )->ID;
|
||||||
@ -801,7 +801,7 @@ void FGAPIENTRY glutDestroyMenu( int menuID )
|
|||||||
menu = fgMenuByID( menuID );
|
menu = fgMenuByID( menuID );
|
||||||
|
|
||||||
freeglut_return_if_fail( menu );
|
freeglut_return_if_fail( menu );
|
||||||
if (fgGetActiveMenu())
|
if (fgState.ActiveMenus)
|
||||||
fgError("Menu manipulation not allowed while menus in use.");
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
/* The menu object destruction code resides in freeglut_structure.c */
|
/* The menu object destruction code resides in freeglut_structure.c */
|
||||||
@ -846,7 +846,7 @@ void FGAPIENTRY glutAddMenuEntry( const char* label, int value )
|
|||||||
menuEntry = (SFG_MenuEntry *)calloc( sizeof(SFG_MenuEntry), 1 );
|
menuEntry = (SFG_MenuEntry *)calloc( sizeof(SFG_MenuEntry), 1 );
|
||||||
|
|
||||||
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
||||||
if (fgGetActiveMenu())
|
if (fgState.ActiveMenus)
|
||||||
fgError("Menu manipulation not allowed while menus in use.");
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
menuEntry->Text = strdup( label );
|
menuEntry->Text = strdup( label );
|
||||||
@ -871,7 +871,7 @@ void FGAPIENTRY glutAddSubMenu( const char *label, int subMenuID )
|
|||||||
subMenu = fgMenuByID( subMenuID );
|
subMenu = fgMenuByID( subMenuID );
|
||||||
|
|
||||||
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
||||||
if (fgGetActiveMenu())
|
if (fgState.ActiveMenus)
|
||||||
fgError("Menu manipulation not allowed while menus in use.");
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
freeglut_return_if_fail( subMenu );
|
freeglut_return_if_fail( subMenu );
|
||||||
@ -895,7 +895,7 @@ void FGAPIENTRY glutSetMenuFont( int menuID, void* fontID )
|
|||||||
menu = fgMenuByID( menuID );
|
menu = fgMenuByID( menuID );
|
||||||
freeglut_return_if_fail( menu );
|
freeglut_return_if_fail( menu );
|
||||||
|
|
||||||
if (fgGetActiveMenu())
|
if (fgState.ActiveMenus)
|
||||||
fgError("Menu manipulation not allowed while menus in use.");
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
font = fghFontByID( fontID );
|
font = fghFontByID( fontID );
|
||||||
@ -919,7 +919,7 @@ void FGAPIENTRY glutChangeToMenuEntry( int item, const char* label, int value )
|
|||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutChangeToMenuEntry" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutChangeToMenuEntry" );
|
||||||
|
|
||||||
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
||||||
if (fgGetActiveMenu())
|
if (fgState.ActiveMenus)
|
||||||
fgError("Menu manipulation not allowed while menus in use.");
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
/* Get n-th menu entry in the current menu, starting from one: */
|
/* Get n-th menu entry in the current menu, starting from one: */
|
||||||
@ -949,7 +949,7 @@ void FGAPIENTRY glutChangeToSubMenu( int item, const char* label,
|
|||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutChangeToSubMenu" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutChangeToSubMenu" );
|
||||||
|
|
||||||
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
||||||
if (fgGetActiveMenu())
|
if (fgState.ActiveMenus)
|
||||||
fgError("Menu manipulation not allowed while menus in use.");
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
/* Get handle to sub menu */
|
/* Get handle to sub menu */
|
||||||
@ -982,7 +982,7 @@ void FGAPIENTRY glutRemoveMenuItem( int item )
|
|||||||
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutRemoveMenuItem" );
|
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutRemoveMenuItem" );
|
||||||
|
|
||||||
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
||||||
if (fgGetActiveMenu())
|
if (fgState.ActiveMenus)
|
||||||
fgError("Menu manipulation not allowed while menus in use.");
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
/* Get n-th menu entry in the current menu, starting from one: */
|
/* Get n-th menu entry in the current menu, starting from one: */
|
||||||
@ -1008,7 +1008,7 @@ void FGAPIENTRY glutAttachMenu( int button )
|
|||||||
freeglut_return_if_fail( fgStructure.CurrentWindow );
|
freeglut_return_if_fail( fgStructure.CurrentWindow );
|
||||||
|
|
||||||
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
||||||
if (fgGetActiveMenu())
|
if (fgState.ActiveMenus)
|
||||||
fgError("Menu manipulation not allowed while menus in use.");
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
freeglut_return_if_fail( button >= 0 );
|
freeglut_return_if_fail( button >= 0 );
|
||||||
@ -1027,7 +1027,7 @@ void FGAPIENTRY glutDetachMenu( int button )
|
|||||||
freeglut_return_if_fail( fgStructure.CurrentWindow );
|
freeglut_return_if_fail( fgStructure.CurrentWindow );
|
||||||
|
|
||||||
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
freeglut_return_if_fail( fgStructure.CurrentMenu );
|
||||||
if (fgGetActiveMenu())
|
if (fgState.ActiveMenus)
|
||||||
fgError("Menu manipulation not allowed while menus in use.");
|
fgError("Menu manipulation not allowed while menus in use.");
|
||||||
|
|
||||||
freeglut_return_if_fail( button >= 0 );
|
freeglut_return_if_fail( button >= 0 );
|
||||||
|
@ -39,7 +39,7 @@ extern void fgNewWGLCreateContext( SFG_Window* window );
|
|||||||
extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
|
extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
|
||||||
unsigned char layer_type );
|
unsigned char layer_type );
|
||||||
|
|
||||||
extern void fgPlatformCheckMenuDeactivate();
|
extern void fgPlatformCheckMenuDeactivate(HWND newFocusWnd);
|
||||||
|
|
||||||
#ifdef WM_TOUCH
|
#ifdef WM_TOUCH
|
||||||
typedef BOOL (WINAPI *pGetTouchInputInfo)(HTOUCHINPUT,UINT,PTOUCHINPUT,int);
|
typedef BOOL (WINAPI *pGetTouchInputInfo)(HTOUCHINPUT,UINT,PTOUCHINPUT,int);
|
||||||
@ -969,14 +969,14 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
|
|||||||
lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
|
lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
|
||||||
|
|
||||||
/* Check if there are any open menus that need to be closed */
|
/* Check if there are any open menus that need to be closed */
|
||||||
fgPlatformCheckMenuDeactivate();
|
fgPlatformCheckMenuDeactivate((HWND)wParam);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MOUSEACTIVATE:
|
case WM_MOUSEACTIVATE:
|
||||||
/* Clicks should not activate the menu.
|
/* Clicks should not activate the menu.
|
||||||
* Especially important when clicking on a menu's submenu item which has no effect.
|
* Especially important when clicking on a menu's submenu item which has no effect.
|
||||||
*/
|
*/
|
||||||
printf("WM_MOUSEACTIVATE\n");
|
/*printf("WM_MOUSEACTIVATE\n");*/
|
||||||
if (window->IsMenu)
|
if (window->IsMenu)
|
||||||
lRet = MA_NOACTIVATEANDEAT;
|
lRet = MA_NOACTIVATEANDEAT;
|
||||||
else
|
else
|
||||||
@ -988,7 +988,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
|
|||||||
case WM_NCRBUTTONDOWN:
|
case WM_NCRBUTTONDOWN:
|
||||||
{
|
{
|
||||||
SFG_Menu *menu;
|
SFG_Menu *menu;
|
||||||
if (fgStructure.Menus.First && (menu = fgGetActiveMenu()))
|
if (fgState.ActiveMenus && (menu = fgGetActiveMenu()))
|
||||||
/* user clicked non-client area of window while a menu is open. Close menu */
|
/* user clicked non-client area of window while a menu is open. Close menu */
|
||||||
fgDeactivateMenu(menu->ParentWindow);
|
fgDeactivateMenu(menu->ParentWindow);
|
||||||
|
|
||||||
@ -1767,8 +1767,8 @@ void fgPlatformProcessWork(SFG_Window *window)
|
|||||||
win = win->Parent;
|
win = win->Parent;
|
||||||
break;
|
break;
|
||||||
case DesireNormalState:
|
case DesireNormalState:
|
||||||
if (win->IsMenu)
|
if (win->IsMenu && (!fgStructure.GameModeWindow || win->ActiveMenu->ParentWindow != fgStructure.GameModeWindow))
|
||||||
cmdShow = SW_SHOWNA; /* Just show, don't activate if its a menu */
|
cmdShow = SW_SHOWNA; /* Just show, don't activate window if its a menu. Only exception is when the parent is a gamemode window as the menu would pop under it when we do this... */
|
||||||
else
|
else
|
||||||
cmdShow = SW_SHOW;
|
cmdShow = SW_SHOW;
|
||||||
break;
|
break;
|
||||||
|
@ -37,18 +37,25 @@ GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )
|
|||||||
*y = glutGet ( GLUT_SCREEN_HEIGHT );
|
*y = glutGet ( GLUT_SCREEN_HEIGHT );
|
||||||
}
|
}
|
||||||
|
|
||||||
void fgPlatformCheckMenuDeactivate()
|
void fgPlatformCheckMenuDeactivate(HWND newFocusWnd)
|
||||||
{
|
{
|
||||||
/* User/system switched application focus.
|
/* User/system switched application focus.
|
||||||
* If we have an open menu, close it.
|
* If we have an open menu, close it.
|
||||||
*/
|
*/
|
||||||
SFG_Menu* menu = NULL;
|
SFG_Menu* menu = NULL;
|
||||||
|
|
||||||
if ( fgStructure.Menus.First )
|
if ( fgState.ActiveMenus )
|
||||||
menu = fgGetActiveMenu();
|
menu = fgGetActiveMenu();
|
||||||
|
|
||||||
if ( menu )
|
if ( menu )
|
||||||
fgDeactivateMenu(menu->ParentWindow);
|
{
|
||||||
|
if (newFocusWnd != menu->Window->Window.Handle)
|
||||||
|
/* When in GameMode, the menu's parent window will lose focus when the menu is opened.
|
||||||
|
* This is sadly necessary as we need to do an activating ShowWindow() for the menu
|
||||||
|
* to pop up over the gamemode window
|
||||||
|
*/
|
||||||
|
fgDeactivateMenu(menu->ParentWindow);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user