(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,
fullscreen), i.e. memory leak caused by not freeing the mode lines returned
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 )
{
XF86VidModeModeInfo** displayModes;
int i, displayModesCount;
int i, ignoreRefreshRate, displayModesCount;
XF86VidModeGetAllModeLines(
fgDisplay.Display,
@ -243,26 +243,33 @@ static GLboolean fghChangeDisplayMode( GLboolean haveToTest )
&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,
displayModes[ i ]->vdisplay,
fgState.GameModeDepth,
fgState.GameModeRefresh ) )
for( i = 0;
!success && ( i < displayModesCount );
i++ )
{
/* OKi, this is the display mode we have been looking for... */
if( !haveToTest ) {
XF86VidModeSwitchToMode(
fgDisplay.Display,
fgDisplay.Screen,
displayModes[ i ]
);
}
success = GL_TRUE;
break;
/* 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,
fgState.GameModeDepth,
( ignoreRefreshRate ? fgState.GameModeRefresh : refresh ) );
}
}
if( !haveToTest && success ) {
XF86VidModeSwitchToMode( fgDisplay.Display, fgDisplay.Screen, displayModes[ i ] );
}
XFree( displayModes );
}