Hi All,

As CriticalMass / critter upstream seems dead, this is the best way
I can think of to share this bugfix.

When changing the resolution from the video preferences screen to a not
available one, critter will crash. The attached patch fixes this.

The attached patch also fixes an error in how supported resolutions
(other then the hardcoded list, for example widescreens ones) were
detected, due to a bug in the Resolution == operator they would end
up as all getting stored with the width of the highest resolution.

Regards,

Hans
--- CriticalMass-1.0.2/game/Selectable.hpp      2005-08-15 03:06:37.000000000 
+0200
+++ CriticalMass-1.0.2.foo/game/Selectable.hpp  2010-07-12 15:33:57.229790590 
+0200
@@ -139,7 +139,7 @@
        string text;
        bool operator==(Resolution &r1)
        {
-           return (r1.width=width) && (r1.height==height);
+           return (r1.width==width) && (r1.height==height);
        }
        bool operator!=(Resolution &r1)
        {
--- CriticalMass-1.0.2/game/Video.cpp   2006-07-16 01:43:57.000000000 +0200
+++ CriticalMass-1.0.2.foo/game/Video.cpp       2010-07-12 16:40:16.377919418 
+0200
@@ -124,10 +124,9 @@
        _fpsStepSize = 1.0f/(float)_maxFPS;
     }
 
-    ConfigS::instance()->getBoolean( "fullscreen", _isFullscreen);
-
     if( !setVideoMode())
     {
+       SDL_QuitSubSystem( SDL_INIT_VIDEO);
        return false;
     }
 
@@ -247,6 +246,8 @@
 bool Video::setVideoMode( void)
 {
     int videoFlags = SDL_OPENGL;
+
+    ConfigS::instance()->getBoolean( "fullscreen", _isFullscreen);
     if( _isFullscreen)
     {
         LOG_INFO << "Fullscreen request." << endl;
@@ -279,14 +280,12 @@
     if( ! ::init("libGL.so.1"))
     {
        LOG_ERROR << "SDL Error: " << SDL_GetError() << endl;
-       SDL_QuitSubSystem( SDL_INIT_VIDEO);
        return false;
     }
 
     if( SDL_SetVideoMode( _width, _height, _bpp, videoFlags ) == NULL )
     {
         LOG_ERROR << "Video Mode: failed #" << SDL_GetError() << endl;
-       SDL_QuitSubSystem( SDL_INIT_VIDEO);
         return false;
     }
     glViewport(0,0, _width, _height);
@@ -304,16 +303,20 @@
     return true;
 }
 
-void  Video::updateSettings( void)
+bool Video::updateSettings( void)
 {
-    bool fullscreen = _isFullscreen;
-    ConfigS::instance()->getBoolean( "fullscreen", _isFullscreen);
+    bool isFullscreen, oldIsFullscreen;
+    int width, height, oldWidth, oldHeight;
+
+    isFullscreen = oldIsFullscreen = _isFullscreen;
+    width  = oldWidth  = _width;
+    height = oldHeight = _height;
 
-    int width = 0;
+    ConfigS::instance()->getBoolean( "fullscreen", isFullscreen);
     ConfigS::instance()->getInteger( "width", width);
-    int height = 0;
     ConfigS::instance()->getInteger( "height", height);
-    if( (fullscreen != _isFullscreen) || (width != _width) || (height != 
_height))
+
+    if( (isFullscreen != oldIsFullscreen) || (width != oldWidth) || (height != 
oldHeight))
     {
 #ifdef DYNAMIC_GL
        SDL_QuitSubSystem( SDL_INIT_VIDEO);
@@ -322,7 +325,22 @@
            LOG_ERROR << "Update Video: failed # " << SDL_GetError() << endl;
        }
 #endif
-       setVideoMode();
+       if (!setVideoMode()) {
+           // Try again with old settings.
+           Value *fs = new Value( oldIsFullscreen);
+           Value *w = new Value( oldWidth);
+           Value *h = new Value( oldHeight);
+
+           ConfigS::instance()->updateKeyword( "fullscreen", fs);
+           ConfigS::instance()->updateKeyword( "width", w);
+           ConfigS::instance()->updateKeyword( "height", h);
+
+           if (!setVideoMode()) {
+               SDL_QuitSubSystem(SDL_INIT_VIDEO);
+               GameState::isAlive = false;
+               return false;
+           }
+       }
        reload();
 #ifdef DYNAMIC_GL
        //hide&grab cursor and warp to centre
@@ -345,6 +363,8 @@
 
     ConfigS::instance()->getBoolean( "showStarfield", _showStarfield);
     ConfigS::instance()->getBoolean( "showNebulas", _showNebulas);
+
+    return true;
 }
 
 void Video::updateLogic( void)
@@ -360,7 +380,8 @@
     float thisTime = Timer::getTime();
     if( thisTime > nextTime)
     {
-       updateSettings();
+       if (!updateSettings())
+           return false;
        nextTime = thisTime+0.5f;
     }
 
--- CriticalMass-1.0.2/game/Video.hpp   2005-12-31 01:37:26.000000000 +0100
+++ CriticalMass-1.0.2.foo/game/Video.hpp       2010-07-12 16:37:20.560170285 
+0200
@@ -52,7 +52,7 @@
     Video &operator=(const Video&);
 
     void reload( void);
-    void updateSettings( void);
+    bool updateSettings( void);
     bool setVideoMode( void);
 
     bool _isFullscreen;
_______________________________________________
Games mailing list
Games@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/games

Reply via email to