Hi all,
Attached is a patch to dmenu_path which (if enabled in the config.mk)
changes the cache file location to be XDG Base Directory Specification
compliant. After enabling the change, the cache file will live at
$XDG_CACHE_HOME/dmenu/path.cache (or $HOME/.cache/dmenu/path.cache if
$XDG_CACHE_HOME is not set), rather than in the home directory at
~/.dmenu_cache.
This patch relies on libxdg-basedir [2] being installed.
Thanks for dmenu!
--
- Jon Raphaelson
[1] http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
[2] http://repo.or.cz/w/libxdg-basedir.git
diff -r 2b9683c50723 config.mk
--- a/config.mk Wed Dec 01 20:25:10 2010 +0000
+++ b/config.mk Thu Dec 30 12:37:58 2010 -0700
@@ -14,12 +14,16 @@
XINERAMALIBS = -lXinerama
XINERAMAFLAGS = -DXINERAMA
+# XDG path stuff, comment if you don't want it
+XDGBASEDIRLIBS = "-lxdg-basedir"
+XDGBASEDIRFLAGS = "-DXDGBASEDIR"
+
# includes and libs
INCS = -I${X11INC}
-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${XDGBASEDIRLIBS}
# flags
-CPPFLAGS = -D_BSD_SOURCE -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
+CPPFLAGS = -D_BSD_SOURCE -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} ${XDGBASEDIRFLAGS}
CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
LDFLAGS = -s ${LIBS}
diff -r 2b9683c50723 dmenu_path.c
--- a/dmenu_path.c Wed Dec 01 20:25:10 2010 +0000
+++ b/dmenu_path.c Thu Dec 30 12:37:58 2010 -0700
@@ -7,12 +7,24 @@
#include <unistd.h>
#include <sys/stat.h>
-#define CACHE ".dmenu_cache"
+#ifdef XDGBASEDIR
+ #include <basedir.h>
+ #include <basedir_fs.h>
+ #include <errno.h>
+
+ #define CACHEDIR "/dmenu"
+ #define CACHEFILE "/path.cache"
+
+ static char *cachefile;
+#else
+ #define CACHE ".dmenu_cache"
+#endif
static void die(const char *s);
static int qstrcmp(const void *a, const void *b);
static void scan(void);
static int uptodate(void);
+static const char * getCacheFile(void);
static char **items = NULL;
static const char *home, *path;
@@ -26,7 +38,7 @@
if(chdir(home) < 0)
die("chdir failed");
if(uptodate()) {
- execlp("cat", "cat", CACHE, NULL);
+ execlp("cat", "cat", getCacheFile(), NULL);
die("exec failed");
}
scan();
@@ -71,7 +83,7 @@
closedir(dp);
}
qsort(items, count, sizeof *items, qstrcmp);
- if(!(cache = fopen(CACHE, "w")))
+ if(!(cache = fopen(getCacheFile(), "w")))
die("open failed");
for(i = 0; i < count; i++) {
if(i > 0 && !strcmp(items[i], items[i-1]))
@@ -89,7 +101,7 @@
time_t mtime;
struct stat st;
- if(stat(CACHE, &st) < 0)
+ if(stat(getCacheFile(), &st) < 0)
return 0;
mtime = st.st_mtime;
if(!(p = strdup(path)))
@@ -100,3 +112,33 @@
free(p);
return 1;
}
+
+const char *
+getCacheFile(void) {
+#ifdef XDGBASEDIR
+ if (cachefile == NULL) {
+ xdgHandle* handle;
+ char cachepath[256];
+
+ handle = xdgInitHandle(malloc(sizeof(xdgHandle)));
+
+ strncpy(cachepath, xdgCacheHome(handle), 256);
+ strcat(cachepath, CACHEDIR);
+
+ int ret = xdgMakePath(cachepath, 0755);
+ if (ret < 0 && errno != EEXIST) {
+ perror("couldn't make path");
+ exit(errno);
+ }
+
+ strcat(cachepath, CACHEFILE);
+
+ cachefile = malloc(strlen(cachepath) * sizeof(char));
+ strncpy(cachefile, cachepath, strlen(cachepath));
+ }
+
+ return cachefile;
+#else
+ return CACHE;
+#endif
+}