From 3e4cb8b74cb236070bbfa2edfbbd40eecc993852 Mon Sep 17 00:00:00 2001 From: havoc Date: Fri, 9 Jun 2006 17:30:56 +0000 Subject: [PATCH] changed cvar default setup code such that cvar default strings are locked after executing default.cfg the first time (that is to say, their current values are copied into their default strings at this point), this fixes unsaved cvar problems in nexuiz caused by the default string being out of date on cvars that were modified by default.cfg changed Reset To Defaults option in menu to use a newly added cvar_resettodefaults_all command before execing default.cfg to reset the binds git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6454 d7cf8633-e32d-0410-b094-e92efae38249 --- cmd.c | 13 +++++++++++- cvar.c | 58 ++++++++++++++++++++++++++++++++++++++++++++---------- cvar.h | 5 +++++ host_cmd.c | 6 +++--- menu.c | 2 +- 5 files changed, 69 insertions(+), 15 deletions(-) diff --git a/cmd.c b/cmd.c index 7f2a113a..af439a66 100644 --- a/cmd.c +++ b/cmd.c @@ -281,6 +281,12 @@ static void Cmd_Exec_f (void) } Con_DPrintf("execing %s\n",Cmd_Argv(1)); + // if executing default.cfg for the first time, lock the cvar defaults + // it may seem backwards to insert this text BEFORE the default.cfg + // but Cbuf_InsertText inserts before, so this actually ends up after it. + if (!strcmp(Cmd_Argv(1), "default.cfg")) + Cbuf_InsertText("\ncvar_lockdefaults\n"); + Cbuf_InsertText (f); Mem_Free(f); } @@ -323,7 +329,7 @@ static void Cmd_Toggle_f(void) { // Correct Arguments Specified // Acquire Potential CVar cvar_t* cvCVar = Cvar_FindVar( Cmd_Argv(1) ); - + if(cvCVar != NULL) { // Valid CVar if(nNumArgs == 2) @@ -661,6 +667,11 @@ void Cmd_Init_Commands (void) Cmd_AddCommand ("cmdlist", Cmd_List_f, "lists all console commands beginning with the specified prefix"); Cmd_AddCommand ("cvarlist", Cvar_List_f, "lists all console variables beginning with the specified prefix"); + Cmd_AddCommand ("cvar_lockdefaults", Cvar_LockDefaults_f, "stores the current values of all cvars into their default values, only used once during startup after parsing default.cfg"); + Cmd_AddCommand ("cvar_resettodefaults_all", Cvar_ResetToDefaults_All_f, "sets all cvars to their locked default values"); + Cmd_AddCommand ("cvar_resettodefaults_nosaveonly", Cvar_ResetToDefaults_NoSaveOnly_f, "sets all non-saved cvars to their locked default values (variables that will not be saved to config.cfg)"); + Cmd_AddCommand ("cvar_resettodefaults_saveonly", Cvar_ResetToDefaults_SaveOnly_f, "sets all saved cvars to their locked default values (variables that will be saved to config.cfg)"); + // DRESK - 5/14/06 // Support Doom3-style Toggle Command Cmd_AddCommand( "toggle", Cmd_Toggle_f, "toggles a console variable's values (use for more info)"); diff --git a/cvar.c b/cvar.c index 704f658d..fb08b237 100644 --- a/cvar.c +++ b/cvar.c @@ -416,15 +416,6 @@ cvar_t *Cvar_Get (const char *name, const char *value, int flags) { cvar->flags |= flags; Cvar_SetQuick_Internal (cvar, value); - // also set the default value (but only once) - if (~cvar->flags & CVAR_DEFAULTSET) - { - cvar->flags |= CVAR_DEFAULTSET; - - Z_Free(cvar->defstring); - cvar->defstring = (char *)Z_Malloc(strlen(value) + 1); - strcpy(cvar->defstring, value); - } return cvar; } @@ -438,7 +429,7 @@ cvar_t *Cvar_Get (const char *name, const char *value, int flags) // allocate a new cvar, cvar name, and cvar string // FIXME: these never get Z_Free'd cvar = (cvar_t *)Z_Malloc(sizeof(cvar_t)); - cvar->flags = flags | CVAR_ALLOCATED | CVAR_DEFAULTSET; + cvar->flags = flags | CVAR_ALLOCATED; cvar->name = (char *)Z_Malloc(strlen(name)+1); strcpy(cvar->name, name); cvar->string = (char *)Z_Malloc(strlen(value)+1); @@ -506,6 +497,53 @@ qboolean Cvar_Command (void) } +void Cvar_LockDefaults_f (void) +{ + cvar_t *var; + // lock in the default values of all cvars + for (var = cvar_vars ; var ; var = var->next) + { + if (!(var->flags & CVAR_DEFAULTSET)) + { + //Con_Printf("locking cvar %s (%s -> %s)\n", var->name, var->string, var->defstring); + var->flags |= CVAR_DEFAULTSET; + Z_Free(var->defstring); + var->defstring = (char *)Z_Malloc(strlen(var->string) + 1); + strcpy(var->defstring, var->string); + } + } +} + + +void Cvar_ResetToDefaults_All_f (void) +{ + cvar_t *var; + // restore the default values of all cvars + for (var = cvar_vars ; var ; var = var->next) + Cvar_SetQuick(var, var->defstring); +} + + +void Cvar_ResetToDefaults_NoSaveOnly_f (void) +{ + cvar_t *var; + // restore the default values of all cvars + for (var = cvar_vars ; var ; var = var->next) + if (!(var->flags & CVAR_SAVE)) + Cvar_SetQuick(var, var->defstring); +} + + +void Cvar_ResetToDefaults_SaveOnly_f (void) +{ + cvar_t *var; + // restore the default values of all cvars + for (var = cvar_vars ; var ; var = var->next) + if (var->flags & CVAR_SAVE) + Cvar_SetQuick(var, var->defstring); +} + + /* ============ Cvar_WriteVariables diff --git a/cvar.h b/cvar.h index de379f8f..49470bd9 100644 --- a/cvar.h +++ b/cvar.h @@ -165,6 +165,11 @@ qboolean Cvar_Command (void); // command. Returns true if the command was a variable reference that // was handled. (print or change) +void Cvar_LockDefaults_f (void); +void Cvar_ResetToDefaults_All_f (void); +void Cvar_ResetToDefaults_NoSaveOnly_f (void); +void Cvar_ResetToDefaults_SaveOnly_f (void); + void Cvar_WriteVariables (qfile_t *f); // Writes lines containing "set variable value" for all variables // with the archive flag set to true. diff --git a/host_cmd.c b/host_cmd.c index 56864d05..51528b19 100644 --- a/host_cmd.c +++ b/host_cmd.c @@ -918,7 +918,7 @@ void Host_Playerskin_f (void) if (cmd_source == src_command) { Cvar_Set ("_cl_playerskin", newPath); - CL_SetInfo("playermodel", newPath, true, false, false, false); + CL_SetInfo("playerskin", newPath, true, false, false, false); return; } @@ -938,8 +938,8 @@ void Host_Playerskin_f (void) PRVM_GETEDICTFIELDVALUE(host_client->edict, eval_playerskin)->string = PRVM_SetEngineString(host_client->playerskin); if (strcmp(host_client->old_skin, host_client->playerskin)) { - if (host_client->spawned) - SV_BroadcastPrintf("%s changed skin to %s\n", host_client->name, host_client->playerskin); + //if (host_client->spawned) + // SV_BroadcastPrintf("%s changed skin to %s\n", host_client->name, host_client->playerskin); strcpy(host_client->old_skin, host_client->playerskin); /*// send notification to all clients MSG_WriteByte (&sv.reliable_datagram, svc_updatepskin); diff --git a/menu.c b/menu.c index 630d0c34..45236a68 100644 --- a/menu.c +++ b/menu.c @@ -2730,7 +2730,7 @@ static void M_Reset_Key (int key, char ascii) { case 'Y': case 'y': - Cbuf_AddText ("exec default.cfg\n"); + Cbuf_AddText ("cvar_resettodefaults_all;exec default.cfg\n"); // no break here since we also exit the menu case K_ESCAPE: -- 2.39.2