X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_main.c;h=9bc7a91e9f77ec58ce90a5683a5f41f4906c76d6;hb=9c3c848ff232b56793bef2d91d29283ff80326b4;hp=16248b52d2f97ff2cfe3fd3eddad75094f3045f0;hpb=54d0f9abc570de03951750aad7288b06bf8c55b7;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index 16248b5..9bc7a91 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 @@ -187,7 +187,7 @@ static void fghRedrawWindowByHandle ( SFG_WindowHandleType handle ) ); window->State.NeedToResize = GL_FALSE; - fgSetWindow ( current_window ); + fgSetWindow( current_window ); } INVOKE_WCB( *window, Display, ( ) ); @@ -202,17 +202,17 @@ static void fghcbDisplayWindow( SFG_Window *window, if( window->State.NeedToResize ) { SFG_Window *current_window = fgStructure.Window; - + fgSetWindow( window ); - + fghReshapeWindowByHandle( window->Window.Handle, window->State.Width, window->State.Height ); - + window->State.NeedToResize = GL_FALSE; - fgSetWindow( current_window ); + fgSetWindow ( current_window ); } if( window->State.Redisplay && @@ -379,20 +379,12 @@ void fgWarning( const char *fmt, ... ) * Indicates whether Joystick events are being used by ANY window. * * The current mechanism is to walk all of the windows and ask if - * there is a joystick callback. Certainly in some cases, maybe - * in all cases, the joystick is attached to the system and accessed - * from ONE point by GLUT/freeglut, so this is not the right way, - * in general, to do this. However, the Joystick code is segregated - * in its own little world, so we can't access the information that - * we need in order to do that nicely. - * - * Some alternatives: - * * Store Joystick data into freeglut global state. - * * Provide NON-static functions or data from Joystick *.c file. + * there is a joystick callback. We have a short-circuit early + * return if we find any joystick handler registered. * - * Basically, the RIGHT way to do this requires knowing something - * about the Joystick. Right now, the Joystick code is behind - * an opaque wall. + * The real way to do this is to make use of the glutTimer() API + * to more cleanly re-implement the joystick API. Then, this code + * and all other "joystick timer" code can be yanked. * */ static void fgCheckJoystickCallback( SFG_Window* w, SFG_Enumerator* e) @@ -454,12 +446,22 @@ static void fgSleepForEvents( void ) if( fgState.IdleCallback || fgHavePendingRedisplays( ) ) return; - + msec = fgNextTimer( ); if( fgHaveJoystick( ) ) /* XXX Use GLUT timers for joysticks... */ msec = MIN( msec, 10 ); /* XXX Dumb; forces granularity to .01sec */ #if TARGET_HOST_UNIX_X11 + /* + * Possibly due to aggressive use of XFlush() and friends, + * 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 + * need to allow that we may have an empty socket but non- + * empty event queue. + */ + if( ! XPending( fgDisplay.Display ) ) { fd_set fdset; int err; @@ -596,6 +598,7 @@ void FGAPIENTRY glutMainLoopEvent( void ) case DestroyNotify: /* * This is sent to confirm the XDestroyWindow call. + * * XXX WHY is this commented out? Should we re-enable it? */ /* fgAddToWindowDestroyList ( window ); */ @@ -610,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: @@ -1051,6 +1055,8 @@ void FGAPIENTRY glutMainLoopEvent( void ) */ void FGAPIENTRY glutMainLoop( void ) { + int action; + #if TARGET_HOST_WIN32 SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ; #endif @@ -1111,9 +1117,12 @@ void FGAPIENTRY glutMainLoop( void ) /* * When this loop terminates, destroy the display, state and structure * of a freeglut session, so that another glutInit() call can happen + * + * Save the "ActionOnWindowClose" because "fgDeinitialize" resets it. */ + action = fgState.ActionOnWindowClose; fgDeinitialize( ); - if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT ) + if( action == GLUT_ACTION_EXIT ) exit( 0 ); } @@ -1214,11 +1223,17 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, case WM_SIZE: /* - * We got resized... But check if the window has been already added... + * If the window is visible, then it is the user manually resizing it. + * If it is not, then it is the system sending us a dummy resize with + * zero dimensions on a "glutIconifyWindow" call. */ - window->State.NeedToResize = GL_TRUE; - window->State.Width = LOWORD(lParam); - window->State.Height = HIWORD(lParam); + if( window->State.Visible ) + { + window->State.NeedToResize = GL_TRUE; + window->State.Width = LOWORD(lParam); + window->State.Height = HIWORD(lParam); + } + break; #if 0 case WM_SETFOCUS: @@ -1380,13 +1395,13 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, break; } - if ( GetSystemMetrics( SM_SWAPBUTTON ) ) + if( GetSystemMetrics( SM_SWAPBUTTON ) ) { - if ( button == GLUT_LEFT_BUTTON ) + if( button == GLUT_LEFT_BUTTON ) button = GLUT_RIGHT_BUTTON; else - if ( button == GLUT_RIGHT_BUTTON ) - button = GLUT_LEFT_BUTTON; + if( button == GLUT_RIGHT_BUTTON ) + button = GLUT_LEFT_BUTTON; } if( button == -1 ) @@ -1550,7 +1565,7 @@ 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; /* @@ -1699,7 +1714,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( );