diff src/ui_fileops.c @ 1149:c4fcf8001574

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.
author zas_
date Sat, 15 Nov 2008 20:17:14 +0000
parents 95860439070b
children 3692efcbd325
line wrap: on
line diff
--- 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;
 }