From: Diederick Niehorster Date: Sun, 7 Apr 2013 08:04:46 +0000 (+0000) Subject: redisplay is now also on the work list instead of handled separately X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=commitdiff_plain;h=a00c7ee3552b527ac6b375d6a6ca42f90770ddc3;p=freeglut redisplay is now also on the work list instead of handled separately git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1614 7f0cb862-5218-0410-a997-914c9d46530a --- diff --git a/src/android/fg_main_android.c b/src/android/fg_main_android.c index 4c862f5..1fa41d6 100644 --- a/src/android/fg_main_android.c +++ b/src/android/fg_main_android.c @@ -495,6 +495,8 @@ void fgPlatformProcessWork(SFG_Window *window) /* Now clear it so that any callback generated by the actions below can set work again */ window->State.WorkMask = 0; + if (workMask&~GLUT_DISPLAY_WORK) /* Display work is the common case, skip all the below at once */ + { /* This is before the first display callback: call a few callbacks to inform user of window size, position, etc * we know this is before the first display callback of a window as for all windows GLUT_INIT_WORK is set when * they are opened, and work is done before displaying in the mainloop. @@ -562,5 +564,15 @@ void fgPlatformProcessWork(SFG_Window *window) break; } } + } + + if (workMask & GLUT_DISPLAY_WORK) + { + if( window->State.Visible ) + fghRedrawWindow ( window ); + + /* Strip out display work that might have ended up on work list now as some of the above genereates callbacks */ + window->State.WorkMask &= ~GLUT_DISPLAY_WORK; + } } diff --git a/src/fg_display.c b/src/fg_display.c index 9b8bd42..3b65d83 100644 --- a/src/fg_display.c +++ b/src/fg_display.c @@ -47,7 +47,7 @@ void FGAPIENTRY glutPostRedisplay( void ) " with no current window defined.", "glutPostRedisplay" ) ; } - fgStructure.CurrentWindow->State.Redisplay = GL_TRUE; + fgStructure.CurrentWindow->State.WorkMask |= GLUT_DISPLAY_WORK; } /* @@ -98,7 +98,7 @@ void FGAPIENTRY glutPostWindowRedisplay( int windowID ) FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPostWindowRedisplay" ); window = fgWindowByID( windowID ); freeglut_return_if_fail( window ); - window->State.Redisplay = GL_TRUE; + window->State.WorkMask |= GLUT_DISPLAY_WORK; } /*** END OF FILE ***/ diff --git a/src/fg_internal.h b/src/fg_internal.h index 6974dd3..645c82f 100644 --- a/src/fg_internal.h +++ b/src/fg_internal.h @@ -392,6 +392,7 @@ struct tagSFG_Context #define GLUT_SIZE_WORK (1<<3) #define GLUT_ZORDER_WORK (1<<4) #define GLUT_FULL_SCREEN_WORK (1<<5) +#define GLUT_DISPLAY_WORK (1<<6) /* * An enumeration containing the state of the GLUT execution: @@ -457,12 +458,8 @@ struct tagSFG_WindowState /* as per notes above, sizes always refer to the cli int DesiredZOrder; /* desired window Z Order position */ fgDesiredVisibility DesiredVisibility;/* desired visibility (hidden, iconic, shown/normal) */ - SFG_PlatformWindowState pWState; /* Window width/height (X11) or rectangle/style (Windows) from before a resize, and other stuff only needed on specific platforms */ - GLboolean Redisplay; /* Do we have to redisplay? */ - - long JoystickPollRate; /* The joystick polling rate */ fg_time_t JoystickLastPoll; /* When the last poll happened */ diff --git a/src/fg_main.c b/src/fg_main.c index 39fecd4..4dee9b9 100644 --- a/src/fg_main.c +++ b/src/fg_main.c @@ -92,7 +92,7 @@ void fghOnReshapeNotify(SFG_Window *window, int width, int height, GLboolean for * window. * DN: Hmm.. the above sounds like a concern only in single buffered mode... */ - glutPostRedisplay( ); + window->State.WorkMask |= GLUT_DISPLAY_WORK; if( window->IsMenu ) fgSetWindow( saved_window ); } @@ -179,33 +179,6 @@ static void fghProcessWork( void ) fgEnumWindows( fghcbProcessWork, &enumerator ); } - -static void fghcbDisplayWindow( SFG_Window *window, - SFG_Enumerator *enumerator ) -{ - if( window->State.Redisplay && - window->State.Visible ) - { - window->State.Redisplay = GL_FALSE; - fghRedrawWindow ( window ); - } - - fgEnumSubWindows( window, fghcbDisplayWindow, enumerator ); -} - -/* - * Make all windows perform a display call - */ -static void fghDisplayAll( void ) -{ - SFG_Enumerator enumerator; - - enumerator.found = GL_FALSE; - enumerator.data = NULL; - - fgEnumWindows( fghcbDisplayWindow, &enumerator ); -} - /* * Window enumerator callback to check for the joystick polling code */ @@ -357,29 +330,28 @@ void fgWarning( const char *fmt, ... ) /* - * Indicates whether a redisplay is pending for ANY window. + * Indicates whether work is pending for ANY window. * * The current mechanism is to walk all of the windows and ask if - * a redisplay is pending. We have a short-circuit early - * return if we find any. + * work is pending. We have a short-circuit early return if we find any. */ -static void fghHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e) +static void fghHavePendingWorkCallback( SFG_Window* w, SFG_Enumerator* e) { - if( w->State.Redisplay && w->State.Visible ) + if( w->State.WorkMask ) { e->found = GL_TRUE; e->data = w; return; } - fgEnumSubWindows( w, fghHavePendingRedisplaysCallback, e ); + fgEnumSubWindows( w, fghHavePendingWorkCallback, e ); } -static int fghHavePendingRedisplays (void) +static int fghHavePendingWork (void) { SFG_Enumerator enumerator; enumerator.found = GL_FALSE; enumerator.data = NULL; - fgEnumWindows( fghHavePendingRedisplaysCallback, &enumerator ); + fgEnumWindows( fghHavePendingWorkCallback, &enumerator ); return !!enumerator.data; } @@ -405,7 +377,7 @@ static void fghSleepForEvents( void ) { fg_time_t msec; - if( fghHavePendingRedisplays( ) ) + if( fghHavePendingWork( ) ) return; msec = fghNextTimer( ); @@ -433,12 +405,9 @@ void FGAPIENTRY glutMainLoopEvent( void ) if (fgState.NumActiveJoysticks>0) /* If zero, don't poll joysticks */ fghCheckJoystickPolls( ); - /* Perform work on the window (position, reshape, etc) */ + /* Perform work on the window (position, reshape, display, etc) */ fghProcessWork( ); - /* Display */ - fghDisplayAll( ); - fgCloseWindows( ); } diff --git a/src/fg_menu.c b/src/fg_menu.c index f302cdd..bbae132 100644 --- a/src/fg_menu.c +++ b/src/fg_menu.c @@ -207,7 +207,7 @@ static GLboolean fghCheckMenuStatus( SFG_Menu* menu ) if( menuEntry != menu->ActiveEntry ) { - menu->Window->State.Redisplay = GL_TRUE; + menu->Window->State.WorkMask |= GLUT_DISPLAY_WORK; if( menu->ActiveEntry ) menu->ActiveEntry->IsActive = GL_FALSE; } @@ -277,7 +277,7 @@ static GLboolean fghCheckMenuStatus( SFG_Menu* menu ) ( !menu->ActiveEntry->SubMenu || !menu->ActiveEntry->SubMenu->IsActive ) ) { - menu->Window->State.Redisplay = GL_TRUE; + menu->Window->State.WorkMask |= GLUT_DISPLAY_WORK; menu->ActiveEntry->IsActive = GL_FALSE; menu->ActiveEntry = NULL; } diff --git a/src/fg_window.c b/src/fg_window.c index d24f7cd..d61be0d 100644 --- a/src/fg_window.c +++ b/src/fg_window.c @@ -295,7 +295,7 @@ void FGAPIENTRY glutShowWindow( void ) fgStructure.CurrentWindow->State.WorkMask |= GLUT_VISIBILITY_WORK; fgStructure.CurrentWindow->State.DesiredVisibility = DesireNormalState; - fgStructure.CurrentWindow->State.Redisplay = GL_TRUE; + fgStructure.CurrentWindow->State.WorkMask |= GLUT_DISPLAY_WORK; } /* @@ -309,7 +309,7 @@ void FGAPIENTRY glutHideWindow( void ) fgStructure.CurrentWindow->State.WorkMask |= GLUT_VISIBILITY_WORK; fgStructure.CurrentWindow->State.DesiredVisibility = DesireHiddenState; - fgStructure.CurrentWindow->State.Redisplay = GL_FALSE; + fgStructure.CurrentWindow->State.WorkMask &= ~GLUT_DISPLAY_WORK; } /* @@ -323,7 +323,7 @@ void FGAPIENTRY glutIconifyWindow( void ) fgStructure.CurrentWindow->State.WorkMask |= GLUT_VISIBILITY_WORK; fgStructure.CurrentWindow->State.DesiredVisibility = DesireIconicState; - fgStructure.CurrentWindow->State.Redisplay = GL_FALSE; + fgStructure.CurrentWindow->State.WorkMask &= ~GLUT_DISPLAY_WORK; } /* diff --git a/src/mswin/fg_main_mswin.c b/src/mswin/fg_main_mswin.c index 7e43eaf..dccb8dd 100644 --- a/src/mswin/fg_main_mswin.c +++ b/src/mswin/fg_main_mswin.c @@ -893,9 +893,9 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR * force redisplay so display keeps running during dragging. * Screen still wont update when not moving the cursor though... */ - /* PRECT prect = (PRECT) lParam; */ RECT rect; - /* printf("WM_SIZING: nc-area: %i,%i\n",prect->right-prect->left,prect->bottom-prect->top); */ + /* PRECT prect = (PRECT) lParam; + printf("WM_SIZING: nc-area: %i,%i\n",prect->right-prect->left,prect->bottom-prect->top); */ /* Get client area, the rect in lParam is including non-client area. */ fghGetClientArea(&rect,window,FALSE); @@ -1066,12 +1066,12 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR if (wParam) { fghPlatformOnWindowStatusNotify(window, GL_TRUE, GL_FALSE); - window->State.Redisplay = GL_TRUE; + window->State.WorkMask |= GLUT_DISPLAY_WORK; } else { fghPlatformOnWindowStatusNotify(window, GL_FALSE, GL_FALSE); - window->State.Redisplay = GL_FALSE; + window->State.WorkMask &= ~GLUT_DISPLAY_WORK; } break; @@ -1092,7 +1092,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR BeginPaint( hWnd, &ps ); EndPaint( hWnd, &ps ); - window->State.Redisplay = GL_TRUE; + window->State.WorkMask |= GLUT_DISPLAY_WORK; } lRet = 0; /* As per docs, should return 0 */ } @@ -1384,7 +1384,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR #if !defined(_WIN32_WCE) case WM_SYNCPAINT: /* 0x0088 */ /* Another window has moved, need to update this one */ - window->State.Redisplay = GL_TRUE; + window->State.WorkMask |= GLUT_DISPLAY_WORK; lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); /* Help screen says this message must be passed to "DefWindowProc" */ break; @@ -1548,6 +1548,8 @@ void fgPlatformProcessWork(SFG_Window *window) /* Now clear it so that any callback generated by the actions below can set work again */ window->State.WorkMask = 0; + if (workMask&~GLUT_DISPLAY_WORK) /* Display work is the common case, skip all the below at once */ + { /* This is before the first display callback: call a few callbacks to inform user of window size, position, etc * we know this is before the first display callback of a window as for all windows GLUT_INIT_WORK is set when * they are opened, and work is done before displaying in the mainloop. @@ -1776,4 +1778,14 @@ void fgPlatformProcessWork(SFG_Window *window) ShowWindow( win->Window.Handle, cmdShow ); } + } + + if (workMask & GLUT_DISPLAY_WORK) + { + if( window->State.Visible ) + fghRedrawWindow ( window ); + + /* Strip out display work that might have ended up on work list now as some of the above genereates callbacks */ + window->State.WorkMask &= ~GLUT_DISPLAY_WORK; + } } \ No newline at end of file diff --git a/src/x11/fg_main_x11.c b/src/x11/fg_main_x11.c index 7af570f..897b7ee 100644 --- a/src/x11/fg_main_x11.c +++ b/src/x11/fg_main_x11.c @@ -698,7 +698,7 @@ void fgPlatformProcessSingleEvent ( void ) if( event.xexpose.count == 0 ) { GETWINDOW( xexpose ); - window->State.Redisplay = GL_TRUE; + window->State.WorkMask |= GLUT_DISPLAY_WORK; } break; @@ -1085,6 +1085,8 @@ void fgPlatformProcessWork(SFG_Window *window) /* Now clear it so that any callback generated by the actions below can set work again */ window->State.WorkMask = 0; + if (workMask&~GLUT_DISPLAY_WORK) /* Display work is the common case, skip all the below at once */ + { /* This is before the first display callback: call a few callbacks to inform user of window size, position, etc * we know this is before the first display callback of a window as for all windows GLUT_INIT_WORK is set when * they are opened, and work is done before displaying in the mainloop. @@ -1144,5 +1146,15 @@ void fgPlatformProcessWork(SFG_Window *window) break; } } + } + + if (workMask & GLUT_DISPLAY_WORK) + { + if( window->State.Visible ) + fghRedrawWindow ( window ); + + /* Strip out display work that might have ended up on work list now as some of the above genereates callbacks */ + window->State.WorkMask &= ~GLUT_DISPLAY_WORK; + } }