system settings
git clone https://git.lucas.co/cce-system-interface.git
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);
}