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 #include -#define CACHE ".dmenu_cache" +#ifdef XDGBASEDIR + #include + #include + #include + + #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 +}