X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;ds=sidebyside;f=src%2Ffreeglut_main.c;h=da13c946858911e48deed33c22cceead4639b68c;hb=e0400bd2a74c2e8538399b25d95538dae5bf5454;hp=da5bcfed961e2d36783a76c76d4069d1c053800a;hpb=cef996c3fac108d491a7b05c616ccc04c6851cd0;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index da5bcfe..da13c94 100644 --- a/src/freeglut_main.c +++ b/src/freeglut_main.c @@ -29,12 +29,16 @@ #include "freeglut_internal.h" #include #include -#if HAVE_VPRINTF +#if TARGET_HOST_WIN32 # define VFPRINTF(s,f,a) vfprintf((s),(f),(a)) -#elif HAVE_DOPRNT -# define VFPRINTF(s,f,a) _doprnt((f),(a),(s)) #else -# define VFPRINTF(s,f,a) +# if HAVE_VPRINTF +# define VFPRINTF(s,f,a) vfprintf((s),(f),(a)) +# elif HAVE_DOPRNT +# define VFPRINTF(s,f,a) _doprnt((f),(a),(s)) +# else +# define VFPRINTF(s,f,a) +# endif #endif #if TARGET_HOST_WINCE @@ -588,6 +592,8 @@ void FGAPIENTRY glutMainLoopEvent( void ) if( ( width != window->State.OldWidth ) || ( height != window->State.OldHeight ) ) { + SFG_Window *current_window = fgStructure.CurrentWindow; + window->State.OldWidth = width; window->State.OldHeight = height; if( FETCH_WCB( *window, Reshape ) ) @@ -598,6 +604,8 @@ void FGAPIENTRY glutMainLoopEvent( void ) glViewport( 0, 0, width, height ); } glutPostRedisplay( ); + if( window->IsMenu ) + fgSetWindow( current_window ); } } break; @@ -624,8 +632,7 @@ void FGAPIENTRY glutMainLoopEvent( void ) if( event.xexpose.count == 0 ) { GETWINDOW( xexpose ); - fgSetWindow( window ); - glutPostRedisplay( ); + window->State.Redisplay = GL_TRUE; } break; @@ -691,6 +698,10 @@ void FGAPIENTRY glutMainLoopEvent( void ) case LeaveNotify: GETWINDOW( xcrossing ); GETMOUSE( xcrossing ); + if( ( event.type == LeaveNotify ) && window->IsMenu && + window->ActiveMenu && window->ActiveMenu->IsActive ) + fgUpdateMenuHighlight( window->ActiveMenu ); + INVOKE_WCB( *window, Entry, ( ( EnterNotify == event.type ) ? GLUT_ENTERED : GLUT_LEFT ) ); @@ -710,8 +721,8 @@ void FGAPIENTRY glutMainLoopEvent( void ) window->ActiveMenu->Window->State.MouseY = event.xmotion.y_root - window->ActiveMenu->Y; } - window->ActiveMenu->Window->State.Redisplay = GL_TRUE ; - fgSetWindow( window->ActiveMenu->ParentWindow ); + + fgUpdateMenuHighlight( window->ActiveMenu ); break; } @@ -858,13 +869,13 @@ void FGAPIENTRY glutMainLoopEvent( void ) if( event.type == KeyPress ) { - keyboard_cb = FETCH_WCB( *window, Keyboard ); - special_cb = FETCH_WCB( *window, Special ); + keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, Keyboard )); + special_cb = (FGCBSpecial) ( FETCH_WCB( *window, Special )); } else { - keyboard_cb = FETCH_WCB( *window, KeyboardUp ); - special_cb = FETCH_WCB( *window, SpecialUp ); + keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, KeyboardUp )); + special_cb = (FGCBSpecial) ( FETCH_WCB( *window, SpecialUp )); } /* Is there a keyboard/special callback hooked for this window? */ @@ -1052,7 +1063,13 @@ void FGAPIENTRY glutMainLoop( void ) else { if( fgState.IdleCallback ) + { + if( fgStructure.CurrentWindow && + fgStructure.CurrentWindow->IsMenu ) + /* fail safe */ + fgSetWindow( window ); fgState.IdleCallback( ); + } fghSleepForEvents( ); } @@ -1268,6 +1285,10 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, * XXX if the flag is false we invoke the Entry callback and set the flag to true. */ case 0x02a2: /* This is the message we get when the mouse is leaving the window */ + if( window->IsMenu && + window->ActiveMenu && window->ActiveMenu->IsActive ) + fgUpdateMenuHighlight( window->ActiveMenu ); + INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) ); break ; @@ -1287,8 +1308,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, if ( window->ActiveMenu ) { - window->State.Redisplay = GL_TRUE; - fgSetWindow ( window->ActiveMenu->ParentWindow ); + fgUpdateMenuHighlight( window->ActiveMenu ); break; }