shithub: choc

Download patch

ref: 5d99eee5a4509f42d635156bfb1d6c495d8de221
parent: 895f440628c8c45aa98bd7af996ca6ae48065224
author: Simon Howard <fraggle@gmail.com>
date: Sun Jun 7 13:10:05 EDT 2009

Make auto-adjust code switch to windowed mode if no fullscreen modes are
available.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 1571

--- a/src/i_video.c
+++ b/src/i_video.c
@@ -964,111 +964,110 @@
     return best_mode;
 }
 
-// If the video mode set in the configuration file is not available,
-// try to choose a different mode.
+// Adjust to an appropriate fullscreen mode.
+// Returns true if successful.
 
-static void I_AutoAdjustSettings(void)
+static boolean AutoAdjustFullscreen(void)
 {
-    if (fullscreen)
-    {
-        SDL_Rect **modes;
-        SDL_Rect *best_mode;
-        screen_mode_t *screen_mode;
-        int target_pixels, diff, best_diff;
-        int i;
+    SDL_Rect **modes;
+    SDL_Rect *best_mode;
+    screen_mode_t *screen_mode;
+    int target_pixels, diff, best_diff;
+    int i;
 
-        modes = SDL_ListModes(NULL, SDL_FULLSCREEN);
+    modes = SDL_ListModes(NULL, SDL_FULLSCREEN);
 
-        // Find the best mode that matches the mode specified in the
-        // configuration file
+    // No fullscreen modes available at all?
 
-        best_mode = NULL;
-        best_diff = INT_MAX;
-        target_pixels = screen_width * screen_height;
+    if (modes == NULL || modes == (SDL_Rect **) -1 || *modes == NULL)
+    {
+        return false;
+    }
 
-        for (i=0; modes[i] != NULL; ++i) 
-        {
-            //printf("%ix%i?\n", modes[i]->w, modes[i]->h);
+    // Find the best mode that matches the mode specified in the
+    // configuration file
 
-            // What screen_mode_t would be used for this video mode?
+    best_mode = NULL;
+    best_diff = INT_MAX;
+    target_pixels = screen_width * screen_height;
 
-            screen_mode = I_FindScreenMode(modes[i]->w, modes[i]->h);
+    for (i=0; modes[i] != NULL; ++i) 
+    {
+        //printf("%ix%i?\n", modes[i]->w, modes[i]->h);
 
-            // Never choose a screen mode that we cannot run in, or
-            // is poor quality for fullscreen
+        // What screen_mode_t would be used for this video mode?
 
-            if (screen_mode == NULL || screen_mode->poor_quality)
-            {
-            //    printf("\tUnsupported / poor quality\n");
-                continue;
-            }
+        screen_mode = I_FindScreenMode(modes[i]->w, modes[i]->h);
 
-            // Do we have the exact mode?
-            // If so, no autoadjust needed
+        // Never choose a screen mode that we cannot run in, or
+        // is poor quality for fullscreen
 
-            if (screen_width == modes[i]->w && screen_height == modes[i]->h)
-            {
-            //    printf("\tExact mode!\n");
-                return;
-            }
-
-            // Is this mode better than the current mode?
-
-            diff = (screen_width - modes[i]->w) 
-                     * (screen_width - modes[i]->w)
-                 + (screen_height - modes[i]->h)
-                     * (screen_height - modes[i]->h);
-
-            if (diff < best_diff)
-            {
-            //    printf("\tA valid mode\n");
-                best_mode = modes[i];
-                best_diff = diff;
-            }
+        if (screen_mode == NULL || screen_mode->poor_quality)
+        {
+        //    printf("\tUnsupported / poor quality\n");
+            continue;
         }
 
-        if (best_mode == NULL)
-        {
-            // Unable to find a valid mode!
+        // Do we have the exact mode?
+        // If so, no autoadjust needed
 
-            I_Error("Unable to find any valid video mode at all!");
+        if (screen_width == modes[i]->w && screen_height == modes[i]->h)
+        {
+        //    printf("\tExact mode!\n");
+            return true;
         }
 
-        printf("I_InitGraphics: %ix%i mode not supported on this machine.\n",
-               screen_width, screen_height);
+        // Is this mode better than the current mode?
 
-        screen_width = best_mode->w;
-        screen_height = best_mode->h;
+        diff = (screen_width - modes[i]->w) * (screen_width - modes[i]->w)
+             + (screen_height - modes[i]->h) * (screen_height - modes[i]->h);
 
+        if (diff < best_diff)
+        {
+        //    printf("\tA valid mode\n");
+            best_mode = modes[i];
+            best_diff = diff;
+        }
     }
-    else
+
+    if (best_mode == NULL)
     {
-        screen_mode_t *best_mode;
+        // Unable to find a valid mode!
 
-        //
-        // Windowed mode.
-        //
-        // Find a screen_mode_t to fit within the current settings
-        //
+        return false;
+    }
 
-        best_mode = I_FindScreenMode(screen_width, screen_height);
+    printf("I_InitGraphics: %ix%i mode not supported on this machine.\n",
+           screen_width, screen_height);
 
-        if (best_mode == NULL) 
-        {
-            // Nothing fits within the current settings.
-            // Pick the closest to 320x200 possible.
+    screen_width = best_mode->w;
+    screen_height = best_mode->h;
 
-            best_mode = I_FindScreenMode(SCREENWIDTH, SCREENHEIGHT_4_3);
-        }
+    return true;
+}
 
-        // Do we have the exact mode already?
+// Auto-adjust to a valid windowed mode.
 
-        if (best_mode->width == screen_width 
-         && best_mode->height == screen_height)
-        {
-            return;
-        }
+static void AutoAdjustWindowed(void)
+{
+    screen_mode_t *best_mode;
 
+    // Find a screen_mode_t to fit within the current settings
+
+    best_mode = I_FindScreenMode(screen_width, screen_height);
+
+    if (best_mode == NULL)
+    {
+        // Nothing fits within the current settings.
+        // Pick the closest to 320x200 possible.
+
+        best_mode = I_FindScreenMode(SCREENWIDTH, SCREENHEIGHT_4_3);
+    }
+
+    // Switch to the best mode if necessary.
+
+    if (best_mode->width != screen_width || best_mode->height != screen_height)
+    {
         printf("I_InitGraphics: Cannot run at specified mode: %ix%i\n",
                screen_width, screen_height);
 
@@ -1075,14 +1074,45 @@
         screen_width = best_mode->width;
         screen_height = best_mode->height;
     }
+}
 
-    printf("I_InitGraphics: Auto-adjusted to %ix%i.\n",
-           screen_width, screen_height);
+// If the video mode set in the configuration file is not available,
+// try to choose a different mode.
 
-    printf("NOTE: Your video settings have been adjusted.  "
-           "To disable this behavior,\n"
-           "set autoadjust_video_settings to 0 in your "
-           "configuration file.\n");
+static void I_AutoAdjustSettings(void)
+{
+    int old_screen_w, old_screen_h;
+
+    old_screen_w = screen_width;
+    old_screen_h = screen_height;
+
+    // If we are running fullscreen, try to autoadjust to a valid fullscreen
+    // mode.  If this is impossible, switch to windowed.
+
+    if (fullscreen && !AutoAdjustFullscreen())
+    {
+        fullscreen = 0;
+    }
+
+    // If we are running windowed, pick a valid window size.
+
+    if (!fullscreen)
+    {
+        AutoAdjustWindowed();
+    }
+
+    // Have the settings changed?  Show a message.
+
+    if (screen_width != old_screen_w || screen_height != old_screen_h)
+    {
+        printf("I_InitGraphics: Auto-adjusted to %ix%i.\n",
+               screen_width, screen_height);
+
+        printf("NOTE: Your video settings have been adjusted.  "
+               "To disable this behavior,\n"
+               "set autoadjust_video_settings to 0 in your "
+               "configuration file.\n");
+    }
 }
 
 // Set video size to a particular scale factor (1x, 2x, 3x, etc.)