Skip to content

Commit

Permalink
Use $XDG_CONFIG_HOME for config files if poosible
Browse files Browse the repository at this point in the history
Fallback to com_gamedir. Also detriplicate code for finding the path of
the config file.
Change Signature for Sys_HomeDirectory since it's no longer const.
  • Loading branch information
mcz committed Oct 29, 2022
1 parent 01312e2 commit 3faf681
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 48 deletions.
2 changes: 1 addition & 1 deletion cl_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2915,7 +2915,7 @@ static void AuthUsernameChanged(cvar_t* var, char* value, qbool* cancel)
strlcpy(filename, value, sizeof(filename));
COM_ForceExtensionEx(filename, ".apikey", sizeof(filename));

Cfg_GetConfigPath(path, sizeof(path), filename);
Cfg_GetConfigPath(path, sizeof(path), filename, cfg_use_home.integer);

auth_token = FS_LoadTempFile(path, &auth_token_length);
if (auth_token == 0) {
Expand Down
69 changes: 32 additions & 37 deletions config_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -798,6 +798,15 @@ static void ResetConfigs(qbool explicit_reset, qbool read_legacy_configs)

void Cfg_GetConfigPath(char* path, size_t max_length, const char* name)
{
char *configdir;
#ifdef _WIN32
configdir = com_homedir;
#else
configdir = getenv("XDG_CONFIG_HOME");
if (!configdir)
configdir = com_homedir;
#endif

const char* default_gamedir = (cfg_use_home.integer ? "" : "ezquake");
const char* base_directory = (cfg_use_home.integer ? com_homedir : com_basedir);

Expand Down Expand Up @@ -1032,8 +1041,8 @@ qbool LoadCfg(FILE *f)
example how it works
=== ./ezquake -game testmod -config testcfg
homedir/testmod/testcfg.cfg (fullname)
homedir/testcfg.cfg (fullname_moddefault)
homedir/testmod/testcfg.cfg
homedir/testcfg.cfg
quakedir/testmod/configs/testcfg.cfg
quakedir/ezquake/configs/testcfg.cfg
built-in ezquake config
Expand All @@ -1043,59 +1052,45 @@ void LoadConfig_f(void)
FILE *f = NULL;
char filename[MAX_PATH] = {0},
fullname[MAX_PATH] = {0},
fullname_moddefault[MAX_PATH] = {0},
*arg1;
int use_home;
int use_home, use_gamedir;

arg1 = COM_SkipPathWritable(Cmd_Argv(1));

snprintf(filename, sizeof(filename) - 4, "%s", arg1[0] ? arg1 : MAIN_CONFIG_FILENAME); // use config.cfg if no params was specified


COM_ForceExtensionEx (filename, ".cfg", sizeof (filename));
use_home = cfg_use_home.integer || !host_everything_loaded;

// home
snprintf(fullname, sizeof(fullname), "%s/%s%s", com_homedir, (strcmp(com_gamedirfile, "qw") == 0) ? "" : va("%s/", com_gamedirfile), filename);
snprintf(fullname_moddefault, sizeof(fullname_moddefault), "%s/%s", com_homedir, filename);

if (use_home) {
if (cfg_use_gamedir.integer) {
f = fopen(fullname, "rb");
}
if (f == NULL) {
f = fopen(fullname_moddefault, "rb");
}
if (f == NULL) {
use_home = false;
}
}

// basedir
snprintf(fullname, sizeof(fullname), "%s/%s/configs/%s", com_basedir, (strcmp(com_gamedirfile, "qw") == 0) ? "ezquake" : com_gamedirfile, filename);
snprintf(fullname_moddefault, sizeof(fullname_moddefault), "%s/ezquake/configs/%s", com_basedir, filename);
//save state of config vars
use_home = cfg_use_home.integer || !host_everything_loaded;
use_gamedir = cfg_use_gamedir.integer;

if(!use_home) {
if (cfg_use_gamedir.integer) {
f = fopen(fullname, "rb");
}
if (f == NULL) {
f = fopen(fullname_moddefault, "rb");
}
}
cf_use_home.integer = use_home || !host_everything_loaded;

if (f == NULL) {
Com_Printf("Couldn't load %s %s\n", filename, (cfg_use_gamedir.integer) ? "(using gamedir search)" : "(not using gamedir search)");
return;
while (!(f = fopen(Cfg_GetConfigPath(fullname, sizeof (fullname), filename), "rb"))) {
if (!(use_home || use_gamedir))
Com_Printf("Couldn't load %s %s\n", filename, (cfg_use_gamedir.integer) ? "(using gamedir search)" : "(not using gamedir search)");
cfg_use_gamedir.integer = use_gamedir;
cfg_use_home.integer = use_homedir;
return;
if (cfg_use_gamedir.integer)
cfg_use_gamedir.integer = 0;
continue;
cfg_use_home.integer = false;
cfg_use_gamedir.integer = use_gamedir;
}

con_suppress = true;
ResetConfigs(false, true);
con_suppress = false;

if(use_home)
Com_Printf("Loading %s%s (Using Home Directory) ...\n", (strcmp(com_gamedirfile, "qw") == 0) ? "" : va("%s/",com_gamedirfile), filename);
Com_Printf("Loading %s (Using Home Directory) ...\n", fullename);
else
Com_Printf("Loading %s/configs/%s ...\n", (strcmp(com_gamedirfile, "qw") == 0) ? "ezquake" : com_gamedirfile, filename);
Com_Printf("Loading %s ...\n", fullename);

cfg_use_home.integer = use_homedir;

Cbuf_AddText ("cl_warncmd 0\n");

Expand Down
2 changes: 1 addition & 1 deletion fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,7 @@ void FS_AddUserDirectory(char *dir)
case 3: snprintf(com_userdir, sizeof(com_userdir), "%s/qw/%s", com_basedir, userdirfile); break;
case 4: snprintf(com_userdir, sizeof(com_userdir), "%s/%s", com_basedir, userdirfile); break;
case 5: {
const char* homedir;
char* homedir;
#ifdef _WIN32
homedir = Sys_HomeDirectory();
#else
Expand Down
7 changes: 2 additions & 5 deletions menu_options.c
Original file line number Diff line number Diff line change
Expand Up @@ -615,12 +615,9 @@ extern cvar_t cfg_backup, cfg_save_aliases, cfg_save_binds, cfg_save_cmdline,

void MOpt_ImportConfig(void) {
MOpt_configpage_mode = MOCPM_CHOOSECONFIG;
char path[MAX_OSPATH];

// hope few doubled trinary operator won't hurt your brains
if (cfg_use_home.integer)
FL_SetCurrentDir(&configs_filelist, (cfg_use_gamedir.integer) ? va("%s/%s", com_homedir, (strcmp(com_gamedirfile, "qw") == 0) ? "" : com_gamedirfile) : com_homedir);
else
FL_SetCurrentDir(&configs_filelist, (cfg_use_gamedir.integer) ? va("%s/%s/configs", com_basedir, (strcmp(com_gamedirfile, "qw") == 0) ? "ezquake" : com_gamedirfile) : va("%s/ezquake/configs", com_basedir));
FL_SetCurrentDir(&configs_filelist, Cfg_GetConfigPath(path, sizeof (path), ""))
}
void MOpt_ExportConfig(void) {
MOpt_configpage_mode = MOCPM_ENTERFILENAME;
Expand Down
3 changes: 2 additions & 1 deletion sys.h
Original file line number Diff line number Diff line change
Expand Up @@ -217,4 +217,5 @@ void *Sys_GetAddressForName(dllhandle_t *module, const char *exportname);
void Sys_CvarInit(void);

const char* Sys_FontsDirectory(void);
const char* Sys_HomeDirectory(void);
// Directoy for User's data files. returns string allocated with malloc. Must be freed.
char* Sys_HomeDirectory(void);
4 changes: 2 additions & 2 deletions sys_posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -735,7 +735,7 @@ const char* Sys_FontsDirectory(void)
return sys_fontsdir.string;
}

const char* Sys_HomeDirectory(void)
char* Sys_HomeDirectory(void)
{
char *ev, *buf;
if (!(ev = getenv("XDG_DATA_HOME"))) {
Expand Down Expand Up @@ -767,7 +767,7 @@ void Sys_RegisterQWURLProtocol_f(void)
char open_cmd[MAX_PATH*2+1024] = { 0 };
char exe_path[MAX_PATH] = { 0 };
char buf[MAX_PATH] = { 0 };
const char *homedir = Sys_HomeDirectory();
char *homedir = Sys_HomeDirectory();
int nchar = -1;
FILE *fptr;

Expand Down
2 changes: 1 addition & 1 deletion sys_win.c
Original file line number Diff line number Diff line change
Expand Up @@ -1654,7 +1654,7 @@ const char* Sys_FontsDirectory(void)
return path;
}

const char* Sys_HomeDirectory(void)
char* Sys_HomeDirectory(void)
{
char path[MAX_OSPATH], *res;

Expand Down

0 comments on commit 3faf681

Please sign in to comment.