#include <GL/freeglut.h>
#include "fg_internal.h"
+
/* -- DEFINITIONS ---------------------------------------------------------- */
/*
/*
* Private static function to set the parent window of a submenu and all
- * of its submenus
+ * of its submenus.
*/
static void fghSetMenuParentWindow( SFG_Window *window, SFG_Menu *menu )
{
* is dealt with in the WM_KILLFOCUS handler of fgPlatformWindowProc
*/
{
- if (window->ActiveMenu->ParentWindow)
- fgDeactivateMenu( window->ActiveMenu->ParentWindow );
- else
- {
- /*
- * Its a rare occasion that a window has an ActiveMenu but
- * that menus does not have a parent window. It happens
- * however in the corner case bug when one opens a menu in
- * a main window, then opens a different menu in this main
- * window's child (you now have two menus open
- * simultaneously, thats the bug) and then click somewhere
- * else that causes both menus to close. One of them is
- * then not properly cleaned up. This finishes the cleaning
- * and minimizes the impact on the user, he only needs one
- * extra mouse click.
- */
- fghSetMenuParentWindow ( NULL, window->ActiveMenu );
- window->ActiveMenu->IsActive = GL_FALSE;
- window->ActiveMenu->ActiveEntry = NULL;
- window->ActiveMenu = NULL;
- }
+ fgDeactivateMenu( window->ActiveMenu->ParentWindow );
}
/*
SFG_Menu* menu;
SFG_MenuEntry *menuEntry;
- /* Check if there is an active menu attached to this window... */
+ /* Did we find an active window? */
freeglut_return_if_fail( window );
+ /* Check if there is an active menu attached to this window... */
menu = window->ActiveMenu;
- /* Did we find an active window? */
freeglut_return_if_fail( menu );
parent_window = menu->ParentWindow;
{
menuEntry->IsActive = GL_FALSE;
- /* Is that an active submenu by any case? */
+ /* Is that an active submenu by any chance? */
if( menuEntry->SubMenu )
fghDeactivateSubMenu( menuEntry );
}
SFG_Window* window;
PAINTSTRUCT ps;
LRESULT lRet = 1;
+ GLboolean gotChild = GL_FALSE;
FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ;
ScreenToClient( window->Window.Handle, &mouse_pos );
hwnd = ChildWindowFromPoint(window->Window.Handle, mouse_pos);
if (hwnd) /* can be NULL if mouse outside parent by the time we get here */
+ {
window = fgWindowByHandle(hwnd);
+ if (window->Parent)
+ gotChild = GL_TRUE;
+ }
}
if ( window )
case WM_SETFOCUS:
/* printf("WM_SETFOCUS: %p\n", window ); */
+ if (gotChild)
+ /* If child should have focus instead, set it here. */
+ SetFocus(window->Window.Handle);
+
lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) );
- UpdateWindow ( hWnd );
+ UpdateWindow ( hWnd );
+ if (gotChild)
+ UpdateWindow ( window->Window.Handle );
break;
case WM_KILLFOCUS:
INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );
/* 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.
+ * 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.
*/
if ( fgStructure.Menus.First )
menu = fgGetActiveMenu();
-
+
if ( menu )
{
SFG_Window* wnd = NULL;