From 04162de6ddcdbc5c1b2410f4f5f7dbae72cc62d9 Mon Sep 17 00:00:00 2001
From: Nitroretro <nitroretro@protonmail.com>
Date: Tue, 17 Dec 2019 02:34:42 +0200
Subject: 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>
---
 src/calcurse.h |  3 ++-
 src/io.c       | 43 +++++++++++++++++++++++++++++++++++--------
 2 files changed, 37 insertions(+), 9 deletions(-)

(limited to 'src')

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"
diff --git a/src/io.c b/src/io.c
index 668afc6..5333d66 100644
--- a/src/io.c
+++ b/src/io.c
@@ -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) {
-- 
cgit v1.2.3-70-g09d2