allow searching css independent of config path

This commit is contained in:
LordGrimmauld 2024-04-02 12:26:25 +02:00
parent aed276b104
commit 2c71f4ad2b
2 changed files with 30 additions and 30 deletions

View File

@ -10,7 +10,7 @@ use rmenu_plugin::{Entry, Message};
use thiserror::Error; use thiserror::Error;
use crate::config::{cfg_replace, Config, Keybind}; use crate::config::{cfg_replace, Config, Keybind};
use crate::{DEFAULT_CONFIG, DEFAULT_THEME}; use crate::{DEFAULT_CONFIG, DEFAULT_THEME, XDG_PREFIX};
/// Allowed Formats for Entry Ingestion /// Allowed Formats for Entry Ingestion
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -179,20 +179,20 @@ pub enum RMenuError {
pub type Result<T> = std::result::Result<T, RMenuError>; pub type Result<T> = std::result::Result<T, RMenuError>;
impl Args { impl Args {
/// Find Configuration Path /// Find a specifically named file across xdg config paths
pub fn find_config(&self) -> PathBuf { fn find_xdg_file(&self, name: &str, base: &Option<PathBuf>) -> Option<String> {
self.config.clone().unwrap_or_else(|| { return base.clone().or_else(|| {
xdg::BaseDirectories::with_prefix("rmenu") xdg::BaseDirectories::with_prefix(XDG_PREFIX)
.expect("Failed to read xdg base dirs") .expect("Failed to read xdg base dirs")
.find_config_file(DEFAULT_CONFIG) .find_config_file(name)
.unwrap_or_else(PathBuf::new) }).map(|f| f.to_string_lossy().to_string());
})
} }
/// Load Configuration File /// Load Configuration File
pub fn get_config(&self, path: &PathBuf) -> Result<Config> { pub fn get_config(&self) -> Result<Config> {
let path = path.to_string_lossy().to_string(); let config = self.find_xdg_file(DEFAULT_CONFIG, &self.config);
let path = shellexpand::tilde(&path).to_string();
if let Some (path) = config {
let config: Config = match read_to_string(path) { let config: Config = match read_to_string(path) {
Ok(content) => serde_yaml::from_str(&content), Ok(content) => serde_yaml::from_str(&content),
Err(err) => { Err(err) => {
@ -200,7 +200,10 @@ impl Args {
Ok(Config::default()) Ok(Config::default())
} }
}?; }?;
Ok(config) return Ok(config);
}
log::error!("Failed to Load Config: no file found in xdg config paths");
Ok(Config::default())
} }
/// Update Configuration w/ CLI Specified Settings /// Update Configuration w/ CLI Specified Settings
@ -242,11 +245,10 @@ impl Args {
} }
/// Load CSS Theme or Default /// Load CSS Theme or Default
pub fn get_theme(&self, cfgdir: &PathBuf) -> String { pub fn get_theme(&self) -> String {
let theme = self.theme.clone().or(Some(cfgdir.join(DEFAULT_THEME))); let theme = self.find_xdg_file(DEFAULT_THEME, &self.theme);
if let Some(theme) = theme {
let path = theme.to_string_lossy().to_string(); if let Some(path) = theme {
let path = shellexpand::tilde(&path).to_string();
match read_to_string(&path) { match read_to_string(&path) {
Ok(css) => return css, Ok(css) => return css,
Err(err) => log::error!("Failed to load CSS: {err:?}"), Err(err) => log::error!("Failed to load CSS: {err:?}"),

View File

@ -13,6 +13,7 @@ use rmenu_plugin::{self_exe, Entry};
static CONFIG_DIR: &'static str = "~/.config/rmenu/"; static CONFIG_DIR: &'static str = "~/.config/rmenu/";
static DEFAULT_THEME: &'static str = "style.css"; static DEFAULT_THEME: &'static str = "style.css";
static DEFAULT_CONFIG: &'static str = "config.yaml"; static DEFAULT_CONFIG: &'static str = "config.yaml";
static XDG_PREFIX: &'static str = "rmenu";
static DEFAULT_CSS_CONTENT: &'static str = include_str!("../public/default.css"); static DEFAULT_CSS_CONTENT: &'static str = include_str!("../public/default.css");
/// Application State for GUI /// Application State for GUI
@ -43,8 +44,7 @@ fn main() -> cli::Result<()> {
// parse cli and retrieve values for app // parse cli and retrieve values for app
let mut cli = cli::Args::parse(); let mut cli = cli::Args::parse();
let mut cfgpath = cli.find_config(); let mut config = cli.get_config()?;
let mut config = cli.get_config(&cfgpath)?;
let entries = cli.get_entries(&mut config)?; let entries = cli.get_entries(&mut config)?;
// update config based on cli-settings and entries // update config based on cli-settings and entries
@ -55,10 +55,8 @@ fn main() -> cli::Result<()> {
.any(|e| e.icon.is_some() || e.icon_alt.is_some()); .any(|e| e.icon.is_some() || e.icon_alt.is_some());
config.use_comments = config.use_comments && entries.iter().any(|e| e.comment.is_some()); config.use_comments = config.use_comments && entries.iter().any(|e| e.comment.is_some());
// retrieve cfgdir and get theme/css
cfgpath.pop(); let theme = cli.get_theme();
let cfgdir = cfgpath;
let theme = cli.get_theme(&cfgdir);
let css = cli.get_css(&config); let css = cli.get_css(&config);
// genrate app context and run gui // genrate app context and run gui