From 1e9329ccf69aecdc3dec5d0ec47070b368811941 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Mon, 12 Apr 2021 22:09:09 +0900 Subject: [PATCH] [nq,qw] Stop wring to config.cfg QF now uses its own configuration file (quakeforge.cfg for now) rather than overwriting config.cfg so that people trying out QF in their normal quake installs don't trash their config.cfg for other quake clients. If quakeforge.cfg is present, all other config files are ignored except that quake.rc is scanned for a startdemos command and that is executed. --- include/QF/cmd.h | 2 +- include/QF/qargs.h | 4 ++- libs/util/cmd.c | 7 ++-- libs/util/qargs.c | 65 +++++++++++++++++++++++++++------ nq/source/cl_main.c | 11 +++--- nq/source/host.c | 32 ++--------------- qtv/source/qtv.c | 2 +- qw/source/cl_main.c | 69 ++++++++++-------------------------- qw/source/sv_main.c | 2 +- ruamoko/qwaq/builtins/main.c | 2 +- ruamoko/qwaq/builtins/qwaq.c | 2 +- 11 files changed, 93 insertions(+), 105 deletions(-) diff --git a/include/QF/cmd.h b/include/QF/cmd.h index 3cd74432b..b57e8ca15 100644 --- a/include/QF/cmd.h +++ b/include/QF/cmd.h @@ -79,7 +79,7 @@ int Cmd_Command (struct cbuf_args_s *args); int Cmd_ExecuteString (const char *text, cmd_source_t src); struct cbuf_s; void Cmd_StuffCmds (struct cbuf_s *cbuf); -void Cmd_Exec_File (struct cbuf_s *cbuf, const char *path, int qfs); +int Cmd_Exec_File (struct cbuf_s *cbuf, const char *path, int qfs); void Cmd_AddProvider(const char *name, struct cbuf_interpreter_s *interp); struct cbuf_interpreter_s *Cmd_GetProvider(const char *name); diff --git a/include/QF/qargs.h b/include/QF/qargs.h index bf49495a4..89ce6902c 100644 --- a/include/QF/qargs.h +++ b/include/QF/qargs.h @@ -48,7 +48,9 @@ void COM_AddParm (const char *parm); void COM_Init (void); void COM_Init_Cvars (void); void COM_InitArgv (int argc, const char **argv); -void COM_ParseConfig (void); +struct cbuf_s; +void COM_ParseConfig (struct cbuf_s *cbuf); +void COM_ExecConfig (struct cbuf_s *cbuf, int skip_quakerc); ///@} diff --git a/libs/util/cmd.c b/libs/util/cmd.c index ffc6a14e6..c3e2c20c4 100644 --- a/libs/util/cmd.c +++ b/libs/util/cmd.c @@ -497,6 +497,7 @@ Cmd_Help_f (void) Sys_Printf ("variable/command not found\n"); } + static void Cmd_Exec_f (void) { @@ -649,7 +650,7 @@ Cmd_ExecuteString (const char *text, cmd_source_t src) return 0; } -VISIBLE void +VISIBLE int Cmd_Exec_File (cbuf_t *cbuf, const char *path, int qfs) { char *f; @@ -657,7 +658,7 @@ Cmd_Exec_File (cbuf_t *cbuf, const char *path, int qfs) QFile *file; if (!path || !*path) - return; + return 0; if (qfs) { file = QFS_FOpenFile (path); } else { @@ -675,7 +676,9 @@ Cmd_Exec_File (cbuf_t *cbuf, const char *path, int qfs) free (f); } Qclose (file); + return 1; } + return 0; } VISIBLE void diff --git a/libs/util/qargs.c b/libs/util/qargs.c index 7f385e5a1..b1d6510db 100644 --- a/libs/util/qargs.c +++ b/libs/util/qargs.c @@ -46,8 +46,10 @@ #include "QF/cvar.h" #include "QF/idparse.h" #include "QF/qargs.h" +#include "QF/quakefs.h" #include "QF/qtypes.h" #include "QF/sys.h" +#include "QF/va.h" cvar_t *fs_globalcfg; cvar_t *fs_usercfg; @@ -151,20 +153,13 @@ COM_AddParm (const char *parm) } void -COM_ParseConfig (void) +COM_ParseConfig (cbuf_t *cbuf) { - cbuf_t *cbuf; - - cbuf = Cbuf_New (&id_interp); - // execute +set as early as possible Cmd_StuffCmds (cbuf); Cbuf_Execute_Sets (cbuf); - // execute the global configuration file if it exists - // would have been nice if Cmd_Exec_f could have been used, but it - // reads from only within the quake file system, and changing that is - // probably Not A Good Thing (tm). + // execute set commands in the global configuration file if it exists fs_globalcfg = Cvar_Get ("fs_globalcfg", FS_GLOBALCFG, CVAR_ROM, NULL, "global configuration file"); Cmd_Exec_File (cbuf, fs_globalcfg->string, 0); @@ -174,6 +169,7 @@ COM_ParseConfig (void) Cmd_StuffCmds (cbuf); Cbuf_Execute_Sets (cbuf); + // execute set commands in the user configuration file if it exists fs_usercfg = Cvar_Get ("fs_usercfg", FS_USERCFG, CVAR_ROM, NULL, "user configuration file"); Cmd_Exec_File (cbuf, fs_usercfg->string, 0); @@ -182,6 +178,53 @@ COM_ParseConfig (void) // execute +set again to override the config file Cmd_StuffCmds (cbuf); Cbuf_Execute_Sets (cbuf); - - Cbuf_Delete (cbuf); +} + +static int +check_quakerc (const char *cmd, cbuf_t *cbuf) +{ + const char *l, *p; + int ret = 0; + QFile *f; + + f = QFS_FOpenFile ("quake.rc"); + while (f && (l = Qgetline (f))) { + if ((p = strstr (l, cmd))) { + if (p == l) { + if (cbuf) { + Cbuf_AddText (cbuf, l); + } + ret = 1; + break; + } + } + } + Qclose (f); + return ret; +} + +void +COM_ExecConfig (cbuf_t *cbuf, int skip_quakerc) +{ + // quakeforge.cfg overrides quake.rc as it contains quakeforge-specific + // commands. If it doesn't exist, then this is the first time quakeforge + // has been used in this installation, thus any existing legacy config + // should be used to set up defaults on the assumption that the user has + // things set up to work with another (hopefully compatible) client + if (Cmd_Exec_File (cbuf, "quakeforge.cfg", 1)) { + Cmd_Exec_File (cbuf, fs_usercfg->string, 0); + Cmd_StuffCmds (cbuf); + check_quakerc ("startdemos", cbuf); + } else { + if (!skip_quakerc) { + Cbuf_InsertText (cbuf, "exec quake.rc\n"); + } + Cmd_Exec_File (cbuf, fs_usercfg->string, 0); + // Reparse the command line for + commands. + // (sets still done, but it doesn't matter) + // (Note, no non-base commands exist yet) + if (skip_quakerc || !check_quakerc ("stuffcmds", 0)) { + Cmd_StuffCmds (cbuf); + } + } } diff --git a/nq/source/cl_main.c b/nq/source/cl_main.c index d95aef4c7..88b7a78bb 100644 --- a/nq/source/cl_main.c +++ b/nq/source/cl_main.c @@ -103,21 +103,20 @@ client_state_t cl; static void CL_WriteConfiguration (void) { - QFile *f; - // dedicated servers initialize the host but don't parse and set the // config.cfg cvars if (host_initialized && !isDedicated && cl_writecfg->int_val) { - const char *path = va (0, "%s/config.cfg", qfs_gamedir->dir.def); - f = QFS_WOpen (path, 0); + const char *path = va (0, "%s/quakeforge.cfg", qfs_gamedir->dir.def); + QFile *f = QFS_WOpen (path, 0); + if (!f) { - Sys_Printf ("Couldn't write config.cfg.\n"); + Sys_Printf ("Couldn't write quakeforge.cfg.\n"); return; } Key_WriteBindings (f); - Cvar_WriteVariables (f); Joy_WriteBindings (f); + Cvar_WriteVariables (f); Qclose (f); } diff --git a/nq/source/host.c b/nq/source/host.c index 6f815ebf9..9f6b098d0 100644 --- a/nq/source/host.c +++ b/nq/source/host.c @@ -808,28 +808,6 @@ Host_InitVCR (quakeparms_t *parms) } -static int -check_quakerc (void) -{ - const char *l, *p; - int ret = 1; - QFile *f; - - f = QFS_FOpenFile ("quake.rc"); - if (!f) - return 1; - while ((l = Qgetline (f))) { - if ((p = strstr (l, "stuffcmds"))) { - if (p == l) { // only known case so far - ret = 0; - break; - } - } - } - Qclose (f); - return ret; -} - static void Host_Init_Memory (void) { @@ -886,7 +864,7 @@ Host_Init (void) Sys_Init (); GIB_Init (true); - COM_ParseConfig (); + COM_ParseConfig (host_cbuf); Host_Init_Memory (); @@ -926,13 +904,7 @@ Host_Init (void) CL_UpdateScreen (cl.time); CL_UpdateScreen (cl.time); - if (!isDedicated && cl_quakerc->int_val) - Cbuf_InsertText (host_cbuf, "exec quake.rc\n"); - Cmd_Exec_File (host_cbuf, fs_usercfg->string, 0); - // reparse the command line for + commands other than set - // (sets still done, but it doesn't matter) - if (isDedicated || !cl_quakerc->int_val || check_quakerc ()) - Cmd_StuffCmds (host_cbuf); + COM_ExecConfig (host_cbuf, isDedicated || !cl_quakerc->int_val); Hunk_AllocName (0, "-HOST_HUNKLEVEL-"); host_hunklevel = Hunk_LowMark (); diff --git a/qtv/source/qtv.c b/qtv/source/qtv.c index 0348198f8..d1da80448 100644 --- a/qtv/source/qtv.c +++ b/qtv/source/qtv.c @@ -255,7 +255,7 @@ qtv_init (void) Sys_RegisterShutdown (qtv_shutdown, 0); Sys_Init (); - COM_ParseConfig (); + COM_ParseConfig (qtv_cbuf); Cvar_Get ("cmd_warncmd", "1", CVAR_NONE, NULL, NULL); qtv_memory_init (); diff --git a/qw/source/cl_main.c b/qw/source/cl_main.c index e2deb673b..7199dbb38 100644 --- a/qw/source/cl_main.c +++ b/qw/source/cl_main.c @@ -72,6 +72,7 @@ #include "QF/draw.h" #include "QF/image.h" #include "QF/input.h" +#include "QF/joystick.h" #include "QF/keys.h" #include "QF/model.h" #include "QF/msg.h" @@ -1505,26 +1506,20 @@ Host_Error (const char *error, ...) } } -/* - Host_WriteConfiguration - - Writes key bindings and archived cvars to config.cfg -*/ void Host_WriteConfiguration (void) { - QFile *f; - if (host_initialized && cl_writecfg->int_val) { - const char *path = va (0, "%s/config.cfg", qfs_gamedir->dir.def); + const char *path = va (0, "%s/quakeforge.cfg", qfs_gamedir->dir.def); + QFile *f = QFS_WOpen (path, 0); - f = QFS_WOpen (path, 0); if (!f) { - Sys_Printf ("Couldn't write config.cfg.\n"); + Sys_Printf ("Couldn't write quakeforge.cfg.\n"); return; } Key_WriteBindings (f); + Joy_WriteBindings (f); Cvar_WriteVariables (f); Qclose (f); @@ -1713,28 +1708,6 @@ Host_Frame (float time) fps_count++; } -static int -check_quakerc (void) -{ - const char *l, *p; - int ret = 1; - QFile *f; - - f = QFS_FOpenFile ("quake.rc"); - if (!f) - return 1; - while ((l = Qgetline (f))) { - if ((p = strstr (l, "stuffcmds"))) { - if (p == l) { // only known case so far - ret = 0; - break; - } - } - } - Qclose (f); - return ret; -} - static void CL_Init_Memory (void) { @@ -1773,19 +1746,21 @@ CL_Init_Memory (void) static void CL_Autoexec (int phase) { - int cmd_warncmd_val = cmd_warncmd->int_val; - if (!phase) return; - Cbuf_AddText (cl_cbuf, "cmd_warncmd 0\n"); - Cbuf_AddText (cl_cbuf, "exec config.cfg\n"); - Cbuf_AddText (cl_cbuf, "exec frontend.cfg\n"); + if (!Cmd_Exec_File (cl_cbuf, "quakeforge.cfg", 1)) { + int cmd_warncmd_val = cmd_warncmd->int_val; + + Cbuf_AddText (cl_cbuf, "cmd_warncmd 0\n"); + Cbuf_AddText (cl_cbuf, "exec config.cfg\n"); + Cbuf_AddText (cl_cbuf, "exec frontend.cfg\n"); + + Cbuf_AddText (cl_cbuf, va (0, "cmd_warncmd %d\n", cmd_warncmd_val)); + } if (cl_autoexec->int_val) { Cbuf_AddText (cl_cbuf, "exec autoexec.cfg\n"); } - - Cbuf_AddText (cl_cbuf, va (0, "cmd_warncmd %d\n", cmd_warncmd_val)); } void @@ -1796,7 +1771,7 @@ Host_Init (void) Sys_Init (); GIB_Init (true); - COM_ParseConfig (); + COM_ParseConfig (cl_cbuf); CL_Init_Memory (); @@ -1837,13 +1812,10 @@ Host_Init (void) CL_UpdateScreen (realtime); CL_UpdateScreen (realtime); - if (cl_quakerc->int_val) - Cbuf_InsertText (cl_cbuf, "exec quake.rc\n"); - Cmd_Exec_File (cl_cbuf, fs_usercfg->string, 0); - // Reparse the command line for + commands. - // (Note, no non-base commands exist yet) - if (!cl_quakerc->int_val || check_quakerc ()) - Cmd_StuffCmds (cl_cbuf); + COM_ExecConfig (cl_cbuf, !cl_quakerc->int_val); + + // make sure all + commands have been executed + Cbuf_Execute_Stack (cl_cbuf); Hunk_AllocName (0, "-HOST_HUNKLEVEL-"); host_hunklevel = Hunk_LowMark (); @@ -1853,9 +1825,6 @@ Host_Init (void) Sys_Printf ("\x80\x81\x81\x82 %s initialized \x80\x81\x81\x82\n", PACKAGE_NAME); - // make sure all + commands have been executed - Cbuf_Execute_Stack (cl_cbuf); - host_initialized = true; CL_UpdateScreen (realtime); diff --git a/qw/source/sv_main.c b/qw/source/sv_main.c index 9a540af08..30e2709c1 100644 --- a/qw/source/sv_main.c +++ b/qw/source/sv_main.c @@ -2488,7 +2488,7 @@ SV_Init (void) Sys_Init (); GIB_Init (true); - COM_ParseConfig (); + COM_ParseConfig (sv_cbuf); Cvar_Get ("cmd_warncmd", "1", CVAR_NONE, NULL, NULL); diff --git a/ruamoko/qwaq/builtins/main.c b/ruamoko/qwaq/builtins/main.c index 8c8ec0f69..4404294dc 100644 --- a/ruamoko/qwaq/builtins/main.c +++ b/ruamoko/qwaq/builtins/main.c @@ -134,7 +134,7 @@ init_qf (void) qwaq_cbuf = Cbuf_New (&id_interp); Sys_Init (); - COM_ParseConfig (); + COM_ParseConfig (qwaq_cbuf); //Cvar_Set (developer, "1"); diff --git a/ruamoko/qwaq/builtins/qwaq.c b/ruamoko/qwaq/builtins/qwaq.c index fa18d01b1..00a7ca135 100644 --- a/ruamoko/qwaq/builtins/qwaq.c +++ b/ruamoko/qwaq/builtins/qwaq.c @@ -110,7 +110,7 @@ init_qf (void) Sys_Init (); GIB_Init (true); - COM_ParseConfig (); + COM_ParseConfig (qwaq_cbuf); //Cvar_Set (developer, "1");