move default config dir to ~/.config/

Sun, 07 Dec 2025 19:05:51 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 07 Dec 2025 19:05:51 +0100
changeset 974
dc72d666d721
parent 973
aa39a986da78
child 975
e0ac49797a30

move default config dir to ~/.config/

ui/common/properties.c file | annotate | diff | comparison | revisions
--- a/ui/common/properties.c	Sun Dec 07 16:02:47 2025 +0100
+++ b/ui/common/properties.c	Sun Dec 07 19:05:51 2025 +0100
@@ -54,6 +54,8 @@
 static char *locales_dir;
 static char *pixmaps_dir;
 
+static UiBool use_xdg_config_home = TRUE;
+
 #endif
 
 
@@ -73,6 +75,8 @@
 #define UI_ENV_HOME "USERPROFILE"
 #endif
 
+#define UI_XDG_CONFIG_HOME_VAR "XDG_CONFIG_HOME"
+
 char* ui_configfile(const char *name) {
     const char *appname = ui_appname();
     if(!appname) {
@@ -102,8 +106,23 @@
     // on Windows the app dir is $USERPROFILE/AppData/Local/$APPNAME/
     cxBufferPutString(&buf, "AppData\\Local\\");
 #else
-    // app dir is $HOME/.$APPNAME/
-    cxBufferPut(&buf, '.');
+    if(use_xdg_config_home) {
+        // app dir is $HOME/.config/$APPNAME/
+        char *xdghome = getenv(UI_XDG_CONFIG_HOME_VAR);
+        size_t xdghomelen = xdghome ? strlen(xdghome) : 0;
+        if(xdghome && xdghomelen > 0) {
+            cxBufferSeek(&buf, 0, SEEK_SET);
+            cxBufferPutString(&buf, xdghome);
+            if(xdghome[xdghomelen-1] != '/') {
+                cxBufferPut(&buf, '/');
+            }
+        } else {
+            cxBufferPutString(&buf, ".config/");
+        }
+    } else {
+        cxBufferPut(&buf, '.');
+    }
+    
 #endif
     cxBufferPutString(&buf, appname);
     cxBufferPut(&buf, UI_PATH_SEPARATOR);
@@ -139,9 +158,37 @@
     if(!dir) {
         return;
     }
+    size_t len = strlen(dir);
+    if(len < 2) {
+        return;
+    }
     if(ui_mkdir(dir)) {
+        if(errno == ENOENT) {
+            char *parent = strdup(dir);
+            for(int i=len-2;i>=0;i--) {
+                if(parent[i] == '/') {
+                    parent[i] = 0;
+                    break;
+                }
+            }
+            // try creating the parent
+            int err = ui_mkdir(parent);
+            if(err) {
+                fprintf(stderr, "Error: Cannot create directory %s: %s\n", strerror(errno));
+                free(parent);
+                free(dir);
+                return;
+            }
+            free(parent);
+            
+            // try dir again
+            if(!ui_mkdir(dir)) {
+                errno = EEXIST; // success
+            }
+        }
+        
         if(errno != EEXIST) {
-            fprintf(stderr, "Ui Error: Cannot create directory %s\n", dir);
+            fprintf(stderr, "Error: Cannot create directory %s: %s\n", dir, strerror(errno));
             free(dir);
             return;
         }

mercurial