on windows too: call resize callback only in response to WM message
[freeglut] / src / mswin / fg_main_mswin.c
index ea56131..3cedeb3 100644 (file)
@@ -339,7 +339,7 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke
         return 1;
 }
 
-static SFG_Window* fghWindowUnderCursor(SFG_Window *window)
+SFG_Window* fghWindowUnderCursor(SFG_Window *window)
 {
     /* Check if the current window that the mouse is over is a child window
      * of the window the message was sent to. Some events only sent to main window,
@@ -349,7 +349,7 @@ static SFG_Window* fghWindowUnderCursor(SFG_Window *window)
      */
     if (window && window->Children.First)   /* This window has childs */
     {
-        SFG_WindowHandleType hwnd;
+        HWND hwnd;
         SFG_Window* child_window;
 
         /* Get mouse position at time of message */
@@ -506,8 +506,15 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
 #endif /* defined(_WIN32_WCE) */
             
             if (width!=window->State.Width || height!=window->State.Height)
-                /* Something changed, need to resize */
-                window->State.NeedToResize = GL_TRUE;
+            {
+                SFG_Window* saved_window = fgStructure.CurrentWindow;
+                
+                /* size changed, call reshape callback */
+                INVOKE_WCB( *window, Reshape, ( width, height ) );
+                glutPostRedisplay( );
+                if( window->IsMenu )
+                    fgSetWindow( saved_window );
+            }
         }
 
         /* according to docs, should return 0 */
@@ -551,8 +558,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
         break;
 
     case WM_SETFOCUS:
-/*        printf("WM_SETFOCUS: %p\n", window ); */
-
+        /*printf("WM_SETFOCUS: %p\n", window );*/
         lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
 
         SetActiveWindow( window->Window.Handle );
@@ -561,13 +567,11 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
         break;
 
     case WM_KILLFOCUS:
-        {
-/*            printf("WM_KILLFOCUS: %p\n", window ); */
-            lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        /*printf("WM_KILLFOCUS: %p\n", window ); */
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
 
-            /* Check if there are any open menus that need to be closed */
-            fgPlatformCheckMenuDeactivate();
-        }
+        /* Check if there are any open menus that need to be closed */
+        fgPlatformCheckMenuDeactivate();
         break;
 
 #if 0
@@ -601,7 +605,9 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
                  */
                 if (FETCH_WCB( *window, Entry ))
                 {
+                    SFG_Window* saved_window = fgStructure.CurrentWindow;
                     INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) );
+                    fgSetWindow(saved_window);
 
                     tme.cbSize = sizeof(TRACKMOUSEEVENT);
                     tme.dwFlags = TME_LEAVE;
@@ -681,12 +687,13 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
 
     case WM_MOUSEMOVE:
     {
+        /* Per docs, use LOWORD/HIWORD for WinCE and GET_X_LPARAM/GET_Y_LPARAM for desktop windows */
 #if defined(_WIN32_WCE)
-        window->State.MouseX = 320-HIWORD( lParam );
+        window->State.MouseX = 320-HIWORD( lParam );    /* XXX: Docs say x should be loword and y hiword? */
         window->State.MouseY = LOWORD( lParam );
 #else
-        window->State.MouseX = LOWORD( lParam );
-        window->State.MouseY = HIWORD( lParam );
+        window->State.MouseX = GET_X_LPARAM( lParam );
+        window->State.MouseY = GET_Y_LPARAM( lParam );
 #endif /* defined(_WIN32_WCE) */
         /* Restrict to [-32768, 32767] to match X11 behaviour       */
         /* See comment in "freeglut_developer" mailing list 10/4/04 */
@@ -724,12 +731,13 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
         GLboolean pressed = GL_TRUE;
         int button;
 
+        /* Per docs, use LOWORD/HIWORD for WinCE and GET_X_LPARAM/GET_Y_LPARAM for desktop windows */
 #if defined(_WIN32_WCE)
-        window->State.MouseX = 320-HIWORD( lParam );
+        window->State.MouseX = 320-HIWORD( lParam );    /* XXX: Docs say x should be loword and y hiword? */
         window->State.MouseY = LOWORD( lParam );
 #else
-        window->State.MouseX = LOWORD( lParam );
-        window->State.MouseY = HIWORD( lParam );
+        window->State.MouseX = GET_X_LPARAM( lParam );
+        window->State.MouseY = GET_Y_LPARAM( lParam );
 #endif /* defined(_WIN32_WCE) */
 
         /* Restrict to [-32768, 32767] to match X11 behaviour       */
@@ -832,10 +840,22 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
 
     case WM_MOUSEWHEEL:
     {
-        SFG_Window *child_window = NULL;
         int wheel_number = 0;   /* Only one scroll wheel on windows */
-        /* int GET_KEYSTATE_WPARAM( wParam ); */
+#if defined(_WIN32_WCE)
+        int modkeys = LOWORD(wParam); 
+        short ticks = (short)HIWORD(wParam);
+        /* commented out as should not be needed here, mouse motion is processed in WM_MOUSEMOVE first:
+        xPos = LOWORD(lParam);  -- straight from docs, not consistent with mouse nutton and mouse motion above (which i think is wrong)
+        yPos = HIWORD(lParam);
+        */
+#else
+        /* int modkeys = GET_KEYSTATE_WPARAM( wParam ); */
         short ticks = GET_WHEEL_DELTA_WPARAM( wParam );
+        /* commented out as should not be needed here, mouse motion is processed in WM_MOUSEMOVE first:
+        window->State.MouseX = GET_X_LPARAM( lParam );
+        window->State.MouseY = GET_Y_LPARAM( lParam );
+        */
+#endif /* defined(_WIN32_WCE) */
 
         window = fghWindowUnderCursor(window);