# HG changeset patch # User zas_ # Date 1226780234 0 # Node ID c4fcf8001574da4ad515edc909dca56b498e7888 # Parent 95860439070b0ecf79ff98fb0b3bb66d096544ec Implement preliminary support for XDG Base Directory Specification. See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html. This feature was requested for a long time (feature requests #1950978 and #2289481). For now, it is disabled since it breaks compatibility with previous versions. To be able to test it, you have to enable it by defining USE_XDG to 1 in main.h. geeqierc and other conf files are going to: $XDG_CONFIG_HOME/geeqie/ (default to $HOME/.config/geeqie/). metadata and thumbnails cache (if std is not used) are going to: $XDG_CACHE_HOME/geeqie/metadata/ (default to $HOME/.cache/geeqie/metadata/) and $XDG_CACHE_HOME/geeqie/thumbnails/ (default to $HOME/.cache/geeqie/thumbnails/) collections are going to: $XDG_DATA_HOME/geeqie/collections/ (default to $HOME/.local/share/geeqie/collections/) Please test and report any issue. diff -r 95860439070b -r c4fcf8001574 src/cache.c --- a/src/cache.c Sat Nov 15 20:01:25 2008 +0000 +++ b/src/cache.c Sat Nov 15 20:17:14 2008 +0000 @@ -767,7 +767,15 @@ if (thumbnails_cache_dir) return thumbnails_cache_dir; - thumbnails_cache_dir = g_build_filename(get_rc_dir(), GQ_CACHE_THUMB, NULL); + if (USE_XDG) + { + thumbnails_cache_dir = g_build_filename(xdg_cache_home_get(), GQ_APPNAME_LC, GQ_CACHE_THUMB, NULL); + } + else + { + thumbnails_cache_dir = g_build_filename(get_rc_dir(), GQ_CACHE_THUMB, NULL); + } + return thumbnails_cache_dir; } @@ -777,7 +785,15 @@ if (metadata_cache_dir) return metadata_cache_dir; - metadata_cache_dir = g_build_filename(get_rc_dir(), GQ_CACHE_METADATA, NULL); + if (USE_XDG) + { + metadata_cache_dir = g_build_filename(xdg_cache_home_get(), GQ_APPNAME_LC, GQ_CACHE_METADATA, NULL); + } + else + { + metadata_cache_dir = g_build_filename(get_rc_dir(), GQ_CACHE_METADATA, NULL); + } + return metadata_cache_dir; } diff -r 95860439070b -r c4fcf8001574 src/main.h --- a/src/main.h Sat Nov 15 20:01:25 2008 +0000 +++ b/src/main.h Sat Nov 15 20:17:14 2008 +0000 @@ -64,6 +64,8 @@ *---------------------------------------------------------------------------- */ +#define USE_XDG 0 + #define GQ_APPNAME "Geeqie" #define GQ_APPNAME_LC "geeqie" #define GQ_WEBSITE "geeqie.sourceforge.net" diff -r 95860439070b -r c4fcf8001574 src/ui_fileops.c --- a/src/ui_fileops.c Sat Nov 15 20:01:25 2008 +0000 +++ b/src/ui_fileops.c Sat Nov 15 20:17:14 2008 +0000 @@ -186,14 +186,66 @@ return home; } +static gchar *xdg_dir_get(const gchar *key, const gchar *fallback) +{ + gchar *dir = getenv(key); + + if (!dir || dir[0] == '\0') + { + return g_build_filename(homedir(), fallback, NULL); + } + + return path_to_utf8(dir); +} + +const gchar *xdg_data_home_get(void) +{ + static const gchar *xdg_data_home = NULL; + + if (xdg_data_home) return xdg_data_home; + + xdg_data_home = xdg_dir_get("XDG_DATA_HOME", ".local/share"); + + return xdg_data_home; +} + +const gchar *xdg_config_home_get(void) +{ + static const gchar *xdg_config_home = NULL; + + if (xdg_config_home) return xdg_config_home; + + xdg_config_home = xdg_dir_get("XDG_CONFIG_HOME", ".config"); + + return xdg_config_home; +} + +const gchar *xdg_cache_home_get(void) +{ + static const gchar *xdg_cache_home = NULL; + + if (xdg_cache_home) return xdg_cache_home; + + xdg_cache_home = xdg_dir_get("XDG_CACHE_HOME", ".cache"); + + return xdg_cache_home; +} + const gchar *get_rc_dir(void) { static gchar *rc_dir = NULL; if (rc_dir) return rc_dir; - rc_dir = g_build_filename(homedir(), GQ_RC_DIR, NULL); - + if (USE_XDG) + { + rc_dir = g_build_filename(xdg_config_home_get(), GQ_APPNAME_LC, NULL); + } + else + { + rc_dir = g_build_filename(homedir(), GQ_RC_DIR, NULL); + } + return rc_dir; } @@ -203,8 +255,15 @@ if (collections_dir) return collections_dir; - collections_dir = g_build_filename(get_rc_dir(), GQ_COLLECTIONS_DIR, NULL); - + if (USE_XDG) + { + collections_dir = g_build_filename(xdg_data_home_get(), GQ_APPNAME_LC, GQ_COLLECTIONS_DIR, NULL); + } + else + { + collections_dir = g_build_filename(get_rc_dir(), GQ_COLLECTIONS_DIR, NULL); + } + return collections_dir; } @@ -213,9 +272,16 @@ static gchar *trash_dir = NULL; if (trash_dir) return trash_dir; + + if (USE_XDG) + { + trash_dir = g_build_filename(xdg_data_home_get(), GQ_APPNAME_LC, GQ_TRASH_DIR, NULL); + } + else + { + trash_dir = g_build_filename(get_rc_dir(), GQ_TRASH_DIR, NULL); + } - trash_dir = g_build_filename(get_rc_dir(), GQ_TRASH_DIR, NULL); - return trash_dir; } diff -r 95860439070b -r c4fcf8001574 src/ui_fileops.h --- a/src/ui_fileops.h Sat Nov 15 20:01:25 2008 +0000 +++ b/src/ui_fileops.h Sat Nov 15 20:17:14 2008 +0000 @@ -34,6 +34,9 @@ gchar *path_to_utf8(const gchar *path); gchar *path_from_utf8(const gchar *path); +const gchar *xdg_data_home_get(void); +const gchar *xdg_config_home_get(void); +const gchar *xdg_cache_home_get(void); const gchar *homedir(void); const gchar *get_rc_dir(void); const gchar *get_collections_dir(void);