diff options
author | Nitroretro <nitroretro@protonmail.com> | 2019-12-17 02:34:42 +0200 |
---|---|---|
committer | Lukas Fleischer <lfleischer@calcurse.org> | 2019-12-23 13:16:39 -0500 |
commit | 04162de6ddcdbc5c1b2410f4f5f7dbae72cc62d9 (patch) | |
tree | 1b457c9db93f05f5103c3520316a8ef56c0b9aba /src | |
parent | 250a233ff7aea152284e62e99b8ca09a0e032699 (diff) | |
download | calcurse-04162de6ddcdbc5c1b2410f4f5f7dbae72cc62d9.tar.gz calcurse-04162de6ddcdbc5c1b2410f4f5f7dbae72cc62d9.zip |
Add XDG Base Directory Support
* Use "$XDG_DATA_HOME/calcurse" for data files
* Use "$XDG_CONFIG_HOME/calcurse" for config files
* "$XDG_DATA_HOME" defaults to "$HOME/.local/share"
* "$XDG_CONFIG_HOME" defaults to "$HOME/.config"
* If "$HOME/.calcurse" exists, then it will be used instead for backward
compatibility.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/calcurse.h | 3 | ||||
-rw-r--r-- | src/io.c | 43 |
2 files changed, 37 insertions, 9 deletions
diff --git a/src/calcurse.h b/src/calcurse.h index 39f46b7..e41bc32 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -84,7 +84,8 @@ #endif /* ENABLE_NLS */ /* Paths configuration. */ -#define DIR_NAME ".calcurse/" +#define DIR_NAME "calcurse/" +#define DIR_NAME_LEGACY ".calcurse/" #define TODO_PATH_NAME "todo" #define APTS_PATH_NAME "apts" #define CONF_PATH_NAME "conf" @@ -143,17 +143,44 @@ unsigned io_fprintln(const char *fname, const char *fmt, ...) */ void io_init(const char *cfile, const char *datadir, const char *confdir) { - if (!datadir) { - if (!(datadir = getenv("HOME"))) - datadir = "."; - asprintf(&path_ddir, "%s%s", datadir, "/" DIR_NAME); - } else - asprintf(&path_ddir, "%s%s", datadir, "/"); + char* home_dir = getenv("HOME"); + char* legacy_dir = NULL; + + if (home_dir) { + asprintf(&legacy_dir, "%s%s", home_dir, "/" DIR_NAME_LEGACY); + if (!io_dir_exists(legacy_dir)) { + mem_free(legacy_dir); + legacy_dir = NULL; + } + } - if (!confdir) - asprintf(&path_cdir, "%s%s", path_ddir, "/"); + if (datadir) + asprintf(&path_ddir, "%s%s", datadir, "/"); + else if (legacy_dir) + path_ddir = mem_strdup(legacy_dir); + else if ((path_ddir = getenv("XDG_DATA_HOME"))) + asprintf(&path_ddir, "%s%s", path_ddir, "/" DIR_NAME); + else if (home_dir) + asprintf(&path_ddir, "%s%s", home_dir, "/.local/share/" DIR_NAME); else + path_ddir = mem_strdup("./." DIR_NAME); + + + if (confdir) asprintf(&path_cdir, "%s%s", confdir, "/"); + else if (datadir) + path_cdir = mem_strdup(path_ddir); + else if (legacy_dir) + path_cdir = mem_strdup(legacy_dir); + else if ((path_cdir = getenv("XDG_CONFIG_HOME"))) + asprintf(&path_cdir, "%s%s", path_cdir, "/" DIR_NAME); + else if (home_dir) + asprintf(&path_cdir, "%s%s", home_dir, "/.config/" DIR_NAME); + else + path_cdir = mem_strdup("./." DIR_NAME); + + if (legacy_dir) + mem_free(legacy_dir); /* Data files */ if (cfile) { |