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)

1. About

@@ -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