diff --git a/Cargo.toml b/Cargo.toml index 2018a681..aaec5b2d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -78,3 +78,7 @@ assets = [ ["assets/completions/zellij.fish", "usr/share/fish/vendor_completions.d/zellij.fish", "644"], ["assets/completions/_zellij", "usr/share/zsh/vendor-completions/_zellij", "644"], ] + +[features] +default = [ "enable_automatic_asset_installation", ] +enable_automatic_asset_installation = [] diff --git a/src/common/setup.rs b/src/common/setup.rs index 37bf02da..5913211a 100644 --- a/src/common/setup.rs +++ b/src/common/setup.rs @@ -1,6 +1,8 @@ -use crate::common::utils::consts::{SYSTEM_DEFAULT_CONFIG_DIR, VERSION}; +use crate::common::utils::consts::{ + SYSTEM_DEFAULT_CONFIG_DIR, SYSTEM_DEFAULT_DATA_DIR_PREFIX, VERSION, ZELLIJ_PROJ_DIR, +}; use crate::os_input_output::set_permissions; -use directories_next::{BaseDirs, ProjectDirs}; +use directories_next::BaseDirs; use std::io::Write; use std::{fs, path::Path, path::PathBuf}; @@ -51,6 +53,8 @@ pub mod install { } #[cfg(not(test))] +/// Goes through a predefined list and checks for an already +/// existing config directory, returns the first match pub fn find_default_config_dir() -> Option { vec![ home_config_dir(), @@ -68,9 +72,24 @@ pub fn find_default_config_dir() -> Option { None } +/// Looks for an existing dir, uses that, else returns a +/// dir matching the config spec. +pub fn get_default_data_dir() -> PathBuf { + vec![ + xdg_data_dir(), + Path::new(SYSTEM_DEFAULT_DATA_DIR_PREFIX).join("share/zellij"), + ] + .into_iter() + .find(|p| p.exists()) + .unwrap_or_else(xdg_data_dir) +} + pub fn xdg_config_dir() -> PathBuf { - let project_dirs = ProjectDirs::from("org", "Zellij Contributors", "Zellij").unwrap(); - project_dirs.config_dir().to_owned() + ZELLIJ_PROJ_DIR.config_dir().to_owned() +} + +pub fn xdg_data_dir() -> PathBuf { + ZELLIJ_PROJ_DIR.data_dir().to_owned() } pub fn home_config_dir() -> Option { diff --git a/src/common/utils/consts.rs b/src/common/utils/consts.rs index bc8768ce..c77f1c9e 100644 --- a/src/common/utils/consts.rs +++ b/src/common/utils/consts.rs @@ -11,8 +11,16 @@ pub const ZELLIJ_CONFIG_FILE_ENV: &str = "ZELLIJ_CONFIG_FILE"; pub const ZELLIJ_CONFIG_DIR_ENV: &str = "ZELLIJ_CONFIG_DIR"; pub const VERSION: &str = env!("CARGO_PKG_VERSION"); -// TODO: ${PREFIX} argument in makefile pub const SYSTEM_DEFAULT_CONFIG_DIR: &str = "/etc/zellij"; +pub const SYSTEM_DEFAULT_DATA_DIR_PREFIX: &str = system_default_data_dir(); + +const fn system_default_data_dir() -> &'static str { + if let Some(data_dir) = std::option_env!("PREFIX") { + data_dir + } else { + &"/usr" + } +} lazy_static! { static ref UID: Uid = Uid::current(); diff --git a/src/server/mod.rs b/src/server/mod.rs index 622a3257..a4a79ca0 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -17,7 +17,7 @@ use crate::common::{ os_input_output::{set_permissions, ServerOsApi}, pty::{pty_thread_main, Pty, PtyInstruction}, screen::{screen_thread_main, ScreenInstruction}, - setup::install::populate_data_dir, + setup::{get_default_data_dir, install::populate_data_dir}, thread_bus::{ChannelWithContext, SenderType, SenderWithContext}, utils::consts::{ZELLIJ_IPC_PIPE, ZELLIJ_PROJ_DIR}, wasm_vm::{wasm_thread_main, PluginInstruction}, @@ -185,9 +185,9 @@ fn init_session( let to_pty = SenderWithContext::new(SenderType::Sender(to_pty)); // Determine and initialize the data directory - let data_dir = opts - .data_dir - .unwrap_or_else(|| ZELLIJ_PROJ_DIR.data_dir().to_path_buf()); + let data_dir = opts.data_dir.unwrap_or_else(get_default_data_dir); + + #[cfg(enable_automatic_assets_installation)] populate_data_dir(&data_dir); // Don't use default layouts in tests, but do everywhere else