* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <errno.h>
#include <sys/stat.h>
#elif TARGET_HOST_WIN32
+#elif TARGET_HOST_WINCE
+
+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
#ifndef MAX
width, height );
XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
-#elif TARGET_HOST_WIN32
+#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
+#if !TARGET_HOST_WINCE
{
RECT rect;
SWP_NOZORDER
);
}
+#endif /* TARGET_HOST_WINCE */
/*
* XXX Should update {window->State.OldWidth, window->State.OldHeight}
INVOKE_WCB( *window, Display, ( ) );
fgSetWindow( current_window );
}
-#elif TARGET_HOST_WIN32
+#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
RedrawWindow(
window->Window.Handle, NULL, NULL,
RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW
if( window->State.JoystickLastPoll + window->State.JoystickPollRate <=
checkTime )
{
+#if !TARGET_HOST_WINCE
fgJoystickPollWindow( window );
+#endif /* !TARGET_HOST_WINCE */
window->State.JoystickLastPoll = checkTime;
}
return elapsed;
#elif TARGET_HOST_WIN32
return timeGetTime() - fgState.Time.Value;
+#elif TARGET_HOST_WINCE
+ return GetTickCount() - fgState.Time.Value;
#endif
}
else
gettimeofday( &fgState.Time.Value, NULL );
#elif TARGET_HOST_WIN32
fgState.Time.Value = timeGetTime ();
+#elif TARGET_HOST_WINCE
+ fgState.Time.Value = GetTickCount();
#endif
fgState.Time.Set = GL_TRUE ;
* it is possible to have our socket drained but still have
* unprocessed events. (Or, this may just be normal with
* X, anyway?) We do non-trivial processing of X events
- * after tham in event-reading loop, in any case, so we
+ * after the event-reading loop, in any case, so we
* need to allow that we may have an empty socket but non-
* empty event queue.
*/
if( -1 == err )
fgWarning ( "freeglut select() error: %d\n", errno );
}
-#elif TARGET_HOST_WIN32
+#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
MsgWaitForMultipleObjects( 0, NULL, FALSE, msec, QS_ALLEVENTS );
#endif
}
SFG_Window* window;
XEvent event;
- /*
- * This code was repeated constantly, so here it goes into a definition:
- */
+ /* This code was repeated constantly, so here it goes into a definition: */
#define GETWINDOW(a) \
window = fgWindowByHandle( event.a.window ); \
if( window == NULL ) \
switch( event.type )
{
case ClientMessage:
- /*
- * Destroy the window when the WM_DELETE_WINDOW message arrives
- */
+ /* Destroy the window when the WM_DELETE_WINDOW message arrives */
if( (Atom) event.xclient.data.l[ 0 ] == fgDisplay.DeleteWindow )
{
GETWINDOW( xclient );
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;
break;
}
- /*
- * No active menu, let's check whether we need to activate one.
- */
+ /* No active menu, let's check whether we need to activate one. */
if( ( 0 <= button ) &&
( FREEGLUT_MAX_MENUS > button ) &&
( window->Menu[ button ] ) &&
pressed )
{
- /*
- * XXX Posting a requisite Redisplay seems bogus.
- */
+ /* XXX Posting a requisite Redisplay seems bogus. */
window->State.Redisplay = GL_TRUE;
fgSetWindow( window );
fgActivateMenu( window, button );
);
}
- /*
- * Trash the modifiers state
- */
+ /* Trash the modifiers state */
fgState.Modifiers = 0xffffffff;
}
break;
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
}
}
-#elif TARGET_HOST_WIN32
+#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
MSG stMsg;
fgDeinitialize( );
exit( 0 );
}
- fgState.ExecState = GLUT_EXEC_STATE_STOP;
+ else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS )
+ fgState.ExecState = GLUT_EXEC_STATE_STOP;
+
return;
}
{
int action;
-#if TARGET_HOST_WIN32
+#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE
SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ;
#endif
freeglut_assert_ready;
-#if TARGET_HOST_WIN32
+#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE
/*
* Processing before the main loop: If there is a window which is open and
* which has a visibility callback, call it. I know this is an ugly hack,
}
-#if TARGET_HOST_WIN32
+#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE
/*
* Determine a GLUT modifer mask based on MS-WINDOWS system info.
*/
switch( uMsg )
{
case WM_CREATE:
- /*
- * The window structure is passed as the creation structure paramter...
- */
+ /* The window structure is passed as the creation structure paramter... */
window = (SFG_Window *) (((LPCREATESTRUCT) lParam)->lpCreateParams);
assert( window != NULL );
{
unsigned int current_DisplayMode = fgState.DisplayMode;
fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH;
+#if !TARGET_HOST_WINCE
fgSetupPixelFormat( window, GL_FALSE, PFD_MAIN_PLANE );
+#endif
fgState.DisplayMode = current_DisplayMode;
if( fgStructure.MenuContext )
}
else
{
+#if !TARGET_HOST_WINCE
fgSetupPixelFormat( window, GL_FALSE, PFD_MAIN_PLANE );
+#endif
if( ! fgState.UseCurrentContext )
window->Window.Context =
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:
if( window->State.Visible )
{
window->State.NeedToResize = GL_TRUE;
+#if TARGET_HOST_WINCE
+ window->State.Width = HIWORD(lParam);
+ window->State.Height = LOWORD(lParam);
+#else
window->State.Width = LOWORD(lParam);
window->State.Height = HIWORD(lParam);
+#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;
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 );
}
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 )
{
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 )
{
break;
}
+#if !TARGET_HOST_WINCE
if( GetSystemMetrics( SM_SWAPBUTTON ) )
{
if( button == GLUT_LEFT_BUTTON )
if( button == GLUT_RIGHT_BUTTON )
button = GLUT_LEFT_BUTTON;
}
+#endif /* !TARGET_HOST_WINCE */
if( button == -1 )
return DefWindowProc( hWnd, uMsg, lParam, wParam );
int keypress = -1;
POINT mouse_pos ;
- if( fgState.IgnoreKeyRepeat && (HIWORD(lParam) & KF_REPEAT) )
+ if( ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) )
break;
/*
);
}
+#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,
default:
{
+#if !TARGET_HOST_WINCE
BYTE state[ 256 ];
WORD code[ 2 ];
( (char)wParam,
window->State.MouseX, window->State.MouseY )
);
+#endif /* !TARGET_HOST_WINCE */
}
}
case WM_SYSCHAR:
case WM_CHAR:
{
- if( fgState.IgnoreKeyRepeat && (HIWORD(lParam) & KF_REPEAT) )
+ if( (fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE) && (HIWORD(lParam) & KF_REPEAT) )
break;
fgState.Modifiers = fgGetWin32Modifiers( );
lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
break;
+#if !TARGET_HOST_WINCE
case WM_SYNCPAINT: /* 0x0088 */
/* Another window has moved, need to update this one */
window->State.Redisplay = GL_TRUE;
{
/*
* 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 ;
case SC_HOTKEY :
break ;
+
+ default:
+#if _DEBUG
+ fgWarning( "Unknown wParam type 0x%x\n", wParam );
+#endif
+ break;
}
}
+#endif /* !TARGET_HOST_WINCE */
/* We need to pass the message on to the operating system as well */
lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );