X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_main.c;h=72ef45dc45fd7da85e4b52440e4225e9f345319e;hb=34904da12798fd5b88442c816ac8dd7c41edcc33;hp=05adca82f4e9ef8104e9f12cd3799ce591ebe466;hpb=d67937396dc33c86017012859b2d9ed010fc6c88;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index 05adca8..72ef45d 100644 --- a/src/freeglut_main.c +++ b/src/freeglut_main.c @@ -25,6 +25,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -40,6 +41,20 @@ #include #include #elif TARGET_HOST_WIN32 +#elif TARGET_HOST_WINCE + +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 @@ -133,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} @@ -266,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; } @@ -930,10 +945,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 @@ -1259,6 +1277,24 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, window->State.Height = fgState.Size.Y; ReleaseDC( window->Window.Handle, window->Window.Device ); + +#if 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: @@ -1276,7 +1312,7 @@ 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; @@ -1370,8 +1406,13 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, case WM_MOUSEMOVE: { +#if TARGET_HOST_WINCE + window->State.MouseX = 320-HIWORD( lParam ); + window->State.MouseY = LOWORD( lParam ); +#else window->State.MouseX = LOWORD( lParam ); window->State.MouseY = HIWORD( lParam ); +#endif /* TARGET_HOST_WINCE */ if ( window->ActiveMenu ) { @@ -1405,8 +1446,13 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, GLboolean pressed = GL_TRUE; int button; +#if TARGET_HOST_WINCE + window->State.MouseX = 320-HIWORD( lParam ); + window->State.MouseY = LOWORD( lParam ); +#else window->State.MouseX = LOWORD( lParam ); window->State.MouseY = HIWORD( lParam ); +#endif /* TARGET_HOST_WINCE */ switch( uMsg ) { @@ -1449,7 +1495,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 ); @@ -1665,6 +1711,28 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, ); } +#if TARGET_HOST_WINCE + if(!(lParam & 0x40000000)) /* Prevent auto-repeat */ + { + if(wParam==(unsigned)gxKeyList.vkRight) + keypress = GLUT_KEY_RIGHT; + else if(wParam==(unsigned)gxKeyList.vkLeft) + keypress = GLUT_KEY_LEFT; + else if(wParam==(unsigned)gxKeyList.vkUp) + keypress = GLUT_KEY_UP; + else if(wParam==(unsigned)gxKeyList.vkDown) + keypress = GLUT_KEY_DOWN; + else if(wParam==(unsigned)gxKeyList.vkA) + keypress = GLUT_KEY_F1; + else if(wParam==(unsigned)gxKeyList.vkB) + keypress = GLUT_KEY_F2; + else if(wParam==(unsigned)gxKeyList.vkC) + keypress = GLUT_KEY_F3; + else if(wParam==(unsigned)gxKeyList.vkStart) + keypress = GLUT_KEY_F4; + } +#endif + if( keypress != -1 ) INVOKE_WCB( *window, Special, ( keypress, @@ -1746,7 +1814,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 */ } } @@ -1886,7 +1954,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, 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 );