From 8f5779d2f8e49f4de9fd79689b2c7867450578ab Mon Sep 17 00:00:00 2001 From: Diederick Niehorster Date: Sat, 6 Apr 2013 10:17:04 +0000 Subject: [PATCH] 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: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1610 7f0cb862-5218-0410-a997-914c9d46530a --- src/fg_menu.c | 12 +++++++++++- src/mswin/fg_menu_mswin.c | 40 ++++------------------------------------ 2 files changed, 15 insertions(+), 37 deletions(-) diff --git a/src/fg_menu.c b/src/fg_menu.c index 61ffe55..d3c435f 100644 --- a/src/fg_menu.c +++ b/src/fg_menu.c @@ -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 && diff --git a/src/mswin/fg_menu_mswin.c b/src/mswin/fg_menu_mswin.c index 2db1ea7..9df001e 100644 --- a/src/mswin/fg_menu_mswin.c +++ b/src/mswin/fg_menu_mswin.c @@ -29,8 +29,6 @@ #include #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); } }; -- 1.7.10.4