mirror of
https://git.code.sf.net/p/quake/quakeforge-old
synced 2025-05-31 09:21:23 +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;
|
cvar_t *cvar_vars;
|
||||||
char *cvar_null_string = "";
|
char *cvar_null_string = "";
|
||||||
cvar_t *developer;
|
cvar_t *developer;
|
||||||
|
cvar_alias_t *calias_vars;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
|
@ -68,6 +69,44 @@ cvar_t *Cvar_FindVar (char *var_name)
|
||||||
return NULL;
|
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
|
Cvar_VariableValue
|
||||||
|
@ -78,6 +117,8 @@ float Cvar_VariableValue (char *var_name)
|
||||||
cvar_t *var;
|
cvar_t *var;
|
||||||
|
|
||||||
var = Cvar_FindVar (var_name);
|
var = Cvar_FindVar (var_name);
|
||||||
|
if (!var)
|
||||||
|
var = Cvar_FindAlias(var_name);
|
||||||
if (!var)
|
if (!var)
|
||||||
return 0;
|
return 0;
|
||||||
return Q_atof (var->string);
|
return Q_atof (var->string);
|
||||||
|
@ -94,6 +135,8 @@ char *Cvar_VariableString (char *var_name)
|
||||||
cvar_t *var;
|
cvar_t *var;
|
||||||
|
|
||||||
var = Cvar_FindVar (var_name);
|
var = Cvar_FindVar (var_name);
|
||||||
|
if (!var)
|
||||||
|
var = Cvar_FindAlias(var_name);
|
||||||
if (!var)
|
if (!var)
|
||||||
return cvar_null_string;
|
return cvar_null_string;
|
||||||
return var->string;
|
return var->string;
|
||||||
|
@ -108,7 +151,8 @@ Cvar_CompleteVariable
|
||||||
char *Cvar_CompleteVariable (char *partial)
|
char *Cvar_CompleteVariable (char *partial)
|
||||||
{
|
{
|
||||||
cvar_t *cvar;
|
cvar_t *cvar;
|
||||||
int len;
|
cvar_alias_t *alias;
|
||||||
|
int len;
|
||||||
|
|
||||||
len = Q_strlen(partial);
|
len = Q_strlen(partial);
|
||||||
|
|
||||||
|
@ -119,12 +163,22 @@ char *Cvar_CompleteVariable (char *partial)
|
||||||
for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
|
for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
|
||||||
if (!strcmp (partial,cvar->name))
|
if (!strcmp (partial,cvar->name))
|
||||||
return 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
|
// check partial match
|
||||||
for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
|
for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
|
||||||
if (!Q_strncmp (partial,cvar->name, len))
|
if (!Q_strncmp (partial,cvar->name, len))
|
||||||
return cvar->name;
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,6 +264,8 @@ qboolean Cvar_Command (void)
|
||||||
|
|
||||||
// check variables
|
// check variables
|
||||||
v = Cvar_FindVar (Cmd_Argv(0));
|
v = Cvar_FindVar (Cmd_Argv(0));
|
||||||
|
if (!v)
|
||||||
|
v = Cvar_FindAlias (Cmd_Argv(0));
|
||||||
if (!v)
|
if (!v)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -256,6 +312,8 @@ void Cvar_Set_f(void)
|
||||||
var_name = Cmd_Argv (1);
|
var_name = Cmd_Argv (1);
|
||||||
value = Cmd_Argv (2);
|
value = Cmd_Argv (2);
|
||||||
var = Cvar_FindVar (var_name);
|
var = Cvar_FindVar (var_name);
|
||||||
|
if (!var)
|
||||||
|
var = Cvar_FindAlias (var_name);
|
||||||
if (var)
|
if (var)
|
||||||
{
|
{
|
||||||
Cvar_Set (var, value);
|
Cvar_Set (var, value);
|
||||||
|
@ -278,6 +336,8 @@ void Cvar_Toggle_f (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
var = Cvar_FindVar (Cmd_Argv(1));
|
var = Cvar_FindVar (Cmd_Argv(1));
|
||||||
|
if (!var)
|
||||||
|
var = Cvar_FindAlias(Cmd_Argv(1));
|
||||||
if (!var)
|
if (!var)
|
||||||
{
|
{
|
||||||
Con_Printf ("Unknown variable \"%s\"\n", Cmd_Argv(1));
|
Con_Printf ("Unknown variable \"%s\"\n", Cmd_Argv(1));
|
||||||
|
@ -289,7 +349,7 @@ void Cvar_Toggle_f (void)
|
||||||
|
|
||||||
void Cvar_Help_f (void)
|
void Cvar_Help_f (void)
|
||||||
{
|
{
|
||||||
char *cvar_name;
|
char *var_name;
|
||||||
cvar_t *var;
|
cvar_t *var;
|
||||||
|
|
||||||
if (Cmd_Argc() != 2)
|
if (Cmd_Argc() != 2)
|
||||||
|
@ -298,11 +358,13 @@ void Cvar_Help_f (void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cvar_name = Cmd_Argv (1);
|
var_name = Cmd_Argv (1);
|
||||||
if((var = Cvar_FindVar(cvar_name)) != NULL)
|
var = Cvar_FindVar (var_name);
|
||||||
|
if (!var)
|
||||||
|
var = Cvar_FindAlias (var_name);
|
||||||
|
if (var)
|
||||||
{
|
{
|
||||||
Con_Printf ("description: %s\nvalue: %s\n",var->description,
|
Con_Printf ("%s\n",var->description);
|
||||||
var->string);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Con_Printf ("variable not found\n");
|
Con_Printf ("variable not found\n");
|
||||||
|
@ -333,7 +395,9 @@ void Cvar_Init()
|
||||||
void Cvar_Shutdown (void)
|
void Cvar_Shutdown (void)
|
||||||
{
|
{
|
||||||
cvar_t *var,*next;
|
cvar_t *var,*next;
|
||||||
|
cvar_alias_t *alias,*nextalias;
|
||||||
|
|
||||||
|
// Free cvars
|
||||||
var = cvar_vars;
|
var = cvar_vars;
|
||||||
while(var)
|
while(var)
|
||||||
{
|
{
|
||||||
|
@ -344,6 +408,15 @@ void Cvar_Shutdown (void)
|
||||||
free(var);
|
free(var);
|
||||||
var = next;
|
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;
|
char *string;
|
||||||
int flags;
|
int flags;
|
||||||
char *description; // for "help" command
|
char *description; // for "help" command
|
||||||
// qboolean archive; // set to true to cause it to be saved to vars.rc
|
float value;
|
||||||
// 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;
|
|
||||||
struct cvar_s *next;
|
struct cvar_s *next;
|
||||||
} cvar_t;
|
} 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_NONE 0
|
||||||
#define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc
|
#define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc
|
||||||
// used for system variables, not for player
|
// 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_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);
|
void Cvar_Set (cvar_t *var, char *value);
|
||||||
// equivelant to "<name> <variable>" typed at the console
|
// 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");
|
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");
|
m_filter = Cvar_Get ("m_filter","0",CVAR_ARCHIVE,"None");
|
||||||
#ifdef HAS_DGA
|
#ifdef HAS_DGA
|
||||||
vid_dga_mouseaccel = Cvar_Get ("vid_dga_mouseaccel","1",CVAR_ARCHIVE,
|
vid_dga_mouseaccel = Cvar_Get ("vid_dga_mouseaccel","1",CVAR_ARCHIVE,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue