From 304fd382db98a6a134e0e281cc6f4cf27fb0789a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bert=20M=C3=BCnnich?= Date: Sat, 11 Jan 2014 22:47:41 +0100 Subject: [PATCH] Adhere to XDG Base Directory Specification; fixes issue #124 --- Makefile | 2 +- README.md | 2 +- exec/image-info | 2 +- exec/key-handler | 2 +- main.c | 54 +++++++++++++++++++++++------------------------- sxiv.1 | 7 +++---- thumbs.c | 13 +++++++----- 7 files changed, 41 insertions(+), 41 deletions(-) diff --git a/Makefile b/Makefile index e6b3740..d9ae9bd 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION = git-20140109 +VERSION = git-20140111 PREFIX = /usr/local MANPREFIX = $(PREFIX)/share/man diff --git a/README.md b/README.md index 7ac00fb..b403a05 100644 --- a/README.md +++ b/README.md @@ -212,7 +212,7 @@ on GitHub or get a copy using git with the following command: **[v0.8](https://github.com/muennich/sxiv/archive/v0.8.tar.gz)** *(April 18, 2011)* - * Support for thumbnail caching, only enabled if directory `~/.sxiv/` exists + * Support for thumbnail caching * Ability to run external commands (e.g. jpegtran, convert) on current image **[v0.7](https://github.com/muennich/sxiv/archive/v0.7.tar.gz)** diff --git a/exec/image-info b/exec/image-info index 6eebe42..f839a36 100644 --- a/exec/image-info +++ b/exec/image-info @@ -1,6 +1,6 @@ #!/bin/sh -# Example for ~/.sxiv/exec/image-info +# Example for $XDG_CONFIG_HOME/sxiv/exec/image-info # Called by sxiv(1) whenever an image gets loaded, # with the name of the image file as its first argument. # The output is displayed in sxiv's status bar. diff --git a/exec/key-handler b/exec/key-handler index 3912825..f4de310 100644 --- a/exec/key-handler +++ b/exec/key-handler @@ -1,6 +1,6 @@ #!/bin/sh -# Example for ~/.sxiv/exec/key-handler +# Example for $XDG_CONFIG_HOME/sxiv/exec/key-handler # Called by sxiv(1) whenever an unbound key combo is used, # with the key combo as its first argument and the path of the current image # as its second argument. diff --git a/main.c b/main.c index fecde63..9fe0010 100644 --- a/main.c +++ b/main.c @@ -47,13 +47,6 @@ enum { TITLE_LEN = 256 }; -#define EXEC_REL_DIR ".sxiv/exec" - -enum { - EXEC_INFO, - EXEC_KEY -}; - typedef struct { const char *name; char *cmd; @@ -85,11 +78,6 @@ int prefix; bool resized = false; -exec_t exec[] = { - { "image-info", NULL }, - { "key-handler", NULL } -}; - struct { char *cmd; int fd; @@ -97,6 +85,8 @@ struct { bool open; } info; +char * keyhandler; + timeout_t timeouts[] = { { { 0, 0 }, false, redraw }, { { 0, 0 }, false, reset_cursor }, @@ -455,14 +445,14 @@ void clear_resize(void) resized = false; } -void key_handler(const char *key, unsigned int mask) +void run_key_handler(const char *key, unsigned int mask) { pid_t pid; int retval, status, n = mode == MODE_IMAGE ? fileidx : tns.sel; - char *cmd = exec[EXEC_KEY].cmd, kstr[32]; + char kstr[32]; struct stat oldst, newst; - if (cmd == NULL || key == NULL) + if (keyhandler == NULL || key == NULL) return; snprintf(kstr, sizeof(kstr), "%s%s%s%s", @@ -473,7 +463,7 @@ void key_handler(const char *key, unsigned int mask) stat(files[n].path, &oldst); if ((pid = fork()) == 0) { - execl(cmd, cmd, kstr, files[n].path, NULL); + execl(keyhandler, keyhandler, kstr, files[n].path, NULL); warn("could not exec key handler"); exit(EXIT_FAILURE); } else if (pid < 0) { @@ -556,7 +546,7 @@ void on_keypress(XKeyEvent *kev) } } if (i == ARRLEN(keys)) - key_handler(XKeysymToString(ksym), kev->state & ~sh); + run_key_handler(XKeysymToString(ksym), kev->state & ~sh); prefix = 0; } @@ -736,7 +726,7 @@ int main(int argc, char **argv) size_t n; ssize_t len; char *filename; - const char *homedir; + const char *homedir, *dsuffix = ""; struct stat fstats; r_dir_t dir; @@ -812,19 +802,27 @@ int main(int argc, char **argv) win_init(&win); img_init(&img, &win); - if ((homedir = getenv("HOME")) == NULL) { - warn("could not locate home directory"); - } else for (i = 0; i < ARRLEN(exec); i++) { - len = strlen(homedir) + strlen(EXEC_REL_DIR) + strlen(exec[i].name) + 3; - exec[i].cmd = (char*) s_malloc(len); - snprintf(exec[i].cmd, len, "%s/%s/%s", homedir, EXEC_REL_DIR, exec[i].name); - if (access(exec[i].cmd, X_OK) != 0) { - free(exec[i].cmd); - exec[i].cmd = NULL; + if ((homedir = getenv("XDG_CONFIG_HOME")) == NULL || homedir[0] == '\0') { + homedir = getenv("HOME"); + dsuffix = "/.config"; + } + if (homedir != NULL) { + char **cmd[] = { &info.cmd, &keyhandler }; + const char *name[] = { "image-info", "key-handler" }; + + for (i = 0; i < ARRLEN(cmd); i++) { + len = strlen(homedir) + strlen(dsuffix) + strlen(name[i]) + 12; + *cmd[i] = (char*) s_malloc(len); + snprintf(*cmd[i], len, "%s%s/sxiv/exec/%s", homedir, dsuffix, name[i]); + if (access(*cmd[i], X_OK) != 0) { + free(*cmd[i]); + *cmd[i] = NULL; + } } + } else { + warn("could not locate exec directory"); } info.fd = -1; - info.cmd = exec[EXEC_INFO].cmd; if (options->thumb_mode) { mode = MODE_THUMB; diff --git a/sxiv.1 b/sxiv.1 index 9442edb..f6d47f2 100644 --- a/sxiv.1 +++ b/sxiv.1 @@ -353,14 +353,14 @@ Pan image right. The information displayed on the left side of the status bar can be replaced with the output of a user-provided script, which is called by sxiv whenever an image gets loaded. The path of this script is -.I ~/.sxiv/exec/image-info +.I $XDG_CONFIG_HOME/sxiv/exec/image-info and the first argument to this script is the path of the loaded image. .P There is also an example script installed together with sxiv as .IR PREFIX/share/sxiv/exec/image-info . .SH THUMBNAIL CACHING To enable thumbnail caching, please make sure to create the directory -.I ~/.sxiv/cache/ +.I $XDG_CACHE_HOME/sxiv/ with write permissions. sxiv will then store all thumbnails inside this directory, but it will not create this directory by itself. It rather uses the existance of this directory as an affirmation, that the user wants thumbnails @@ -377,7 +377,7 @@ find . \-depth \-type d \-empty ! \-name '.' \-exec rmdir {} \\; .RE .SH AUTHOR .EX -Bert Muennich +Bert Muennich .EE .SH CONTRIBUTORS .EX @@ -387,7 +387,6 @@ Fung SzeTat .EE .SH HOMEPAGE .EX -http://muennich.github.com/sxiv https://github.com/muennich/sxiv .EE .SH SEE ALSO diff --git a/thumbs.c b/thumbs.c index 2090102..fe0ad84 100644 --- a/thumbs.c +++ b/thumbs.c @@ -34,7 +34,6 @@ static const int thumb_dim = THUMB_SIZE + 10; -static const char * const CACHE_DIR = ".sxiv/cache"; static char *cache_dir = NULL; bool tns_cache_enabled(void) @@ -163,7 +162,7 @@ void tns_clean_cache(tns_t *tns) void tns_init(tns_t *tns, int cnt, win_t *win) { int len; - char *homedir; + const char *homedir, *dsuffix = ""; if (tns == NULL) return; @@ -181,12 +180,16 @@ void tns_init(tns_t *tns, int cnt, win_t *win) tns->alpha = !RENDER_WHITE_ALPHA; tns->dirty = false; - if ((homedir = getenv("HOME")) != NULL) { + if ((homedir = getenv("XDG_CACHE_HOME")) == NULL || homedir[0] == '\0') { + homedir = getenv("HOME"); + dsuffix = "/.cache"; + } + if (homedir != NULL) { if (cache_dir != NULL) free(cache_dir); - len = strlen(homedir) + strlen(CACHE_DIR) + 2; + len = strlen(homedir) + strlen(dsuffix) + 6; cache_dir = (char*) s_malloc(len); - snprintf(cache_dir, len, "%s/%s", homedir, CACHE_DIR); + snprintf(cache_dir, len, "%s%s/sxiv", homedir, dsuffix); } else { warn("could not locate thumbnail cache directory"); }