When receiving WM_SETFOCUS, check if its child window that should
[freeglut] / src / mswin / fg_main_mswin.c
index 3e1a86f..28e1b64 100644 (file)
@@ -228,6 +228,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
     SFG_Window* window;
     PAINTSTRUCT ps;
     LRESULT lRet = 1;
+    GLboolean gotChild = GL_FALSE;
 
     FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ;
 
@@ -252,7 +253,11 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         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 )
@@ -486,59 +491,47 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
 
     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:
         {
             SFG_Menu* menu = NULL;
-            printf("WM_KILLFOCUS: %p\n", window ); 
+/*            printf("WM_KILLFOCUS: %p\n", window ); */
             lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
             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;
                 HWND hwnd = GetFocus();  /* Get window with current focus - NULL for non freeglut windows */
-                printf("  hwnd: %p\n",hwnd);
                 if (hwnd)
                     /* See which of our windows it is */
                     wnd = fgWindowByHandle(hwnd);
 
-                //printf("  got menu: %p\n",menu);
-
-                printf("  wnd: %p, wnd->AM->PW: %p, menu->PW: %p\n",wnd,wnd&&wnd->ActiveMenu?wnd->ActiveMenu->ParentWindow:0,menu->ParentWindow);
-                if (wnd)
-                    printf("  wnd menu: %i, wnd->ActiveMenu: %p, wnd->Parent: %p\n",wnd->IsMenu,wnd->ActiveMenu,wnd->Parent);
-
                 if (!hwnd || !wnd)
-                {
                     /* User switched to another application*/
                     fgDeactivateMenu(menu->ParentWindow);
-                    printf("  -> kill1\n");
-                }
-                else if (!wnd->IsMenu && wnd!=menu->ParentWindow)
-                {
+                else if (!wnd->IsMenu && wnd!=menu->ParentWindow)   /* Make sure we don't kill the menu when trying to enter a submenu */
                     /* User switched to another FreeGLUT window */
                     fgDeactivateMenu(menu->ParentWindow);
-                    printf("  -> kill2\n");
-
-                }
-                else
-                {
-                    printf("  -> survive\n");
-                }
             }
         }
         break;