git.lucas.co / cce-system-interface
system settings
git clone https://git.lucas.co/cce-system-interface.git

commitc85df90c77de5ca516e3892388d04a9ab3c6c12b
parentbb2f6fb8cf
authorLucas Galante <[email protected]>
date2026-07-07 08:58
refactor: route hardcoded paths through cce_ui XDG helpers

Replace hardcoded /home/lsgalante paths with cce_ui::config helpers:
- cce config + accounts + google_client.json via get_config_path/cce_config_dir
- fuzzel/foot/fontconfig configs via config_home()
- backup/cpu/gpu helper scripts via data_home()
- bundled fonts dir via cce_ui::fonts_dir()

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

 src/pages/accounts.rs      |  6 ++--
 src/pages/fonts.rs         | 78 +++++++++++++++++++++++++---------------------
 src/pages/notifications.rs |  7 ++---
 src/pages/storage.rs       |  2 +-
 src/pages/system_info.rs   |  4 +--
 5 files changed, 52 insertions(+), 45 deletions(-)

diff --git a/src/pages/accounts.rs b/src/pages/accounts.rs
index 21cf72d..364606f 100644
--- a/src/pages/accounts.rs
+++ b/src/pages/accounts.rs
@@ -83,7 +83,7 @@ pub enum AccountsMessage {
 }
 
 pub fn get_accounts_path() -> std::path::PathBuf {
-    let p = std::path::PathBuf::from("/home/lsgalante/.config/cce");
+    let p = cce_ui::config::cce_config_dir();
     if !p.exists() {
         let _ = std::fs::create_dir_all(&p);
         #[cfg(unix)]
@@ -189,7 +189,7 @@ fn write_google_client_config(p: &std::path::Path, config: &GoogleClientConfig)
 }
 
 pub fn load_google_client_config() -> GoogleClientConfig {
-    let p = std::path::PathBuf::from("/home/lsgalante/.config/cce/google_client.json");
+    let p = cce_ui::config::cce_config_dir().join("google_client.json");
     let default_config = GoogleClientConfig {
         client_id: GOOGLE_CLIENT_ID.to_string(),
         client_secret: GOOGLE_CLIENT_SECRET.to_string(),
@@ -797,7 +797,7 @@ pub fn update(state: &mut AccountsState, msg: AccountsMessage) {
                 client_id,
                 client_secret,
             };
-            let p = std::path::PathBuf::from("/home/lsgalante/.config/cce/google_client.json");
+            let p = cce_ui::config::cce_config_dir().join("google_client.json");
             if let Some(parent) = p.parent() {
                 let _ = std::fs::create_dir_all(parent);
             }
diff --git a/src/pages/fonts.rs b/src/pages/fonts.rs
index 5330159..0553b94 100644
--- a/src/pages/fonts.rs
+++ b/src/pages/fonts.rs
@@ -4,7 +4,15 @@ use cce_ui::widget::{TextBox, Dropdown, Spinbox, Element};
 use crate::app::{PageContent, AppAction};
 use crate::pages::AppPage;
 
-const FONTS_CONF_PATH: &str = "/home/lsgalante/.config/fontconfig/fonts.conf";
+fn fonts_conf_path() -> String {
+    cce_ui::config::config_home().join("fontconfig").join("fonts.conf").to_string_lossy().into_owned()
+}
+fn fuzzel_ini_path() -> String {
+    cce_ui::config::config_home().join("fuzzel").join("fuzzel.ini").to_string_lossy().into_owned()
+}
+fn foot_ini_path() -> String {
+    cce_ui::config::config_home().join("foot").join("foot.ini").to_string_lossy().into_owned()
+}
 
 #[derive(Debug, Clone)]
 pub enum FontsMessage {
@@ -71,19 +79,19 @@ impl Default for FontsState {
             terminal: "Noto Sans Mono".to_string(),
             all_fonts: Vec::new(),
             mono_fonts: Vec::new(),
-            sans_box: TextBox::new(String::new()).with_label("Sans-Serif").with_config(FONTS_CONF_PATH, "sans-serif"),
-            serif_box: TextBox::new(String::new()).with_label("Serif").with_config(FONTS_CONF_PATH, "serif"),
-            mono_box: TextBox::new(String::new()).with_label("Monospace").with_config(FONTS_CONF_PATH, "monospace"),
-            borders_box: TextBox::new(String::new()).with_label("Window Borders").with_config(FONTS_CONF_PATH, "window_borders"),
-            status_box: TextBox::new(String::new()).with_label("Status Interface").with_config(FONTS_CONF_PATH, "status_interface"),
-            fuzzel_box: TextBox::new(String::new()).with_label("Fuzzel").with_config(FONTS_CONF_PATH, "fuzzel"),
-            terminal_box: TextBox::new(String::new()).with_label("Terminal").with_config(FONTS_CONF_PATH, "terminal"),
-            borders_menu: Dropdown::new(Vec::new(), 0).with_config(FONTS_CONF_PATH, "window_borders"),
-            status_menu: Dropdown::new(Vec::new(), 0).with_config(FONTS_CONF_PATH, "status_interface"),
-            fuzzel_menu: Dropdown::new(Vec::new(), 0).with_config(FONTS_CONF_PATH, "fuzzel"),
-            terminal_menu: Dropdown::new(Vec::new(), 0).with_config(FONTS_CONF_PATH, "terminal"),
-            fuzzel_size_box: Spinbox::new(14, 6, 72, 1).with_config("/home/lsgalante/.config/fuzzel/fuzzel.ini", "size"),
-            terminal_size_box: Spinbox::new(12, 6, 72, 1).with_config("/home/lsgalante/.config/foot/foot.ini", "size"),
+            sans_box: TextBox::new(String::new()).with_label("Sans-Serif").with_config((&fonts_conf_path()), "sans-serif"),
+            serif_box: TextBox::new(String::new()).with_label("Serif").with_config((&fonts_conf_path()), "serif"),
+            mono_box: TextBox::new(String::new()).with_label("Monospace").with_config((&fonts_conf_path()), "monospace"),
+            borders_box: TextBox::new(String::new()).with_label("Window Borders").with_config((&fonts_conf_path()), "window_borders"),
+            status_box: TextBox::new(String::new()).with_label("Status Interface").with_config((&fonts_conf_path()), "status_interface"),
+            fuzzel_box: TextBox::new(String::new()).with_label("Fuzzel").with_config((&fonts_conf_path()), "fuzzel"),
+            terminal_box: TextBox::new(String::new()).with_label("Terminal").with_config((&fonts_conf_path()), "terminal"),
+            borders_menu: Dropdown::new(Vec::new(), 0).with_config((&fonts_conf_path()), "window_borders"),
+            status_menu: Dropdown::new(Vec::new(), 0).with_config((&fonts_conf_path()), "status_interface"),
+            fuzzel_menu: Dropdown::new(Vec::new(), 0).with_config((&fonts_conf_path()), "fuzzel"),
+            terminal_menu: Dropdown::new(Vec::new(), 0).with_config((&fonts_conf_path()), "terminal"),
+            fuzzel_size_box: Spinbox::new(14, 6, 72, 1).with_config((&fuzzel_ini_path()), "size"),
+            terminal_size_box: Spinbox::new(12, 6, 72, 1).with_config((&foot_ini_path()), "size"),
         }
     }
 }
@@ -293,7 +301,7 @@ fn parse_font_for_alias(content: &str, alias: &str) -> Option<String> {
 }
 
 pub fn read_preferred_fonts() -> (String, String, String, String, String, String, String) {
-    let content = fs::read_to_string(FONTS_CONF_PATH).unwrap_or_default();
+    let content = fs::read_to_string((&fonts_conf_path())).unwrap_or_default();
     
     let sans = parse_font_for_alias(&content, "sans-serif").unwrap_or_else(|| "Noto Sans".to_string());
     let serif = parse_font_for_alias(&content, "serif").unwrap_or_else(|| "Noto Serif".to_string());
@@ -315,7 +323,7 @@ pub fn save_preferred_fonts(
     fuzzel: &str,
     terminal: &str,
 ) {
-    let content = fs::read_to_string(FONTS_CONF_PATH).unwrap_or_default();
+    let content = fs::read_to_string((&fonts_conf_path())).unwrap_or_default();
     let mut dirs = Vec::new();
     for line in content.lines() {
         let trimmed = line.trim();
@@ -393,11 +401,11 @@ pub fn save_preferred_fonts(
     new_content.push_str("    </match>\n");
     
     new_content.push_str("</fontconfig>\n");
-    let _ = fs::write(FONTS_CONF_PATH, new_content);
+    let _ = fs::write((&fonts_conf_path()), new_content);
 }
 
 fn read_fuzzel_size() -> Option<u16> {
-    let ini = fs::read_to_string("/home/lsgalante/.config/fuzzel/fuzzel.ini").ok()?;
+    let ini = fs::read_to_string((&fuzzel_ini_path())).ok()?;
     for line in ini.lines() {
         let trimmed = line.trim();
         if trimmed.starts_with("font") {
@@ -412,7 +420,7 @@ fn read_fuzzel_size() -> Option<u16> {
 }
 
 fn write_fuzzel_size(size: u16) {
-    let path = "/home/lsgalante/.config/fuzzel/fuzzel.ini";
+    let path = (&fuzzel_ini_path());
     let ini = fs::read_to_string(path).unwrap_or_default();
     let mut new_lines = Vec::new();
     for line in ini.lines() {
@@ -436,7 +444,7 @@ fn write_fuzzel_size(size: u16) {
 }
 
 fn read_terminal_size() -> Option<u16> {
-    let ini = fs::read_to_string("/home/lsgalante/.config/foot/foot.ini").ok()?;
+    let ini = fs::read_to_string((&foot_ini_path())).ok()?;
     for line in ini.lines() {
         let trimmed = line.trim();
         if trimmed.starts_with("font") {
@@ -451,7 +459,7 @@ fn read_terminal_size() -> Option<u16> {
 }
 
 fn write_terminal_size(size: u16) {
-    let path = "/home/lsgalante/.config/foot/foot.ini";
+    let path = (&foot_ini_path());
     let ini = fs::read_to_string(path).unwrap_or_default();
     let mut new_lines = Vec::new();
     for line in ini.lines() {
@@ -499,7 +507,7 @@ pub fn read_typeface_config() -> FontsState {
     
     let font_dirs = vec![
         "/usr/share/fonts".to_string(),
-        "/home/lsgalante/Dropbox/Fonts".to_string(),
+        cce_ui::fonts_dir(),
     ];
     let mut all_fonts = Vec::new();
     let mut mono_fonts = Vec::new();
@@ -534,16 +542,16 @@ pub fn read_typeface_config() -> FontsState {
         "Other".to_string(),
     ];
 
-    let mut borders_box = TextBox::new(borders.clone()).with_label("Window Borders").with_config(FONTS_CONF_PATH, "window_borders");
+    let mut borders_box = TextBox::new(borders.clone()).with_label("Window Borders").with_config((&fonts_conf_path()), "window_borders");
     borders_box.disabled = borders_idx != 3;
 
-    let mut status_box = TextBox::new(status.clone()).with_label("Status Interface").with_config(FONTS_CONF_PATH, "status_interface");
+    let mut status_box = TextBox::new(status.clone()).with_label("Status Interface").with_config((&fonts_conf_path()), "status_interface");
     status_box.disabled = status_idx != 3;
 
-    let mut fuzzel_box = TextBox::new(fuzzel_font.clone()).with_label("Fuzzel").with_config(FONTS_CONF_PATH, "fuzzel");
+    let mut fuzzel_box = TextBox::new(fuzzel_font.clone()).with_label("Fuzzel").with_config((&fonts_conf_path()), "fuzzel");
     fuzzel_box.disabled = fuzzel_idx != 3;
 
-    let mut terminal_box = TextBox::new(term.clone()).with_label("Terminal").with_config(FONTS_CONF_PATH, "terminal");
+    let mut terminal_box = TextBox::new(term.clone()).with_label("Terminal").with_config((&fonts_conf_path()), "terminal");
     terminal_box.disabled = terminal_idx != 3;
 
     let fuzzel_size = read_fuzzel_size().unwrap_or(14);
@@ -560,19 +568,19 @@ pub fn read_typeface_config() -> FontsState {
     state.terminal = term;
     state.all_fonts = all_fonts;
     state.mono_fonts = mono_fonts;
-    state.sans_box = TextBox::new(sans).with_label("Sans-Serif").with_config(FONTS_CONF_PATH, "sans-serif");
-    state.serif_box = TextBox::new(serif).with_label("Serif").with_config(FONTS_CONF_PATH, "serif");
-    state.mono_box = TextBox::new(mono).with_label("Monospace").with_config(FONTS_CONF_PATH, "monospace");
+    state.sans_box = TextBox::new(sans).with_label("Sans-Serif").with_config((&fonts_conf_path()), "sans-serif");
+    state.serif_box = TextBox::new(serif).with_label("Serif").with_config((&fonts_conf_path()), "serif");
+    state.mono_box = TextBox::new(mono).with_label("Monospace").with_config((&fonts_conf_path()), "monospace");
     state.borders_box = borders_box;
     state.status_box = status_box;
     state.fuzzel_box = fuzzel_box;
     state.terminal_box = terminal_box;
-    state.borders_menu = Dropdown::new(menu_options.clone(), borders_idx).with_config(FONTS_CONF_PATH, "window_borders");
-    state.status_menu = Dropdown::new(menu_options.clone(), status_idx).with_config(FONTS_CONF_PATH, "status_interface");
-    state.fuzzel_menu = Dropdown::new(menu_options.clone(), fuzzel_idx).with_config(FONTS_CONF_PATH, "fuzzel");
-    state.terminal_menu = Dropdown::new(menu_options, terminal_idx).with_config(FONTS_CONF_PATH, "terminal");
-    state.fuzzel_size_box = Spinbox::new(fuzzel_size as i32, 6, 72, 1).with_config("/home/lsgalante/.config/fuzzel/fuzzel.ini", "size");
-    state.terminal_size_box = Spinbox::new(terminal_size as i32, 6, 72, 1).with_config("/home/lsgalante/.config/foot/foot.ini", "size");
+    state.borders_menu = Dropdown::new(menu_options.clone(), borders_idx).with_config((&fonts_conf_path()), "window_borders");
+    state.status_menu = Dropdown::new(menu_options.clone(), status_idx).with_config((&fonts_conf_path()), "status_interface");
+    state.fuzzel_menu = Dropdown::new(menu_options.clone(), fuzzel_idx).with_config((&fonts_conf_path()), "fuzzel");
+    state.terminal_menu = Dropdown::new(menu_options, terminal_idx).with_config((&fonts_conf_path()), "terminal");
+    state.fuzzel_size_box = Spinbox::new(fuzzel_size as i32, 6, 72, 1).with_config((&fuzzel_ini_path()), "size");
+    state.terminal_size_box = Spinbox::new(terminal_size as i32, 6, 72, 1).with_config((&foot_ini_path()), "size");
     state
 }
 
diff --git a/src/pages/notifications.rs b/src/pages/notifications.rs
index 99faa27..4d9b9d8 100644
--- a/src/pages/notifications.rs
+++ b/src/pages/notifications.rs
@@ -6,7 +6,6 @@ use cce_ui::layout::{PageLayoutBuilder, LayoutStrategy};
 use crate::app::{AppAction, PageContent, SectionContextExt};
 use crate::pages::AppPage;
 
-const CONFIG_PATH: &str = "/home/lsgalante/.config/cce/config.kdl";
 
 #[derive(Debug, Clone)]
 pub struct NotificationsConfig {
@@ -117,7 +116,7 @@ fn get_socket_path() -> String {
 }
 
 pub fn read_notifications_config() -> NotificationsConfig {
-    let content = fs::read_to_string(CONFIG_PATH).unwrap_or_default();
+    let content = fs::read_to_string(get_config_path()).unwrap_or_default();
     let val = parse_json(&content);
     let enable = val["notifications"]["enable"].as_bool().unwrap_or(true);
     let bell = val["notifications"]["bell"].as_str().unwrap_or("none").to_string();
@@ -178,12 +177,12 @@ fn get_config_path() -> String {
             if let Some(path) = p.borrow().as_ref() {
                 return path.clone();
             }
-            "/home/lsgalante/.config/cce/config.kdl".to_string()
+            cce_ui::config::get_config_path().to_string_lossy().into_owned()
         })
     }
     #[cfg(not(test))]
     {
-        "/home/lsgalante/.config/cce/config.kdl".to_string()
+        cce_ui::config::get_config_path().to_string_lossy().into_owned()
     }
 }
 
diff --git a/src/pages/storage.rs b/src/pages/storage.rs
index 429f8f6..677309c 100644
--- a/src/pages/storage.rs
+++ b/src/pages/storage.rs
@@ -111,7 +111,7 @@ pub async fn fetch_storage_state() -> StorageState {
 pub async fn run_backup() -> Result<(String, String), String> {
     // Run the backup system helper script via pkexec (graphical auth prompt)
     let output = tokio::process::Command::new("pkexec")
-        .arg("/home/lsgalante/.local/share/cce-settings/helpers/backup-system.sh")
+        .arg(cce_ui::config::data_home().join("cce-settings").join("helpers").join("backup-system.sh"))
         .output()
         .await
         .map_err(|e| format!("Failed to run backup script: {}", e))?;
diff --git a/src/pages/system_info.rs b/src/pages/system_info.rs
index fff00fb..924f5fc 100644
--- a/src/pages/system_info.rs
+++ b/src/pages/system_info.rs
@@ -284,14 +284,14 @@ fn format_duration(secs: i64) -> String {
 fn spawn_cpu_power(powersave: bool) {
     let script = if powersave { "cpu-powersave-on" } else { "cpu-powersave-off" };
     let mut cmd = std::process::Command::new("pkexec");
-    cmd.arg(format!("/home/lsgalante/.local/share/cce-settings/helpers/{}", script));
+    cmd.arg(cce_ui::config::data_home().join("cce-settings").join("helpers").join(script));
     let _ = cce_ui::process::spawn_detached(cmd);
 }
 
 fn spawn_gpu_power(powersave: bool) {
     let script = if powersave { "gpu-powersave-on" } else { "gpu-powersave-off" };
     let mut cmd = std::process::Command::new("pkexec");
-    cmd.arg(format!("/home/lsgalante/.local/share/cce-settings/helpers/{}", script));
+    cmd.arg(cce_ui::config::data_home().join("cce-settings").join("helpers").join(script));
     let _ = cce_ui::process::spawn_detached(cmd);
 }