X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;ds=sidebyside;f=src%2Ffreeglut_main.c;h=17634610f0af3896ab688076ba53dff80fc4901e;hb=4f58e4f75c3d57437da215f4119e9991b77272e0;hp=68c530c980d974ae65355ce0bb06176b275166c2;hpb=04c3b30285b1c5dff92f3c5fa432d41985da3b43;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index 68c530c..1763461 100644 --- a/src/freeglut_main.c +++ b/src/freeglut_main.c @@ -29,7 +29,7 @@ #include "config.h" #endif -#include "../include/GL/freeglut.h" +#include #include "freeglut_internal.h" #include @@ -180,7 +180,7 @@ static void fghRedrawWindowByHandle ( SFG_WindowHandleType handle ) fgSetWindow( window ); - fghReshapeWindowByHandle( + fghReshapeWindowByHandle( window->Window.Handle, window->State.Width, window->State.Height @@ -205,7 +205,7 @@ static void fghcbDisplayWindow( SFG_Window *window, fgSetWindow( window ); - fghReshapeWindowByHandle( + fghReshapeWindowByHandle( window->Window.Handle, window->State.Width, window->State.Height @@ -229,7 +229,7 @@ static void fghcbDisplayWindow( SFG_Window *window, } #elif TARGET_HOST_WIN32 RedrawWindow( - window->Window.Handle, NULL, NULL, + window->Window.Handle, NULL, NULL, RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW ); #endif @@ -412,7 +412,7 @@ static void fgHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e) e->data = w; } fgEnumSubWindows( w, fgHavePendingRedisplaysCallback, e ); -} +} static int fgHavePendingRedisplays (void) { SFG_Enumerator enumerator; @@ -497,7 +497,7 @@ int fgGetXModifiers( XEvent *event ) ret |= GLUT_ACTIVE_CTRL; if( event->xkey.state & Mod1Mask ) ret |= GLUT_ACTIVE_ALT; - + return ret; } #endif @@ -540,7 +540,7 @@ void FGAPIENTRY glutMainLoopEvent( void ) */ if( (Atom) event.xclient.data.l[ 0 ] == fgDisplay.DeleteWindow ) { - GETWINDOW( xclient ); + GETWINDOW( xclient ); fgDestroyWindow ( window ); @@ -613,12 +613,13 @@ void FGAPIENTRY glutMainLoopEvent( void ) * XXX double-buffered does not respect viewport when we * XXX do a buffer-swap). * - * XXX GETWINDOW( xexpose ); - * XXX fgSetWindow( window ); - * XXX glutPostRedisplay( ); */ if( event.xexpose.count == 0 ) - fghRedrawWindowByHandle( event.xexpose.window ); + { + GETWINDOW( xexpose ); + fgSetWindow( window ); + glutPostRedisplay( ); + } break; case MapNotify: @@ -639,7 +640,7 @@ void FGAPIENTRY glutMainLoopEvent( void ) case VisibilityNotify: { - GETWINDOW( xvisibility ); + GETWINDOW( xvisibility ); /* * XXX INVOKE_WCB() does this check for us. */ @@ -659,13 +660,13 @@ void FGAPIENTRY glutMainLoopEvent( void ) INVOKE_WCB( *window, WindowStatus, ( GLUT_FULLY_RETAINED ) ); window->State.Visible = GL_TRUE; break; - + case VisibilityPartiallyObscured: INVOKE_WCB( *window, WindowStatus, ( GLUT_PARTIALLY_RETAINED ) ); window->State.Visible = GL_TRUE; break; - + case VisibilityFullyObscured: INVOKE_WCB( *window, WindowStatus, ( GLUT_FULLY_COVERED ) ); window->State.Visible = GL_FALSE; @@ -740,7 +741,7 @@ void FGAPIENTRY glutMainLoopEvent( void ) */ GETWINDOW( xbutton ); GETMOUSE( xbutton ); - + /* * An X button (at least in XFree86) is numbered from 1. * A GLUT button is numbered from 0. @@ -782,7 +783,7 @@ void FGAPIENTRY glutMainLoopEvent( void ) window->ActiveMenu->Window->State.MouseY = event.xbutton.y_root - window->ActiveMenu->Y; } - + /* In the menu, invoke the callback and deactivate the menu*/ if( fgCheckActiveMenu( window->ActiveMenu->Window, window->ActiveMenu ) ) @@ -882,7 +883,7 @@ void FGAPIENTRY glutMainLoopEvent( void ) int direction = -1; if( button % 2 ) direction = 1; - + if( pressed ) INVOKE_WCB( *window, MouseWheel, ( wheel_number, direction, @@ -907,6 +908,34 @@ void FGAPIENTRY glutMainLoopEvent( void ) GETWINDOW( xkey ); GETMOUSE( xkey ); + /* Detect auto repeated keys, if configured globally or per-window */ + + if ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) + { + if (event.type==KeyRelease) + { + /* + * Look at X11 keystate to detect repeat mode. + * While X11 says the key is actually held down, we'll ignore KeyRelease/KeyPress pairs. + */ + + 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; + } + } + else + window->State.KeyRepeating = GL_FALSE; + + /* Cease processing this event if it is auto repeated */ + + if (window->State.KeyRepeating) + break; + if( event.type == KeyPress ) { keyboard_cb = FETCH_WCB( *window, Keyboard ); @@ -1081,7 +1110,7 @@ void FGAPIENTRY glutMainLoop( void ) INVOKE_WCB( *window, Visibility, ( window->State.Visible ) ); fgSetWindow( current_window ); } - + window = (SFG_Window *)window->Node.Next ; } #endif @@ -1095,13 +1124,13 @@ void FGAPIENTRY glutMainLoop( void ) /* * Step through the list of windows, seeing if there are any * that are not menus - */ + */ for( window = ( SFG_Window * )fgStructure.Windows.First; window; window = ( SFG_Window * )window->Node.Next ) if ( ! ( window->IsMenu ) ) break; - + if( ! window ) fgState.ExecState = GLUT_EXEC_STATE_STOP; else @@ -1235,12 +1264,12 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, break; #if 0 - case WM_SETFOCUS: + case WM_SETFOCUS: printf("WM_SETFOCUS: %p\n", window ); lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); break; - case WM_ACTIVATE: + case WM_ACTIVATE: if (LOWORD(wParam) != WA_INACTIVE) { /* glutSetCursor( fgStructure.Window->State.Cursor ); */ @@ -1261,7 +1290,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, * XXX call glutSetCurdsor() instead of defining two macros * XXX and implementing a nested case in-line. */ - case WM_SETCURSOR: + case WM_SETCURSOR: /* Set the cursor AND change it for this window class. */ #define MAP_CURSOR(a,b) \ case a: \ @@ -1326,7 +1355,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, { window->State.MouseX = LOWORD( lParam ); window->State.MouseY = HIWORD( lParam ); - + if ( window->ActiveMenu ) { window->State.Redisplay = GL_TRUE; @@ -1564,11 +1593,11 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, int keypress = -1; POINT mouse_pos ; - if( fgState.IgnoreKeyRepeat && (lParam & KF_REPEAT) ) + if( fgState.IgnoreKeyRepeat && (HIWORD(lParam) & KF_REPEAT) ) break; /* - * Remember the current modifiers state. This is done here in order + * Remember the current modifiers state. This is done here in order * to make sure the VK_DELETE keyboard callback is executed properly. */ fgState.Modifiers = fgGetWin32Modifiers( ); @@ -1634,7 +1663,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, POINT mouse_pos; /* - * Remember the current modifiers state. This is done here in order + * Remember the current modifiers state. This is done here in order * to make sure the VK_DELETE keyboard callback is executed properly. */ fgState.Modifiers = fgGetWin32Modifiers( ); @@ -1687,9 +1716,9 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, { BYTE state[ 256 ]; WORD code[ 2 ]; - + GetKeyboardState( state ); - + if( ToAscii( wParam, 0, state, code, 0 ) == 1 ) wParam=code[ 0 ]; @@ -1713,7 +1742,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, case WM_SYSCHAR: case WM_CHAR: { - if( fgState.IgnoreKeyRepeat && (lParam & KF_REPEAT) ) + if( fgState.IgnoreKeyRepeat && (HIWORD(lParam) & KF_REPEAT) ) break; fgState.Modifiers = fgGetWin32Modifiers( );