refactor(theme): use symlink for both gtk4 and gtk3 css and add method for reset

This commit is contained in:
Ashley Wulber 2024-03-18 16:31:46 -04:00 committed by Jeremy Soller
parent db63aefe6f
commit 1b62b9686c

View file

@ -176,7 +176,7 @@ impl Theme {
} }
/// Apply gtk color variable settings /// Apply gtk color variable settings
pub fn apply_gtk(&self) -> Result<(), OutputError> { pub fn apply_gtk(is_dark: bool) -> Result<(), OutputError> {
let Some(config_dir) = dirs::config_dir() else { let Some(config_dir) = dirs::config_dir() else {
return Err(OutputError::MissingConfigDir); return Err(OutputError::MissingConfigDir);
}; };
@ -187,44 +187,53 @@ impl Theme {
fs::create_dir_all(&gtk4).map_err(OutputError::Io)?; fs::create_dir_all(&gtk4).map_err(OutputError::Io)?;
fs::create_dir_all(&gtk3).map_err(OutputError::Io)?; fs::create_dir_all(&gtk3).map_err(OutputError::Io)?;
let cosmic_css = gtk4
.join("cosmic")
.join(if is_dark { "dark.css" } else { "light.css" });
let gtk4_dest = gtk4.join("gtk.css"); let gtk4_dest = gtk4.join("gtk.css");
let gtk3_dest = gtk3.join("gtk.css");
fs::rename(&gtk4_dest, gtk4.join("gtk.css.bak")).map_err(OutputError::Io)?;
fs::copy(
gtk4.join("cosmic").join(if self.is_dark {
"dark.css"
} else {
"light.css"
}),
&gtk4_dest,
)
.map_err(OutputError::Io)?;
#[cfg(target_family = "unix")] #[cfg(target_family = "unix")]
{ for gtk_dest in [&gtk4_dest, &gtk3_dest] {
use std::fs::metadata; use std::fs::metadata;
use std::os::unix::fs::symlink; use std::os::unix::fs::symlink;
let gtk3_dest = gtk3.join("gtk.css"); let mut gtk_dest_bak = gtk_dest.clone();
let gtk3_dest_bak = gtk3.join("gtk.css.bak"); gtk_dest_bak.set_extension("css.bak");
if gtk3_dest.exists() { if gtk_dest.exists() {
if metadata(&gtk3_dest) if metadata(&gtk_dest)
.map_err(OutputError::Io)? .map_err(OutputError::Io)?
.file_type() .file_type()
.is_symlink() .is_symlink()
{ {
fs::remove_file(&gtk3_dest).map_err(OutputError::Io)?; fs::remove_file(&gtk_dest).map_err(OutputError::Io)?;
} else { } else {
fs::rename(&gtk3_dest, gtk3_dest_bak).map_err(OutputError::Io)?; fs::rename(&gtk_dest, gtk_dest_bak).map_err(OutputError::Io)?;
} }
} }
symlink(gtk4_dest, gtk3_dest).map_err(OutputError::Io)?; symlink(&cosmic_css, gtk_dest).map_err(OutputError::Io)?;
} }
Ok(()) Ok(())
} }
/// Reset the applied gtk css
pub fn reset_gtk() -> Result<(), OutputError> {
let Some(config_dir) = dirs::config_dir() else {
return Err(OutputError::MissingConfigDir);
};
let gtk4 = config_dir.join("gtk-4.0");
let gtk3 = config_dir.join("gtk-3.0");
let gtk4_dest = gtk4.join("gtk.css");
let gtk3_dest = gtk3.join("gtk.css");
let res = fs::remove_file(gtk3_dest);
fs::remove_file(gtk4_dest).map_err(OutputError::Io)?;
Ok(res.map_err(OutputError::Io)?)
}
} }
fn component_gtk4_css(prefix: &str, c: &Component) -> String { fn component_gtk4_css(prefix: &str, c: &Component) -> String {