From 3faf6816b8fd344622b065c99d732a2db5c8e159 Mon Sep 17 00:00:00 2001 From: Mikau Date: Sat, 29 Oct 2022 02:57:48 +0200 Subject: [PATCH] Use $XDG_CONFIG_HOME for config files if poosible 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. --- cl_main.c | 2 +- config_manager.c | 69 ++++++++++++++++++++++-------------------------- fs.c | 2 +- menu_options.c | 7 ++--- sys.h | 3 ++- sys_posix.c | 4 +-- sys_win.c | 2 +- 7 files changed, 41 insertions(+), 48 deletions(-) diff --git a/cl_main.c b/cl_main.c index 308c70434..359303491 100644 --- a/cl_main.c +++ b/cl_main.c @@ -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) { diff --git a/config_manager.c b/config_manager.c index 8e94e5797..1a8ab39dd 100644 --- a/config_manager.c +++ b/config_manager.c @@ -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); @@ -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 @@ -1043,49 +1052,33 @@ 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; @@ -1093,9 +1086,11 @@ void LoadConfig_f(void) 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"); diff --git a/fs.c b/fs.c index 57029595c..cb6768672 100644 --- a/fs.c +++ b/fs.c @@ -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 diff --git a/menu_options.c b/menu_options.c index cb940d6a3..1a755be65 100644 --- a/menu_options.c +++ b/menu_options.c @@ -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; diff --git a/sys.h b/sys.h index 509f23a8e..5c45b4ef5 100644 --- a/sys.h +++ b/sys.h @@ -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); diff --git a/sys_posix.c b/sys_posix.c index 9c887be39..d977d6ab7 100644 --- a/sys_posix.c +++ b/sys_posix.c @@ -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"))) { @@ -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; diff --git a/sys_win.c b/sys_win.c index 69330cb02..aebd2bec6 100644 --- a/sys_win.c +++ b/sys_win.c @@ -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;