diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-24 10:08:56 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-24 10:08:56 +0400 |
| commit | ec156a858795b7f31cac51845d9cf3197a063f92 (patch) | |
| tree | b0da6c94a24286d8ddb3da79c9cd14531f85830e /src | |
| parent | e278e871c357c4832f29629e4f65f57ff0d0ded0 (diff) | |
| download | niri-ec156a858795b7f31cac51845d9cf3197a063f92.tar.gz niri-ec156a858795b7f31cac51845d9cf3197a063f92.tar.bz2 niri-ec156a858795b7f31cac51845d9cf3197a063f92.zip | |
Add environment {} config section
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 5 | ||||
| -rw-r--r-- | src/niri.rs | 5 | ||||
| -rw-r--r-- | src/utils/spawning.rs | 14 |
3 files changed, 22 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs index cc5c7545..7f715226 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,9 @@ use niri::cli::{Cli, Sub}; use niri::dbus; use niri::ipc::client::handle_msg; use niri::niri::State; -use niri::utils::spawning::{spawn, REMOVE_ENV_RUST_BACKTRACE, REMOVE_ENV_RUST_LIB_BACKTRACE}; +use niri::utils::spawning::{ + spawn, CHILD_ENV, REMOVE_ENV_RUST_BACKTRACE, REMOVE_ENV_RUST_LIB_BACKTRACE, +}; use niri::utils::watcher::Watcher; use niri::utils::{cause_panic, version, IS_SYSTEMD_SERVICE}; use niri_config::Config; @@ -161,6 +163,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> { animation::ANIMATION_SLOWDOWN.store(slowdown, Ordering::Relaxed); let spawn_at_startup = mem::take(&mut config.spawn_at_startup); + *CHILD_ENV.write().unwrap() = mem::take(&mut config.environment); // Create the compositor. let mut event_loop = EventLoop::try_new().unwrap(); diff --git a/src/niri.rs b/src/niri.rs index ed52a2ae..acb93e64 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -104,6 +104,7 @@ use crate::ui::config_error_notification::ConfigErrorNotification; use crate::ui::exit_confirm_dialog::ExitConfirmDialog; use crate::ui::hotkey_overlay::HotkeyOverlay; use crate::ui::screenshot_ui::{ScreenshotUi, ScreenshotUiRenderElement}; +use crate::utils::spawning::CHILD_ENV; use crate::utils::{ center, get_monotonic_time, make_screenshot_path, output_size, write_png_rgba8, }; @@ -577,7 +578,7 @@ impl State { pub fn reload_config(&mut self, path: PathBuf) { let _span = tracy_client::span!("State::reload_config"); - let config = match Config::load(&path) { + let mut config = match Config::load(&path) { Ok(config) => config, Err(err) => { warn!("{:?}", err.context("error loading config")); @@ -598,6 +599,8 @@ impl State { }; animation::ANIMATION_SLOWDOWN.store(slowdown, Ordering::Relaxed); + *CHILD_ENV.write().unwrap() = mem::take(&mut config.environment); + let mut reload_xkb = None; let mut libinput_config_changed = false; let mut output_config_changed = false; diff --git a/src/utils/spawning.rs b/src/utils/spawning.rs index d212ea18..494ec997 100644 --- a/src/utils/spawning.rs +++ b/src/utils/spawning.rs @@ -4,9 +4,11 @@ use std::os::unix::process::CommandExt; use std::path::Path; use std::process::{Command, Stdio}; use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::RwLock; use std::{io, thread}; use libc::close_range; +use niri_config::Environment; use smithay::reexports::rustix; use smithay::reexports::rustix::io::{close, read, retry_on_intr, write}; use smithay::reexports::rustix::pipe::{pipe_with, PipeFlags}; @@ -15,6 +17,7 @@ use crate::utils::expand_home; pub static REMOVE_ENV_RUST_BACKTRACE: AtomicBool = AtomicBool::new(false); pub static REMOVE_ENV_RUST_LIB_BACKTRACE: AtomicBool = AtomicBool::new(false); +pub static CHILD_ENV: RwLock<Environment> = RwLock::new(Environment(Vec::new())); /// Spawns the command to run independently of the compositor. pub fn spawn<T: AsRef<OsStr> + Send + 'static>(command: Vec<T>) { @@ -67,6 +70,17 @@ fn spawn_sync(command: impl AsRef<OsStr>, args: impl IntoIterator<Item = impl As process.env_remove("RUST_LIB_BACKTRACE"); } + // Set configured environment. + let env = CHILD_ENV.read().unwrap(); + for var in &env.0 { + if let Some(value) = &var.value { + process.env(&var.name, value); + } else { + process.env_remove(&var.name); + } + } + drop(env); + // When running as a systemd session, we want to put children into their own transient scopes // in order to separate them from the niri process. This is helpful for example to prevent the // OOM killer from taking down niri together with a misbehaving client. |
