mirror of
https://git.code.sf.net/p/quake/quakeforge-old
synced 2025-02-19 02:00:46 +00:00
Cvar aliasing code, so we don't tick off Tonik (and other users) every time
we rename a standard cvar. Example of use in in_x11.c. Make the alias directly after the Cvar_Get to avoid segfaults.
This commit is contained in:
parent
17270f94ba
commit
d5e5b07ac9
3 changed files with 90 additions and 11 deletions
|
@ -51,6 +51,7 @@
|
|||
cvar_t *cvar_vars;
|
||||
char *cvar_null_string = "";
|
||||
cvar_t *developer;
|
||||
cvar_alias_t *calias_vars;
|
||||
|
||||
/*
|
||||
============
|
||||
|
@ -68,6 +69,44 @@ cvar_t *Cvar_FindVar (char *var_name)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
cvar_t *Cvar_FindAlias (char *alias_name)
|
||||
{
|
||||
cvar_alias_t *alias;
|
||||
|
||||
for (alias = calias_vars ; alias ; alias=alias->next)
|
||||
if (!Q_strcmp (alias_name, alias->name))
|
||||
return alias->cvar;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cvar_t *Cvar_Alias_Get (char *name, cvar_t *cvar)
|
||||
{
|
||||
cvar_alias_t *alias;
|
||||
cvar_t *var;
|
||||
|
||||
if (Cmd_Exists (name))
|
||||
{
|
||||
Con_Printf ("CAlias_Get: %s is a command\n", name);
|
||||
return NULL;
|
||||
}
|
||||
if (Cvar_FindVar(name))
|
||||
{
|
||||
Con_Printf ("CAlias_Get: tried to alias used cvar name %s\n",name);
|
||||
return NULL;
|
||||
}
|
||||
var = Cvar_FindAlias(name);
|
||||
if (!var)
|
||||
{
|
||||
alias = (cvar_alias_t *) malloc(sizeof(cvar_alias_t));
|
||||
alias->next = calias_vars;
|
||||
calias_vars = alias;
|
||||
alias->name = strdup(name);
|
||||
alias->cvar = cvar;
|
||||
return alias->cvar;
|
||||
}
|
||||
return var;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_VariableValue
|
||||
|
@ -78,6 +117,8 @@ float Cvar_VariableValue (char *var_name)
|
|||
cvar_t *var;
|
||||
|
||||
var = Cvar_FindVar (var_name);
|
||||
if (!var)
|
||||
var = Cvar_FindAlias(var_name);
|
||||
if (!var)
|
||||
return 0;
|
||||
return Q_atof (var->string);
|
||||
|
@ -94,6 +135,8 @@ char *Cvar_VariableString (char *var_name)
|
|||
cvar_t *var;
|
||||
|
||||
var = Cvar_FindVar (var_name);
|
||||
if (!var)
|
||||
var = Cvar_FindAlias(var_name);
|
||||
if (!var)
|
||||
return cvar_null_string;
|
||||
return var->string;
|
||||
|
@ -108,7 +151,8 @@ Cvar_CompleteVariable
|
|||
char *Cvar_CompleteVariable (char *partial)
|
||||
{
|
||||
cvar_t *cvar;
|
||||
int len;
|
||||
cvar_alias_t *alias;
|
||||
int len;
|
||||
|
||||
len = Q_strlen(partial);
|
||||
|
||||
|
@ -119,12 +163,22 @@ char *Cvar_CompleteVariable (char *partial)
|
|||
for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
|
||||
if (!strcmp (partial,cvar->name))
|
||||
return cvar->name;
|
||||
|
||||
// check aliases too :)
|
||||
for (alias=calias_vars ; alias ; alias=alias->next)
|
||||
if (!strcmp (partial, alias->name))
|
||||
return alias->name;
|
||||
|
||||
// check partial match
|
||||
for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
|
||||
if (!Q_strncmp (partial,cvar->name, len))
|
||||
return cvar->name;
|
||||
|
||||
// check aliases too :)
|
||||
for (alias=calias_vars ; alias ; alias=alias->next)
|
||||
if (!Q_strncmp (partial, alias->name, len))
|
||||
return alias->name;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -210,6 +264,8 @@ qboolean Cvar_Command (void)
|
|||
|
||||
// check variables
|
||||
v = Cvar_FindVar (Cmd_Argv(0));
|
||||
if (!v)
|
||||
v = Cvar_FindAlias (Cmd_Argv(0));
|
||||
if (!v)
|
||||
return false;
|
||||
|
||||
|
@ -256,6 +312,8 @@ void Cvar_Set_f(void)
|
|||
var_name = Cmd_Argv (1);
|
||||
value = Cmd_Argv (2);
|
||||
var = Cvar_FindVar (var_name);
|
||||
if (!var)
|
||||
var = Cvar_FindAlias (var_name);
|
||||
if (var)
|
||||
{
|
||||
Cvar_Set (var, value);
|
||||
|
@ -278,6 +336,8 @@ void Cvar_Toggle_f (void)
|
|||
}
|
||||
|
||||
var = Cvar_FindVar (Cmd_Argv(1));
|
||||
if (!var)
|
||||
var = Cvar_FindAlias(Cmd_Argv(1));
|
||||
if (!var)
|
||||
{
|
||||
Con_Printf ("Unknown variable \"%s\"\n", Cmd_Argv(1));
|
||||
|
@ -289,7 +349,7 @@ void Cvar_Toggle_f (void)
|
|||
|
||||
void Cvar_Help_f (void)
|
||||
{
|
||||
char *cvar_name;
|
||||
char *var_name;
|
||||
cvar_t *var;
|
||||
|
||||
if (Cmd_Argc() != 2)
|
||||
|
@ -298,11 +358,13 @@ void Cvar_Help_f (void)
|
|||
return;
|
||||
}
|
||||
|
||||
cvar_name = Cmd_Argv (1);
|
||||
if((var = Cvar_FindVar(cvar_name)) != NULL)
|
||||
var_name = Cmd_Argv (1);
|
||||
var = Cvar_FindVar (var_name);
|
||||
if (!var)
|
||||
var = Cvar_FindAlias (var_name);
|
||||
if (var)
|
||||
{
|
||||
Con_Printf ("description: %s\nvalue: %s\n",var->description,
|
||||
var->string);
|
||||
Con_Printf ("%s\n",var->description);
|
||||
return;
|
||||
}
|
||||
Con_Printf ("variable not found\n");
|
||||
|
@ -333,7 +395,9 @@ void Cvar_Init()
|
|||
void Cvar_Shutdown (void)
|
||||
{
|
||||
cvar_t *var,*next;
|
||||
cvar_alias_t *alias,*nextalias;
|
||||
|
||||
// Free cvars
|
||||
var = cvar_vars;
|
||||
while(var)
|
||||
{
|
||||
|
@ -344,6 +408,15 @@ void Cvar_Shutdown (void)
|
|||
free(var);
|
||||
var = next;
|
||||
}
|
||||
// Free aliases
|
||||
alias = calias_vars;
|
||||
while(alias)
|
||||
{
|
||||
nextalias = alias->next;
|
||||
free(alias->name);
|
||||
free(alias);
|
||||
alias = nextalias;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -40,14 +40,17 @@ typedef struct cvar_s
|
|||
char *string;
|
||||
int flags;
|
||||
char *description; // for "help" command
|
||||
// qboolean archive; // set to true to cause it to be saved to vars.rc
|
||||
// qboolean info; // added to serverinfo or userinfo when changed
|
||||
// qboolean server; // notifies players when changed (UQUAKE)
|
||||
// qboolean heap; // allocated off the heap, safe to free
|
||||
float value;
|
||||
float value;
|
||||
struct cvar_s *next;
|
||||
} cvar_t;
|
||||
|
||||
typedef struct cvar_alias_s
|
||||
{
|
||||
char *name;
|
||||
cvar_t *cvar;
|
||||
struct cvar_alias_s *next;
|
||||
} cvar_alias_t;
|
||||
|
||||
#define CVAR_NONE 0
|
||||
#define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc
|
||||
// used for system variables, not for player
|
||||
|
@ -78,6 +81,8 @@ typedef struct cvar_s
|
|||
|
||||
cvar_t *Cvar_Get (char *name, char *value, int cvarflags, char *description);
|
||||
|
||||
cvar_t *Cvar_Alias_Get (char *name, cvar_t *cvar);
|
||||
|
||||
void Cvar_Set (cvar_t *var, char *value);
|
||||
// equivelant to "<name> <variable>" typed at the console
|
||||
|
||||
|
|
|
@ -458,6 +458,7 @@ IN_Init(void)
|
|||
}
|
||||
|
||||
in_grab = Cvar_Get ("in_grab","0",CVAR_ARCHIVE,"None");
|
||||
Cvar_Alias_Get ("_windowed_mouse", in_grab);
|
||||
m_filter = Cvar_Get ("m_filter","0",CVAR_ARCHIVE,"None");
|
||||
#ifdef HAS_DGA
|
||||
vid_dga_mouseaccel = Cvar_Get ("vid_dga_mouseaccel","1",CVAR_ARCHIVE,
|
||||
|
|
Loading…
Reference in a new issue