]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_shared.c
vid: refactor modesetting fallbacks
[xonotic/darkplaces.git] / vid_shared.c
index a3d86d3ec060f0f55202662ef4712ac304584fbf..f8868f950e8e12acd98b0329440b0931baba0363 100644 (file)
@@ -162,12 +162,12 @@ cvar_t vid_touchscreen = {CF_CLIENT, "vid_touchscreen", "0", "Use touchscreen-st
 cvar_t vid_touchscreen_showkeyboard = {CF_CLIENT, "vid_touchscreen_showkeyboard", "0", "shows the platform's screen keyboard for text entry, can be set by csqc or menu qc if it wants to receive text input, does nothing if the platform has no screen keyboard"};
 cvar_t vid_touchscreen_supportshowkeyboard = {CF_CLIENT | CF_READONLY, "vid_touchscreen_supportshowkeyboard", "0", "indicates if the platform supports a virtual keyboard"};
 cvar_t vid_stick_mouse = {CF_CLIENT | CF_ARCHIVE, "vid_stick_mouse", "0", "have the mouse stuck in the center of the screen" };
-cvar_t vid_resizable = {CF_CLIENT | CF_ARCHIVE, "vid_resizable", "0", "0: window not resizable, 1: resizable, 2: window can be resized but the framebuffer isn't adjusted" };
+cvar_t vid_resizable = {CF_CLIENT | CF_ARCHIVE, "vid_resizable", "1", "0: window not resizable, 1: resizable, 2: window can be resized but the framebuffer isn't adjusted" };
 cvar_t vid_desktopfullscreen = {CF_CLIENT | CF_ARCHIVE, "vid_desktopfullscreen", "1", "force desktop resolution for fullscreen; also use some OS dependent tricks for better fullscreen integration"};
 cvar_t vid_display = {CF_CLIENT | CF_ARCHIVE, "vid_display", "0", "which monitor to render on, numbered from 0 (system default)" };
 cvar_t vid_info_displaycount = {CF_CLIENT | CF_READONLY, "vid_info_displaycount", "1", "how many monitors are currently available, updated by hotplug events" };
 #ifdef WIN32
-cvar_t vid_ignore_taskbar = {CF_CLIENT | CF_ARCHIVE, "vid_ignore_taskbar", "0", "in windowed mode, prevent the Windows taskbar and window borders from affecting the size and placement of the window. it will be aligned centered and uses the unaltered vid_width/vid_height values"};
+cvar_t vid_ignore_taskbar = {CF_CLIENT | CF_ARCHIVE, "vid_ignore_taskbar", "1", "in windowed mode, prevent the Windows taskbar and window borders from affecting the size and placement of the window. it will be aligned centered and uses the unaltered vid_width/vid_height values"};
 #endif
 
 cvar_t v_gamma = {CF_CLIENT | CF_ARCHIVE, "v_gamma", "1", "inverse gamma correction value, a brightness effect that does not affect white or black, and tends to make the image grey and dull"};
@@ -1404,15 +1404,14 @@ static int VID_Mode(int fullscreen, int width, int height, int bpp, float refres
        if (VID_InitMode(&mode))
        {
                // accept the (possibly modified) mode
-               vid.mode = mode;
-               vid.fullscreen     = vid.mode.fullscreen;
-               vid.width          = vid.mode.width;
-               vid.height         = vid.mode.height;
-               vid.bitsperpixel   = vid.mode.bitsperpixel;
-               vid.refreshrate    = vid.mode.refreshrate;
-               vid.userefreshrate = vid.mode.userefreshrate;
-               vid.stereobuffer   = vid.mode.stereobuffer;
-               vid.stencil        = vid.mode.bitsperpixel > 16;
+               vid.fullscreen     = mode.fullscreen;
+               vid.width          = mode.width;
+               vid.height         = mode.height;
+               vid.bitsperpixel   = mode.bitsperpixel;
+               vid.refreshrate    = mode.refreshrate;
+               vid.userefreshrate = mode.userefreshrate;
+               vid.stereobuffer   = mode.stereobuffer;
+               vid.stencil        = mode.bitsperpixel > 16;
                vid.sRGB2D         = vid_sRGB.integer >= 1 && vid.sRGBcapable2D;
                vid.sRGB3D         = vid_sRGB.integer >= 1 && vid.sRGBcapable3D;
 
@@ -1443,15 +1442,6 @@ static int VID_Mode(int fullscreen, int width, int height, int bpp, float refres
 
                Con_Printf("Video Mode: %s %dx%dx%dx%.2fhz%s on display %i\n", mode.fullscreen ? "fullscreen" : "window", mode.width, mode.height, mode.bitsperpixel, mode.refreshrate, mode.stereobuffer ? " stereo" : "", vid.displayindex);
 
-               Cvar_SetValueQuick(&vid_fullscreen, vid.mode.fullscreen);
-               Cvar_SetValueQuick(&vid_width, vid.mode.width);
-               Cvar_SetValueQuick(&vid_height, vid.mode.height);
-               Cvar_SetValueQuick(&vid_bitsperpixel, vid.mode.bitsperpixel);
-               Cvar_SetValueQuick(&vid_samples, vid.mode.samples);
-               if(vid_userefreshrate.integer)
-                       Cvar_SetValueQuick(&vid_refreshrate, vid.mode.refreshrate);
-               Cvar_SetValueQuick(&vid_stereobuffer, vid.stereobuffer ? 1 : 0);
-
                if (vid_touchscreen.integer)
                {
                        in_windowmouse_x = vid_width.value / 2.f;
@@ -1470,13 +1460,22 @@ extern qbool vid_opened;
 void VID_Restart_f(cmd_state_t *cmd)
 {
        char vabuf[1024];
+       viddef_mode_t oldmode;
 
        // don't crash if video hasn't started yet
        if (vid_commandlinecheck)
                return;
 
+       oldmode.fullscreen     = vid.fullscreen;
+       oldmode.width          = vid.width;
+       oldmode.height         = vid.height;
+       oldmode.bitsperpixel   = vid.bitsperpixel;
+       oldmode.refreshrate    = vid.refreshrate;
+       oldmode.userefreshrate = vid.userefreshrate;
+       oldmode.stereobuffer   = vid.stereobuffer;
+
        Con_Printf("VID_Restart: changing from %s %dx%dx%dbpp%s, to %s %dx%dx%dbpp%s.\n",
-               vid.mode.fullscreen ? "fullscreen" : "window", vid.mode.width, vid.mode.height, vid.mode.bitsperpixel, vid.mode.fullscreen && vid.mode.userefreshrate ? va(vabuf, sizeof(vabuf), "x%.2fhz", vid.mode.refreshrate) : "",
+               oldmode.fullscreen ? "fullscreen" : "window", oldmode.width, oldmode.height, oldmode.bitsperpixel, oldmode.fullscreen && oldmode.userefreshrate ? va(vabuf, sizeof(vabuf), "x%.2fhz", oldmode.refreshrate) : "",
                vid_fullscreen.integer ? "fullscreen" : "window", vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_fullscreen.integer && vid_userefreshrate.integer ? va(vabuf, sizeof(vabuf), "x%.2fhz", vid_refreshrate.value) : "");
        SCR_DeferLoadingPlaque(false);
        R_Modules_Shutdown();
@@ -1484,21 +1483,35 @@ void VID_Restart_f(cmd_state_t *cmd)
        if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_refreshrate.value, vid_stereobuffer.integer))
        {
                Con_Print("Video mode change failed\n");
-               if (!VID_Mode(vid.mode.fullscreen, vid.mode.width, vid.mode.height, vid.mode.bitsperpixel, vid.mode.refreshrate, vid.mode.stereobuffer))
+               if (!VID_Mode(oldmode.fullscreen, oldmode.width, oldmode.height, oldmode.bitsperpixel, oldmode.refreshrate, oldmode.stereobuffer))
                        Sys_Error("Unable to restore to last working video mode");
+               else
+               {
+                       Cvar_SetValueQuick(&vid_fullscreen,        oldmode.fullscreen);
+                       Cvar_SetValueQuick(&vid_width,             oldmode.width);
+                       Cvar_SetValueQuick(&vid_height,            oldmode.height);
+                       Cvar_SetValueQuick(&vid_bitsperpixel,      oldmode.bitsperpixel);
+                       Cvar_SetValueQuick(&vid_refreshrate,       oldmode.refreshrate);
+                       Cvar_SetValueQuick(&vid_stereobuffer,      oldmode.stereobuffer);
+               }
        }
        R_Modules_Start();
        Key_ReleaseAll();
 }
 
-const char *vidfallbacks[][2] =
+struct vidfallback_s
+{
+       cvar_t *cvar;
+       const char *safevalue;
+};
+static struct vidfallback_s vidfallbacks[] =
 {
-       {"vid_stereobuffer", "0"},
-       {"vid_samples", "1"},
-       {"vid_userefreshrate", "0"},
-       {"vid_width", "640"},
-       {"vid_height", "480"},
-       {"vid_bitsperpixel", "32"},
+       {&vid_stereobuffer, "0"},
+       {&vid_samples, "1"},
+       {&vid_userefreshrate, "0"},
+       {&vid_width, "640"},
+       {&vid_height, "480"},
+       {&vid_bitsperpixel, "32"},
        {NULL, NULL}
 };
 
@@ -1553,10 +1566,10 @@ void VID_Start(void)
        success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_refreshrate.value, vid_stereobuffer.integer);
        if (!success)
        {
-               Con_Print("Desired video mode fail, trying fallbacks...\n");
-               for (i = 0;!success && vidfallbacks[i][0] != NULL;i++)
+               Con_Print(CON_WARN "Desired video mode fail, trying fallbacks...\n");
+               for (i = 0; !success && vidfallbacks[i].cvar != NULL; i++)
                {
-                       Cvar_Set(&cvars_all, vidfallbacks[i][0], vidfallbacks[i][1]);
+                       Cvar_SetQuick(vidfallbacks[i].cvar, vidfallbacks[i].safevalue);
                        success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_refreshrate.value, vid_stereobuffer.integer);
                }
                if (!success)