Implement preliminary support for XDG Base Directory Specification.
authorLaurent Monin <geeqie@norz.org>
Sat, 15 Nov 2008 20:17:14 +0000 (20:17 +0000)
committerLaurent Monin <geeqie@norz.org>
Sat, 15 Nov 2008 20:17:14 +0000 (20:17 +0000)
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.

src/cache.c
src/main.h
src/ui_fileops.c
src/ui_fileops.h

index 7395ab7..29de823 100644 (file)
@@ -767,7 +767,15 @@ const gchar *get_thumbnails_cache_dir(void)
 
        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 @@ const gchar *get_metadata_cache_dir(void)
 
        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;
 }
 
index 8be8be9..9454933 100644 (file)
@@ -64,6 +64,8 @@
  *----------------------------------------------------------------------------
  */
 
+#define USE_XDG 0
+
 #define GQ_APPNAME "Geeqie"
 #define GQ_APPNAME_LC "geeqie"
 #define GQ_WEBSITE "geeqie.sourceforge.net"
index db16b1c..d1c04db 100644 (file)
@@ -186,14 +186,66 @@ const gchar *homedir(void)
        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 @@ const gchar *get_collections_dir(void)
 
        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 @@ const gchar *get_trash_dir(void)
        static gchar *trash_dir = NULL;
 
        if (trash_dir) return trash_dir;
-
-       trash_dir = g_build_filename(get_rc_dir(), GQ_TRASH_DIR, NULL);
        
+       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);
+       }
+
        return trash_dir;
 }
 
index ce01722..7ff563a 100644 (file)
@@ -34,6 +34,9 @@ void print_term(const gchar *text_utf8);
 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);