diff --git a/commandline.cpp b/commandline.cpp index e1e63fc8..a1ebdb5c 100644 --- a/commandline.cpp +++ b/commandline.cpp @@ -61,13 +61,37 @@ EX void initializeCLI() { #endif #ifdef FHS - static string sbuf, cbuf; - if(getenv("HOME")) { - sbuf = getenv("HOME"); sbuf += "/."; sbuf += scorefile; - cbuf = getenv("HOME"); cbuf += "/."; cbuf += conffile; - scorefile = sbuf; - conffile = cbuf.c_str(); - } + auto try_place = [&] (string env, string suffix, string& which_file, bool only_file) { + char *res = getenv(env.c_str()); + if(!res) return false; + string buf = res; buf += suffix; buf += "/hyperrogue"; + if(only_file && file_exists(buf + "/" + which_file)) { + which_file = buf + "/" + which_file; + return true; + } + if(!file_exists(buf)) system(("mkdir -p " +buf).c_str()); + which_file = buf + "/" + which_file; + return true; + }; + + auto try_dot = [&] (string& which_file) { + char *res = getenv("HOME"); + string buf = res; + buf += "/."; buf += which_file; + if(!file_exists(buf)) return false; + which_file = buf; + return true; + }; + + if(try_dot(scorefile)) {} + else if(try_place("XDG_DATA_HOME", "", scorefile, true)) {} + else if(try_place("HOME", "/.local/share", scorefile, false)) {} + else if(try_place("XDG_DATA_HOME", "", scorefile, false)) {} + + if(try_dot(conffile)) {} + else if(try_place("XDG_CONFIG_HOME", "", conffile, true)) {} + else if(try_place("HOME", "/.config", conffile, true)) {} + else if(try_place("XDG_CONFIG_HOME", "", conffile, false)) {} #endif } diff --git a/config.cpp b/config.cpp index 685c6c47..5f88d2e7 100644 --- a/config.cpp +++ b/config.cpp @@ -918,7 +918,7 @@ EX shared_ptr param_colortable(colortable& val, const paramete EX ld bounded_mine_percentage = 0.1; EX int bounded_mine_quantity, bounded_mine_max; -EX const char *conffile = "hyperrogue.ini"; +EX string conffile = "hyperrogue.ini"; /* extra space if more geometries are added */ EX array sightranges; @@ -2058,7 +2058,7 @@ EX debugflag debug_init_config = {"init_config", true}; EX void saveConfig() { indenter_finish(debug_init_config, "saveConfig"); - FILE *f = fopen(conffile, "wt"); + FILE *f = fopen(conffile.c_str(), "wt"); if(!f) { addMessage(s0 + "Could not open the config file: " + conffile); return; @@ -2131,7 +2131,7 @@ EX void loadConfig() { indenter_finish(debug_init_config, "loadConfig"); vid.xres = 9999; vid.yres = 9999; vid.framelimit = 999; - FILE *f = fopen(conffile, "rt"); + FILE *f = fopen(conffile.c_str(), "rt"); if(f) { int err; int fs; @@ -4185,7 +4185,7 @@ EX void resetConfigMenu() { if(uni == 'd') { resetConfig(); - unlink(conffile); + unlink(conffile.c_str()); popScreen(); } else if(uni == 'y') {