git.lucas.co / cce-files
file manager
git clone https://git.lucas.co/cce-files.git

commite86aea09f42c7f57c700f63bedd8de3dc0ca39a8
parent23019b30bb
authorLucas Galante <[email protected]>
date2026-06-29 12:02
Support XDG Base Directory specification for persistence path

 Cargo.toml          |  6 +++---
 Makefile            |  2 +-
 src/main.rs         | 10 +++++-----
 src/pages/browse.rs | 13 ++++++++++++-
 src/services/fs.rs  | 16 +++++++++++++---
 5 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index e8d46ff..54da47b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "cce-filesystem-interface"
+name = "cce-files"
 version = "0.1.0"
 edition = "2024"
 
@@ -18,9 +18,9 @@ log = "0.4"
 
 
 [lib]
-name = "cce_filesystem_interface"
+name = "cce_files"
 path = "src/lib.rs"
 
 [[bin]]
-name = "cce-filesystem-interface"
+name = "cce-files"
 path = "src/main.rs"
diff --git a/Makefile b/Makefile
index bbf9283..5ad3b57 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ build:
 
 install: build
 	mkdir -p ~/.local/bin
-	install -m 755 ../target/release/cce-filesystem-interface ~/.local/bin/cce-filesystem-interface
+	install -m 755 ../target/release/cce-files ~/.local/bin/cce-files
 
 run:
 	cargo run
diff --git a/src/main.rs b/src/main.rs
index af77cd7..12d201d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -7,9 +7,9 @@ use cce_ui::widget::{GraphController, PathController};
 
 use notify::{Watcher, RecommendedWatcher, RecursiveMode, Config};
 
-use cce_filesystem_interface::{Message, pages, services};
-use cce_filesystem_interface::pages::Page;
-use cce_filesystem_interface::pages::browse::is_project_dir;
+use cce_files::{Message, pages, services};
+use cce_files::pages::Page;
+use cce_files::pages::browse::is_project_dir;
 
 // ── State ───────────────────────────────────────────────────────────
 
@@ -608,8 +608,8 @@ impl Application for FilesystemApp {
             }
         } else {
             WindowSettings {
-                title: "Clear Filesystem Interface".to_string(),
-                app_id: "cce-filesystem-interface".to_string(),
+                title: "Files".to_string(),
+                app_id: "cce-files".to_string(),
                 width: 1200,
                 height: 720,
                 fullscreen: false,
diff --git a/src/pages/browse.rs b/src/pages/browse.rs
index 2876350..8ee313f 100644
--- a/src/pages/browse.rs
+++ b/src/pages/browse.rs
@@ -533,11 +533,15 @@ mod tests {
     fn test_directory_persistence() {
         let temp_dir = std::env::temp_dir();
         let original_home = std::env::var("HOME");
+        let original_xdg = std::env::var("XDG_CONFIG_HOME");
         
         // Mock HOME env variable so we don't overwrite user's actual config
         let mock_home = temp_dir.join("mock_home_dir_cce");
         let _ = std::fs::create_dir_all(&mock_home);
-        unsafe { std::env::set_var("HOME", &mock_home); }
+        unsafe {
+            std::env::set_var("HOME", &mock_home);
+            std::env::remove_var("XDG_CONFIG_HOME");
+        }
         
         let test_dir = temp_dir.join("test_persist_dir");
         let _ = std::fs::create_dir_all(&test_dir);
@@ -556,6 +560,13 @@ mod tests {
             unsafe { std::env::remove_var("HOME"); }
         }
         
+        // Restore XDG_CONFIG_HOME
+        if let Ok(val) = original_xdg {
+            unsafe { std::env::set_var("XDG_CONFIG_HOME", val); }
+        } else {
+            unsafe { std::env::remove_var("XDG_CONFIG_HOME"); }
+        }
+        
         // Clean up
         let _ = std::fs::remove_dir_all(&mock_home);
         let _ = std::fs::remove_dir(&test_dir);
diff --git a/src/services/fs.rs b/src/services/fs.rs
index 62189b3..5bacbcb 100644
--- a/src/services/fs.rs
+++ b/src/services/fs.rs
@@ -339,10 +339,20 @@ fn infer_file_type(name: &str, is_dir: bool) -> String {
 }
 
 fn get_last_dir_file_path() -> Option<PathBuf> {
-    let home = std::env::var("HOME").ok()?;
-    let dir = PathBuf::from(home).join(".config").join("cce");
+    let dir = if let Ok(xdg_config) = std::env::var("XDG_CONFIG_HOME") {
+        if !xdg_config.is_empty() {
+            PathBuf::from(xdg_config)
+        } else {
+            let home = std::env::var("HOME").ok()?;
+            PathBuf::from(home).join(".config")
+        }
+    } else {
+        let home = std::env::var("HOME").ok()?;
+        PathBuf::from(home).join(".config")
+    };
+    let dir = dir.join("cce").join("cce-files");
     let _ = fs::create_dir_all(&dir);
-    Some(dir.join("cce-filesystem-interface-last-dir.txt"))
+    Some(dir.join("cce-files-last-dir.txt"))
 }
 
 pub fn read_last_dir_internal() -> Option<PathBuf> {