(234) Fixed part of bug #926883 (Video mode matching code, memory leaks,

fullscreen): Now we first try to get an exact mode match, ignoring the
refresh rate if none could be found. This way the X11 part and the WinDoze
behave similarly. NOTE: We still don't behave like GLUT, because it has a
wider notion of "best" match. We have to refactor and extend freeglut quite
a bit to do that.


git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@558 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
spanne 2005-01-03 16:49:37 +00:00
parent f7ef083831
commit c70e6634ff
2 changed files with 31 additions and 17 deletions

View File

@ -895,3 +895,10 @@ default.
(233) Fixed part of bug #926883 (Video mode matching code, memory leaks, (233) Fixed part of bug #926883 (Video mode matching code, memory leaks,
fullscreen), i.e. memory leak caused by not freeing the mode lines returned fullscreen), i.e. memory leak caused by not freeing the mode lines returned
by XF86VidModeGetAllModeLines by XF86VidModeGetAllModeLines
(234) Fixed part of bug #926883 (Video mode matching code, memory leaks,
fullscreen): Now we first try to get an exact mode match, ignoring the
refresh rate if none could be found. This way the X11 part and the WinDoze
behave similarly. NOTE: We still don't behave like GLUT, because it has a
wider notion of "best" match. We have to refactor and extend freeglut quite
a bit to do that.

View File

@ -234,7 +234,7 @@ static GLboolean fghChangeDisplayMode( GLboolean haveToTest )
if( haveToTest || fgDisplay.DisplayModeValid ) if( haveToTest || fgDisplay.DisplayModeValid )
{ {
XF86VidModeModeInfo** displayModes; XF86VidModeModeInfo** displayModes;
int i, displayModesCount; int i, ignoreRefreshRate, displayModesCount;
XF86VidModeGetAllModeLines( XF86VidModeGetAllModeLines(
fgDisplay.Display, fgDisplay.Display,
@ -243,26 +243,33 @@ static GLboolean fghChangeDisplayMode( GLboolean haveToTest )
&displayModes &displayModes
); );
/* Check every of the modes looking for one that matches our demands */ /*
for( i = 0; i < displayModesCount; i++ ) * Check every of the modes looking for one that matches our demands,
* ignoring the refresh rate if no exact match could be found.
*/
for( ignoreRefreshRate = 0;
!success && ( ignoreRefreshRate <= 1 );
ignoreRefreshRate++)
{ {
if( fghCheckDisplayMode( displayModes[ i ]->hdisplay, for( i = 0;
!success && ( i < displayModesCount );
i++ )
{
/* Compute the displays refresh rate, dotclock comes in kHz. */
int refresh = ( displayModes[ i ]->dotclock * 1000 ) /
( displayModes[ i ]->htotal * displayModes[ i ]->vtotal );
success = fghCheckDisplayMode( displayModes[ i ]->hdisplay,
displayModes[ i ]->vdisplay, displayModes[ i ]->vdisplay,
fgState.GameModeDepth, fgState.GameModeDepth,
fgState.GameModeRefresh ) ) ( ignoreRefreshRate ? fgState.GameModeRefresh : refresh ) );
{
/* OKi, this is the display mode we have been looking for... */
if( !haveToTest ) {
XF86VidModeSwitchToMode(
fgDisplay.Display,
fgDisplay.Screen,
displayModes[ i ]
);
}
success = GL_TRUE;
break;
} }
} }
if( !haveToTest && success ) {
XF86VidModeSwitchToMode( fgDisplay.Display, fgDisplay.Screen, displayModes[ i ] );
}
XFree( displayModes ); XFree( displayModes );
} }