(234) Fixed part of bug #926883 (Video mode matching code, memory leaks,
authorSven Panne <sven.panne@aedion.de>
Mon, 3 Jan 2005 16:49:37 +0000 (16:49 +0000)
committerSven Panne <sven.panne@aedion.de>
Mon, 3 Jan 2005 16:49:37 +0000 (16:49 +0000)
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: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@558 7f0cb862-5218-0410-a997-914c9d46530a

ChangeLog
src/freeglut_gamemode.c

index c385ac4..e947cad 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index 404b6c1..7d5a1ef 100644 (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 );
     }