changeset 619:6c23042c546f

Aaaand some more work on mode selector.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 12 Apr 2013 15:32:37 +0300
parents a1f70e85a5ca
children 5fda51e99fe5
files dmsimple.c
diffstat 1 files changed, 96 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/dmsimple.c	Fri Apr 12 13:33:17 2013 +0300
+++ b/dmsimple.c	Fri Apr 12 15:32:37 2013 +0300
@@ -17,7 +17,6 @@
 {
     { 0, '?', "help",       "Show this help", OPT_NONE },
     { 1, 'v', "verbose",    "Be more verbose", OPT_NONE },
-    { 2, 'f', "fs",         "Fullscreen", OPT_NONE },
 };
 
 const int optListN = sizeof(optList) / sizeof(optList[0]);
@@ -46,10 +45,6 @@
             dmVerbosity++;
             break;
         
-        case 2:
-            engine.optVFlags |= SDL_FULLSCREEN;
-            break;
-
         default:
             dmError("Unknown option '%s'.\n", currArg);
             return FALSE;
@@ -168,18 +163,89 @@
 }
 
 
+typedef struct
+{
+    int w, h;
+} DMModeEntry;
+
+
+DMModeEntry *engineModeList = NULL;
+int nengineModeList = 0, aengineModeList = 0;
+
+
+static int engineModeSort(const void *pa, const void *pb)
+{
+    DMModeEntry
+        *va = (DMModeEntry *) pa,
+        *vb = (DMModeEntry *) pb;
+
+    return (va->w - vb->w);
+}
+
+
+int engineAddModeToList(int w, int h)
+{
+    DMModeEntry *mode;
+    int i;
+    
+    // Check if the mode is already in our list
+    for (i = 0; i < nengineModeList; i++)
+    {
+        mode = &engineModeList[i];
+        if (mode->w == w && mode->h == h)
+            return DMERR_OK;
+    }
+
+    // Reallocate array if needed
+    if (nengineModeList + 1 >= aengineModeList)
+    {
+        aengineModeList += 16;
+        engineModeList = dmRealloc(engineModeList, sizeof(DMModeEntry) * aengineModeList);
+        if (engineModeList == NULL)
+            return DMERR_MALLOC;
+    }
+    
+    // Store
+    mode = &engineModeList[nengineModeList];
+    mode->w = w;
+    mode->h = h;
+    
+    nengineModeList++;
+    
+    return DMERR_OK;
+}
+
 
 int engineVideoSetup()
 {
     DMBitmapFont *menuFont = NULL;
     DMResource *file = NULL;
     SDL_Surface *menuBgImage = NULL, *menuBarImage = NULL;
-    int result, menuState = -1, nmenuList, menuChoice = 0;
+    int result, menuState = -1, menuChoice = 0;
+    BOOL fullScreen = TRUE;
     char menuStr[64];
 
     // Compute a list of valid modes
+    if (!engineGenInitializeVideo(DM_VSETUP_WIDTH, DM_VSETUP_HEIGHT, engine.optVidDepth, engine.optVFlags))
+        goto out;
 
 
+    SDL_Rect **modes = SDL_ListModes(engine.screen->format, engine.screen->flags | SDL_FULLSCREEN);
+    if (modes == (SDL_Rect**) 0)
+    {
+        dmError("No compatible video resolutions/depths available at all. Bailing out.\n");
+        goto out;
+    }
+    
+    if (modes != (SDL_Rect**) -1)
+    {
+        int i;
+        for (i = 0; modes[i] != NULL; i++)
+            engineAddModeToList(modes[i]->w, modes[i]->h);
+    }
+
+    qsort(engineModeList, nengineModeList, sizeof(engineModeList[0]), engineModeSort);
+
     // Open video temporarily
     if (!engineGenInitializeVideo(DM_VSETUP_WIDTH, DM_VSETUP_HEIGHT, 32, SDL_SWSURFACE | SDL_DOUBLEBUF))
         goto out;
@@ -263,7 +329,6 @@
                         menuState = -1;
                         break;
 
-                    case SDLK_SPACE:
                     case SDLK_RETURN:
                         menuState = 1;
                         break;
@@ -274,9 +339,13 @@
                         break;
 
                     case SDLK_DOWN:
-                        if (menuChoice < nmenuList - 1)
+                        if (menuChoice < nengineModeList - 1)
                             menuChoice++;
                         break;
+                    
+                    case SDLK_SPACE:
+                        fullScreen = !fullScreen;
+                        break;
 
                     default:
                         break;
@@ -303,7 +372,6 @@
         // XXX/TODO: Some hardcoded bits here ...
         float t = engineGetTimeDT(&engine);
         int entry;
-        nmenuList = 5;
         dmScaledBlitSurface32to32TransparentGA(menuBarImage,
             DM_VSETUP_MENU_XC,
             DM_VSETUP_MENU_YC + (menuChoice * menuEntryHeight),
@@ -311,9 +379,13 @@
             engine.screen,
             200 + sin(t * 10.0) * 50);
 
-        for (entry = 0; entry < nmenuList && entry < menuHeight; entry++)
+        for (entry = 0; entry < nengineModeList && entry < menuHeight; entry++)
         {
-            snprintf(menuStr, sizeof(menuStr), "%4d X %4d", 640 * (entry + 1), 480 * (entry + 1));
+            DMModeEntry *mode = &engineModeList[entry];
+
+            snprintf(menuStr, sizeof(menuStr),
+                "%4d X %4d", mode->w, mode->h);
+
             dmDrawBMTextConst(
                 engine.screen, menuFont, DMD_TRANSPARENT,
                 DM_VSETUP_MENU_XC + 2,
@@ -321,6 +393,19 @@
                 menuStr);
         }
         
+        dmDrawBMTextConst(
+            engine.screen, menuFont, DMD_TRANSPARENT,
+            80,
+            DM_VSETUP_MENU_YC + menuEntryHeight * (1 + menuHeight),
+            fullScreen ?
+            "[ FULLSCREEN ] - SPACE TO TOGGLE" :
+            "[  WINDOWED  ] - SPACE TO TOGGLE");
+
+        dmDrawBMTextConst(
+            engine.screen, menuFont, DMD_TRANSPARENT,
+            80,
+            DM_VSETUP_MENU_YC + menuEntryHeight * (2 + menuHeight),
+            "     PRESS [ENTER] TO START     ");
 
         // Flip screen
         if (SDL_MUSTLOCK(engine.screen) != 0)