John Fay: A bug fix re: behavior of the code when the user clicks the "x" to close...
[freeglut] / src / freeglut_main.c
index 25c8e38..9879ff7 100644 (file)
 #include <sys/stat.h>
 #elif TARGET_HOST_WIN32
 #elif TARGET_HOST_WINCE
-  // including gx.h does only work in c++ (thanks MS...),
-  // so we define this on our own...
-struct GXKeyList {
-    short vkUp;             // key for up
-    POINT ptUp;             // x,y position of key/button.  Not on screen but in screen coordinates.
-    short vkDown;
-    POINT ptDown;
-    short vkLeft;
-    POINT ptLeft;
-    short vkRight;
-    POINT ptRight;
-    short vkA;
-    POINT ptA;
-    short vkB;
-    POINT ptB;
-    short vkC;
-    POINT ptC;
-    short vkStart;
-    POINT ptStart;
-};
-/*__declspec(dllimport) struct GXKeyList GXGetDefaultKeys(int iOptions);
-__declspec(dllimport) int GXOpenInput();
-#include "my_gx.h"*/
-
-extern void wince_GetDefaultKeys(void* nData, int iOptions);
-extern void wince_OpenInput();
-
-/*void wince_GetDefaultKeys(void* nData, int iOptions)
-{
-    *(struct GXKeyList*)nData = GXGetDefaultKeys(iOptions);
-}
-void wince_OpenInput()
-{
-    GXOpenInput();
-}*/
+
+typedef struct GXDisplayProperties GXDisplayProperties;
+typedef struct GXKeyList GXKeyList;
+#include <gx.h>
+
+typedef struct GXKeyList (*GXGETDEFAULTKEYS)(int);
+typedef int (*GXOPENINPUT)();
+
+GXGETDEFAULTKEYS GXGetDefaultKeys_ = NULL;
+GXOPENINPUT GXOpenInput_ = NULL;
+
+struct GXKeyList gxKeyList;
 
 #endif
 
@@ -595,8 +572,9 @@ void FGAPIENTRY glutMainLoopEvent( void )
                     fgDeinitialize( );
                     exit( 0 );
                 }
+                else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS )
+                    fgState.ExecState = GLUT_EXEC_STATE_STOP;
 
-                fgState.ExecState = GLUT_EXEC_STATE_STOP;
                 return;
             }
             break;
@@ -1109,7 +1087,9 @@ void FGAPIENTRY glutMainLoopEvent( void )
                 fgDeinitialize( );
                 exit( 0 );
             }
-            fgState.ExecState = GLUT_EXEC_STATE_STOP;
+            else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS )
+                fgState.ExecState = GLUT_EXEC_STATE_STOP;
+
             return;
         }
 
@@ -1302,8 +1282,21 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         ReleaseDC( window->Window.Handle, window->Window.Device );
 
 #if TARGET_HOST_WINCE
-        // Take over button handling
-        wince_OpenInput();
+        /* Take over button handling */
+        {
+            HINSTANCE dxDllLib=LoadLibrary(_T("gx.dll"));
+            if (dxDllLib)
+            {
+                GXGetDefaultKeys_=(GXGETDEFAULTKEYS)GetProcAddress(dxDllLib, _T("?GXGetDefaultKeys@@YA?AUGXKeyList@@H@Z"));
+                GXOpenInput_=(GXOPENINPUT)GetProcAddress(dxDllLib, _T("?GXOpenInput@@YAHXZ"));
+            }
+
+            if(GXOpenInput_)
+                (*GXOpenInput_)();
+            if(GXGetDefaultKeys_)
+                gxKeyList = (*GXGetDefaultKeys_)(GX_LANDSCAPEKEYS);
+        }
+
 #endif /* TARGET_HOST_WINCE */
         break;
 
@@ -1665,9 +1658,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
     case WM_SYSKEYDOWN:
     case WM_KEYDOWN:
     {
-#if TARGET_HOST_WINCE
-        struct GXKeyList gxKeyList;
-#endif /* TARGET_HOST_WINCE */
         int keypress = -1;
         POINT mouse_pos ;
 
@@ -1725,10 +1715,8 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         }
 
 #if TARGET_HOST_WINCE
-        if(!(lParam & 0x40000000)) // Prevent auto-repeat
+        if(!(lParam & 0x40000000)) /* Prevent auto-repeat */
         {
-            wince_GetDefaultKeys(&gxKeyList, 0x03);
-
             if(wParam==(unsigned)gxKeyList.vkRight)
                 keypress = GLUT_KEY_RIGHT;
             else if(wParam==(unsigned)gxKeyList.vkLeft)
@@ -1909,11 +1897,15 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         {
           /*
            * We have received a system command message.  Try to act on it.
-           * The commands are passed in through the "lParam" parameter:
-           * Clicking on a corner to resize the window gives a "F004" message
-           * but this is not defined in my header file.
+           * The commands are passed in through the "wParam" parameter:
+           * The least significant digit seems to be which edge of the window
+           * is being used for a resize event:
+           *     4  3  5
+           *     1     2
+           *     7  6  8
+           * Congratulations and thanks to Richard Rauch for figuring this out..
            */
-            switch ( lParam )
+            switch ( wParam & 0xfff0 )
             {
             case SC_SIZE       :
                 break ;
@@ -1967,6 +1959,12 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
 
             case SC_HOTKEY     :
                 break ;
+
+            default:
+#if _DEBUG
+                fgWarning( "Unknown wParam type 0x%x\n", wParam );
+#endif
+                break;
             }
         }
 #endif /* !TARGET_HOST_WINCE */