X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;ds=sidebyside;f=src%2Ffg_menu.c;h=3ad2cb1cfec19f6bfdf9d5bb709004ab5d04f055;hb=4abad463b8e04c45c4e5ce8a718ee608fa7033f9;hp=0c6c64e5842f3709f5574b96d03d9e20d7df6ae7;hpb=49e61d9b74ae8520b5b7fddbcfc727081ac54391;p=freeglut diff --git a/src/fg_menu.c b/src/fg_menu.c index 0c6c64e..3ad2cb1 100644 --- a/src/fg_menu.c +++ b/src/fg_menu.c @@ -620,11 +620,32 @@ GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed, /* * Outside the menu, deactivate if it's a downclick * - * XXX This isn't enough. A downclick outside of - * XXX the interior of our freeglut windows should also - * XXX deactivate the menu. This is more complicated. + * A downclick outside of the interior of our freeglut windows + * is dealt with in the WM_KILLFOCUS handler of fgPlatformWindowProc */ - fgDeactivateMenu( window->ActiveMenu->ParentWindow ); + { + 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; + } + } /* * XXX Why does an active menu require a redisplay at @@ -659,11 +680,12 @@ GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed, void fgDeactivateMenu( SFG_Window *window ) { SFG_Window *parent_window = NULL; - - /* Check if there is an active menu attached to this window... */ - SFG_Menu* menu = window->ActiveMenu; + SFG_Menu* menu; SFG_MenuEntry *menuEntry; + /* Check if there is an active menu attached to this window... */ + freeglut_return_if_fail( window ); + menu = window->ActiveMenu; /* Did we find an active window? */ freeglut_return_if_fail( menu );