diff --git a/Quake/Makefile b/Quake/Makefile
index 8fd3ca2a..9f010417 100644
--- a/Quake/Makefile
+++ b/Quake/Makefile
@@ -250,6 +250,7 @@ OBJS := \
common.o \
crc.o \
cvar.o \
+ cfgfile.o \
host.o \
host_cmd.o \
mathlib.o \
diff --git a/Quake/Makefile.darwin b/Quake/Makefile.darwin
index 2d475a1e..a3ffb1ab 100644
--- a/Quake/Makefile.darwin
+++ b/Quake/Makefile.darwin
@@ -276,6 +276,7 @@ OBJS := \
common.o \
crc.o \
cvar.o \
+ cfgfile.o \
host.o \
host_cmd.o \
mathlib.o \
diff --git a/Quake/Makefile.w32 b/Quake/Makefile.w32
index 8b611a59..0d23e20e 100644
--- a/Quake/Makefile.w32
+++ b/Quake/Makefile.w32
@@ -236,6 +236,7 @@ OBJS := \
common.o \
crc.o \
cvar.o \
+ cfgfile.o \
host.o \
host_cmd.o \
mathlib.o \
diff --git a/Quake/Makefile.w64 b/Quake/Makefile.w64
index 78836d7f..ede1f78a 100644
--- a/Quake/Makefile.w64
+++ b/Quake/Makefile.w64
@@ -236,6 +236,7 @@ OBJS := \
common.o \
crc.o \
cvar.o \
+ cfgfile.o \
host.o \
host_cmd.o \
mathlib.o \
diff --git a/Quake/cfgfile.c b/Quake/cfgfile.c
new file mode 100644
index 00000000..a0a37311
--- /dev/null
+++ b/Quake/cfgfile.c
@@ -0,0 +1,160 @@
+/*
+ cfgfile.c
+ misc reads from the config file
+
+ $Id: cfgfile.c 3880 2011-01-28 21:50:19Z sezero $
+
+ Copyright (C) 2008-2010 O.Sezer
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to:
+
+ Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301 USA
+*/
+
+#include "quakedef.h"
+
+
+static FILE *cfg_file;
+
+/*
+===================
+CFG_ReadCvars
+
+used for doing early reads from config.cfg searching the list
+of given cvar names for the user-set values. a temporary
+solution until we merge a better cvar system.
+the num_vars argument must be the exact number of strings in the
+array, otherwise I have nothing against going out of bounds.
+===================
+*/
+void CFG_ReadCvars (const char **vars, int num_vars)
+{
+ char buff[1024], *tmp;
+ int i, j;
+
+ if (!cfg_file || num_vars < 1)
+ return;
+
+ j = 0;
+
+ do {
+ i = 0;
+ memset (buff, 0, sizeof(buff));
+ fgets(buff, sizeof(buff), cfg_file);
+ if (!feof(cfg_file))
+ {
+ // we expect a line in the format that Cvar_WriteVariables
+ // writes to the config file. although I'm trying to be as
+ // much cautious as possible, if the user screws it up by
+ // editing it, it's his fault.
+
+ // remove end-of-line characters
+ while (buff[i])
+ {
+ if (buff[i] == '\r' || buff[i] == '\n')
+ buff[i] = '\0';
+ // while we're here, replace tabs with spaces
+ if (buff[i] == '\t')
+ buff[i] = ' ';
+ i++;
+ }
+ // go to the last character
+ while (buff[i] == 0 && i > 0)
+ i--;
+ // remove trailing spaces
+ while (i > 0)
+ {
+ if (buff[i] == ' ')
+ {
+ buff[i] = '\0';
+ i--;
+ }
+ else
+ break;
+ }
+
+ // the line must end with a quotation mark
+ if (buff[i] != '\"')
+ continue;
+ buff[i] = '\0';
+
+ for (i = 0; i < num_vars && vars[i]; i++)
+ {
+ // look for the cvar name + one space
+ tmp = strstr(buff, va("%s ",vars[i]));
+ if (tmp != buff)
+ continue;
+ // locate the first quotation mark
+ tmp = strchr(buff, '\"');
+ if (tmp)
+ {
+ Cvar_Set (vars[i], tmp+1);
+ j++;
+ break;
+ }
+ }
+ }
+
+ if (j == num_vars)
+ break;
+
+ } while (!feof(cfg_file));
+
+ fseek (cfg_file, 0, SEEK_SET);
+}
+
+void CFG_ReadCvarOverrides (const char **vars, int num_vars)
+{
+ char buff[64];
+ int i, j;
+
+ if (num_vars < 1)
+ return;
+
+ buff[0] = '+';
+
+ for (i = 0; i < num_vars; i++)
+ {
+ strncpy (&buff[1], vars[i], sizeof(buff) - 1);
+ buff[sizeof(buff) - 1] = 0;
+ j = COM_CheckParm(buff);
+ if (j != 0 && j < com_argc - 1)
+ {
+ if (com_argv[j + 1][0] != '-' && com_argv[j + 1][0] != '+')
+ Cvar_Set(vars[i], com_argv[j + 1]);
+ }
+ }
+}
+
+void CFG_CloseConfig (void)
+{
+ if (cfg_file)
+ {
+ fclose (cfg_file);
+ cfg_file = NULL;
+ }
+}
+
+int CFG_OpenConfig (const char *cfg_name)
+{
+ CFG_CloseConfig ();
+ COM_FOpenFile (cfg_name, &cfg_file, NULL);
+ if (!cfg_file)
+ return -1;
+ return 0;
+}
+
diff --git a/Quake/cfgfile.h b/Quake/cfgfile.h
new file mode 100644
index 00000000..617e27d7
--- /dev/null
+++ b/Quake/cfgfile.h
@@ -0,0 +1,49 @@
+/*
+ cfgfile.h
+ misc reads from the config file
+
+ $Id: cfgfile.h 3862 2010-12-30 20:51:57Z sezero $
+
+ Copyright (C) 2008-2010 O.Sezer
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to:
+
+ Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301 USA
+*/
+
+#ifndef __CFGFILE_H
+#define __CFGFILE_H
+
+int CFG_OpenConfig (const char *cfg_name);
+// opens the given config file and keeps it open
+// until CFG_CloseConfig is called
+
+void CFG_CloseConfig (void);
+// closes the currently open config file
+
+void CFG_ReadCvars (const char **vars, int num_vars);
+// reads the values of cvars in the given list
+// from the currently open config file
+
+void CFG_ReadCvarOverrides (const char **vars, int num_vars);
+// reads the "+" command line override values of cvars
+// in the given list. doesn't care about the config file.
+// call this after CFG_ReadCvars() and before locking your
+// cvars.
+
+#endif /* __CFGFILE_H */
+
diff --git a/Quake/gl_vidsdl.c b/Quake/gl_vidsdl.c
index d1502bfe..474e7400 100644
--- a/Quake/gl_vidsdl.c
+++ b/Quake/gl_vidsdl.c
@@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// gl_vidsdl.c -- SDL GL vid component
#include "quakedef.h"
+#include "cfgfile.h"
#include "bgmusic.h"
#include "resource.h"
#include "SDL.h"
@@ -1026,20 +1027,29 @@ void VID_InitDIB (void)
modelist[0].type = MODE_WINDOWED;
+ modelist[0].width = vid_width.value;
+ modelist[0].height = vid_height.value;
+
i = COM_CheckParm("-width");
if (i && i < com_argc-1)
+ {
modelist[0].width = Q_atoi(com_argv[i+1]);
- else
- modelist[0].width = 800; // QuakeSpasm, was 640
-
- if (modelist[0].width < 320)
- modelist[0].width = 320;
+
+ if (!COM_CheckParm("-height"))
+ modelist[0].height = modelist[0].width * 3 / 4;
+ }
i = COM_CheckParm("-height");
if (i && i < com_argc-1)
- modelist[0].height= Q_atoi(com_argv[i+1]);
- else
- modelist[0].height = modelist[0].width * 240/320;
+ {
+ modelist[0].height = Q_atoi(com_argv[i+1]);
+
+ if (!COM_CheckParm("-width"))
+ modelist[0].width = modelist[0].height * 4 / 3;
+ }
+
+ if (modelist[0].width < 320)
+ modelist[0].width = 320;
if (modelist[0].height < 200) //johnfitz -- was 240
modelist[0].height = 200; //johnfitz -- was 240
@@ -1157,13 +1167,13 @@ void VID_Init (void)
static char vid_center[] = "SDL_VIDEO_CENTERED=center";
const SDL_VideoInfo *info;
int i, existingmode;
- int width, height, bpp, findbpp, done;
+ int width, height, bpp;
int p;
-
- //johnfitz -- clean up init readouts
- //Con_Printf("------------- Init Video -------------\n");
- //Con_Printf("%cVideo Init\n", 2);
- //johnfitz
+ const char *read_vars[] = { "vid_fullscreen",
+ "vid_width",
+ "vid_height",
+ "vid_bpp" };
+#define num_readvars ( sizeof(read_vars)/sizeof(read_vars[0]) )
Cvar_RegisterVariable (&vid_fullscreen, VID_Changed_f); //johnfitz
Cvar_RegisterVariable (&vid_width, VID_Changed_f); //johnfitz
@@ -1183,22 +1193,33 @@ void VID_Init (void)
putenv (vid_center); /* SDL_putenv is problematic in versions <= 1.2.9 */
+ if (CFG_OpenConfig("config.cfg") == 0)
+ {
+ CFG_ReadCvars(read_vars, num_readvars);
+ CFG_CloseConfig();
+ }
+ CFG_ReadCvarOverrides(read_vars, num_readvars);
+
VID_InitDIB();
nummodes = 1;
VID_InitFullDIB();
- // Config file is not read yet, so we don't know vid_fullscreen.value
- // Changed this to default to -window as otherwise it occasionally forces
- // two switches of video mode (window->fullscreen->window) which is bad S.A
- // It's still not perfect but, hell, this ancient code can be a pain
- if (!COM_CheckParm("-fullscreen") && !COM_CheckParm ("-f"))
+ if (COM_CheckParm("-window") || COM_CheckParm("-w"))
+ {
+ Cvar_Set ("vid_fullscreen", "0");
+ }
+ else if (COM_CheckParm("-fullscreen") || COM_CheckParm("-f"))
+ {
+ Cvar_Set ("vid_fullscreen", "1");
+ }
+
+ if (!vid_fullscreen.value)
{
windowed = true;
vid_default = MODE_WINDOWED;
}
else
{
- Cvar_Set ("vid_fullscreen", "1");
if (nummodes == 1)
Sys_Error ("No RGB fullscreen modes available");
@@ -1216,38 +1237,38 @@ void VID_Init (void)
info = SDL_GetVideoInfo();
modelist[MODE_FULLSCREEN_DEFAULT].width = info->current_w;
modelist[MODE_FULLSCREEN_DEFAULT].height = info->current_h;
+ modelist[MODE_FULLSCREEN_DEFAULT].bpp = info->vfmt->BitsPerPixel;
vid_default = MODE_FULLSCREEN_DEFAULT;
leavecurrentmode = 1;
}
else
{
+ width = vid_width.value;
+ height = vid_height.value;
+
p = COM_CheckParm("-width");
if (p && p < com_argc-1)
{
width = Q_atoi(com_argv[p+1]);
- }
- else
- {
- width = 800; // QuakeSpasm, was 640
- }
- p = COM_CheckParm("-bpp");
- if (p && p < com_argc-1)
- {
- bpp = Q_atoi(com_argv[p+1]);
- findbpp = 0;
- }
- else
- {
- bpp = 15;
- findbpp = 1;
+ if(!COM_CheckParm("-height"))
+ height = width * 3 / 4;
}
p = COM_CheckParm("-height");
if (p && p < com_argc-1)
+ {
height = Q_atoi(com_argv[p+1]);
+
+ if(!COM_CheckParm("-width"))
+ width = height * 4 / 3;
+ }
+
+ p = COM_CheckParm("-bpp");
+ if (p && p < com_argc-1)
+ bpp = Q_atoi(com_argv[p+1]);
else
- height = width * 3 / 4; // assume 4:3 aspect ratio
+ bpp = vid_bpp.value;
// if they want to force it, add the specified mode to the list
if (COM_CheckParm("-force") && (nummodes < MAX_MODE_LIST))
@@ -1282,70 +1303,53 @@ void VID_Init (void)
}
}
- done = 0;
+ vid_default = 0;
- do
+ // Try to find a mode with matching width, height and bpp
+ for (i = 1; i < nummodes; i++)
{
- p = COM_CheckParm("-height");
- if (p && p < com_argc-1)
+ if ((modelist[i].width == width) &&
+ (modelist[i].height == height) &&
+ (modelist[i].bpp == bpp))
{
- height = Q_atoi(com_argv[p+1]);
-
- for (i = 1, vid_default = 0; i < nummodes; i++)
- {
- if ((modelist[i].width == width) &&
- (modelist[i].height == height) &&
- (modelist[i].bpp == bpp))
- {
- vid_default = i;
- done = 1;
- break;
- }
- }
- }
- else
- {
- for (i = 1, vid_default = 0; i < nummodes; i++)
- {
- if ((modelist[i].width == width) && (modelist[i].bpp == bpp))
- {
- vid_default = i;
- done = 1;
- break;
- }
- }
+ vid_default = i;
+ break;
}
+ }
- if (!done)
- {
- if (findbpp)
- {
- switch (bpp)
- {
- case 15:
- bpp = 16;
- break;
- case 16:
- bpp = 32;
- break;
- case 32:
- bpp = 24;
- break;
- case 24:
- done = 1;
- break;
- }
- }
- else
- {
- done = 1;
- }
- }
- } while (!done);
-
+ // Try to find a mode with matching width and height
if (!vid_default)
{
- Sys_Error ("Specified video mode not available");
+ for (i = 1; i < nummodes; i++)
+ {
+ if ((modelist[i].width == width) &&
+ (modelist[i].height == height))
+ {
+ vid_default = i;
+ break;
+ }
+ }
+ }
+
+ // Try to find a mode with matching width
+ if (!vid_default)
+ {
+ for (i = 1; i < nummodes; i++)
+ {
+ if ((modelist[i].width == width))
+ {
+ vid_default = i;
+ break;
+ }
+ }
+ }
+
+ // Still no luck? Default to windowed mode
+ if (!vid_default)
+ {
+ Cvar_Set ("vid_fullscreen", "0");
+ windowed = true;
+ vid_default = MODE_WINDOWED;
}
}
}
@@ -1382,20 +1386,9 @@ void VID_Init (void)
VID_Gamma_Init(); //johnfitz
VID_Menu_Init(); //johnfitz
- //johnfitz -- command line vid settings should override config file settings.
+ //QuakeSpasm: current vid settings should override config file settings.
//so we have to lock the vid mode from now until after all config files are read.
- if (COM_CheckParm("-width") || COM_CheckParm("-height") ||
- COM_CheckParm("-bpp") ||
- COM_CheckParm("-window") || COM_CheckParm("-w") ||
- COM_CheckParm("-fullscreen") || COM_CheckParm("-f"))
- {
- vid_locked = true;
- }
- //johnfitz
-
- // The problem here is (say) previous video mode is 1024x768 windowed
- // And we call "fitzquake -w". This disables setting of 1024x768, and when video lock
- // is removed, we get 800x600.
+ vid_locked = true;
}
// new proc by S.A., called by alt-return key binding.
diff --git a/README.html b/README.html
index 775eccd3..3d98b154 100644
--- a/README.html
+++ b/README.html
@@ -11,7 +11,7 @@
-QuakeSpasm 0.85.5 (16 December 2011)
+QuakeSpasm 0.85.5 (20 December 2011)
@@ -162,6 +162,7 @@ Compile time options include
Fixed a crash in net play in maps with extended limits
Verified successful compilation using gcc-4.6
Added a cvar gl_zfix to stop GL texture flicker (z fighting)
+ Read video variables early so that a vid_restart isn't necessary after init
mlook and lookspring fixes
Added support for loading external entity files, controlled by new cvar external_ents.
Made mp3 playback to allocate system memory instead of zone
@@ -264,7 +265,6 @@ Compile time options include
Test usb keyboards. Do the keypads work? Make the OSX apple key work.
Complete the unix user directories support
Finalize OSX automatic updating feature
-There is still an unnecessary screen render on program init under some conditions, when using the "-window/-fullscreen" options.
diff --git a/README.sgml b/README.sgml
index 7f29e46a..02b04ac5 100644
--- a/README.sgml
+++ b/README.sgml
@@ -4,7 +4,7 @@
-QuakeSpasm 0.85.5 (16 December 2011)
+QuakeSpasm 0.85.5 (20 December 2011)
About
@@ -96,6 +96,7 @@ Alternatively, have a look at Makefile.darwin for more instructions on
- Fixed a crash in net play in maps with extended limits
- Verified successful compilation using gcc-4.6
- Added a cvar gl_zfix to stop GL texture flicker (z fighting)
+
- Read video variables early so that a vid_restart isn't necessary after init
- mlook and lookspring fixes
- Added support for loading external entity files, controlled by new cvar external_ents.
- Made mp3 playback to allocate system memory instead of zone
@@ -183,7 +184,6 @@ Alternatively, have a look at Makefile.darwin for more instructions on
- Test usb keyboards. Do the keypads work? Make the OSX apple key work.
- Complete the unix user directories support
- Finalize OSX automatic updating feature
-
- There is still an unnecessary screen render on program init under some conditions, when using the "-window/-fullscreen" options.
diff --git a/README.txt b/README.txt
index 50f99d63..0ebbb184 100644
--- a/README.txt
+++ b/README.txt
@@ -29,7 +29,7 @@
______________________________________________________________________
- QuakeSpasm 0.85.5 (16 December 2011)
+ QuakeSpasm 0.85.5 (20 December 2011)
1. About
@@ -165,6 +165,9 @@
o Added a cvar gl_zfix to stop GL texture flicker (z fighting)
+ o Read video variables early so that a vid_restart isn't necessary
+ after init
+
o mlook and lookspring fixes
o Added support for loading external entity files, controlled by new
@@ -327,9 +330,6 @@
o Finalize OSX automatic updating feature
- o There is still an unnecessary screen render on program init under
- some conditions, when using the "-window/-fullscreen" options.
-
7. Links