X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_main.c;h=e45ee4deab0ca241fe75fae18720d4fde5d74396;hb=48c513d508f6836e1fcbaa68ac2e0f2f9a486852;hp=b1d7165442c86700a62f367c89cc98974ae427d0;hpb=bc0d27e8c973c916fc87fa752e60a9de7d54b55b;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index b1d7165..e45ee4d 100644 --- a/src/freeglut_main.c +++ b/src/freeglut_main.c @@ -42,28 +42,19 @@ #include #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; -}; -extern void wince_GetDefaultKeys(void* nData, int iOptions); -extern void wince_OpenInput(); + +typedef struct GXDisplayProperties GXDisplayProperties; +typedef struct GXKeyList GXKeyList; +#include + +typedef struct GXKeyList (*GXGETDEFAULTKEYS)(int); +typedef int (*GXOPENINPUT)(); + +GXGETDEFAULTKEYS GXGetDefaultKeys_ = NULL; +GXOPENINPUT GXOpenInput_ = NULL; + +struct GXKeyList gxKeyList; + #endif #ifndef MAX @@ -157,7 +148,7 @@ static void fghReshapeWindowByHandle ( SFG_WindowHandleType handle, SWP_NOZORDER ); } -#endif //TARGET_HOST_WINCE +#endif /* TARGET_HOST_WINCE */ /* * XXX Should update {window->State.OldWidth, window->State.OldHeight} @@ -290,7 +281,7 @@ static void fghcbCheckJoystickPolls( SFG_Window *window, { #if !TARGET_HOST_WINCE fgJoystickPollWindow( window ); -#endif //!TARGET_HOST_WINCE +#endif /* !TARGET_HOST_WINCE */ window->State.JoystickLastPoll = checkTime; } @@ -581,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; @@ -954,10 +946,13 @@ void FGAPIENTRY glutMainLoopEvent( void ) char keys[32]; XQueryKeymap( fgDisplay.Display, keys ); /* Look at X11 keystate to detect repeat mode */ - if ( keys[event.xkey.keycode>>3] & (1<<(event.xkey.keycode%8)) ) - window->State.KeyRepeating = GL_TRUE; - else - window->State.KeyRepeating = GL_FALSE; + if ( event.xkey.keycode<256 ) /* XQueryKeymap is limited to 256 keycodes */ + { + if ( keys[event.xkey.keycode>>3] & (1<<(event.xkey.keycode%8)) ) + window->State.KeyRepeating = GL_TRUE; + else + window->State.KeyRepeating = GL_FALSE; + } } } else @@ -1092,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; } @@ -1285,9 +1282,22 @@ 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(); -#endif //TARGET_HOST_WINCE + /* 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; case WM_SIZE: @@ -1305,13 +1315,13 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, #else window->State.Width = LOWORD(lParam); window->State.Height = HIWORD(lParam); -#endif //TARGET_HOST_WINCE +#endif /* TARGET_HOST_WINCE */ } break; #if 0 case WM_SETFOCUS: - printf("WM_SETFOCUS: %p\n", window ); + /* printf("WM_SETFOCUS: %p\n", window ); */ lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); break; @@ -1319,8 +1329,8 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if (LOWORD(wParam) != WA_INACTIVE) { /* glutSetCursor( fgStructure.Window->State.Cursor ); */ - printf("WM_ACTIVATE: glutSetCursor( %p, %d)\n", window, - window->State.Cursor ); + /* printf("WM_ACTIVATE: glutSetCursor( %p, %d)\n", window, + window->State.Cursor ); */ glutSetCursor( window->State.Cursor ); } @@ -1405,7 +1415,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, #else window->State.MouseX = LOWORD( lParam ); window->State.MouseY = HIWORD( lParam ); -#endif //TARGET_HOST_WINCE +#endif /* TARGET_HOST_WINCE */ if ( window->ActiveMenu ) { @@ -1445,7 +1455,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, #else window->State.MouseX = LOWORD( lParam ); window->State.MouseY = HIWORD( lParam ); -#endif //TARGET_HOST_WINCE +#endif /* TARGET_HOST_WINCE */ switch( uMsg ) { @@ -1488,7 +1498,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if( button == GLUT_RIGHT_BUTTON ) button = GLUT_LEFT_BUTTON; } -#endif //!TARGET_HOST_WINCE +#endif /* !TARGET_HOST_WINCE */ if( button == -1 ) return DefWindowProc( hWnd, uMsg, lParam, wParam ); @@ -1648,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 ; @@ -1708,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) @@ -1812,7 +1817,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, ( (char)wParam, window->State.MouseX, window->State.MouseY ) ); -#endif //!TARGET_HOST_WINCE +#endif /* !TARGET_HOST_WINCE */ } } @@ -1892,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 ; @@ -1950,9 +1959,15 @@ 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 +#endif /* !TARGET_HOST_WINCE */ /* We need to pass the message on to the operating system as well */ lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );