aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-02-20 13:54:16 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-02-21 07:27:49 +0400
commitd58a45a96c2fce2602224cd246b3576d0c975cf3 (patch)
tree025af22a48cc4b778f17c22a9c901071e7f0195e
parent9f1b4ee2996bc75ba521e9d80f001c98e379b231 (diff)
downloadniri-d58a45a96c2fce2602224cd246b3576d0c975cf3.tar.gz
niri-d58a45a96c2fce2602224cd246b3576d0c975cf3.tar.bz2
niri-d58a45a96c2fce2602224cd246b3576d0c975cf3.zip
Add systemd feature flag for systemd-specific things
-rw-r--r--Cargo.toml6
-rw-r--r--src/main.rs19
-rw-r--r--src/niri.rs2
-rw-r--r--src/utils.rs4
4 files changed, 22 insertions, 9 deletions
diff --git a/Cargo.toml b/Cargo.toml
index cd2e2b35..292dd5fe 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -97,9 +97,11 @@ proptest-derive = "0.4.0"
xshell = "0.2.5"
[features]
-default = ["dbus", "xdp-gnome-screencast"]
-# Enables DBus support (required for xdp-gnome and power button inhibiting).
+default = ["dbus", "systemd", "xdp-gnome-screencast"]
+# Enables D-Bus support (serve various freedesktop and GNOME interfaces, power button handling).
dbus = ["zbus", "async-channel", "async-io", "notify-rust", "url"]
+# Enables systemd integration (global environment, apps in transient scopes).
+systemd = ["dbus"]
# Enables screencasting support through xdg-desktop-portal-gnome.
xdp-gnome-screencast = ["dbus", "pipewire"]
# Enables the Tracy profiler instrumentation.
diff --git a/src/main.rs b/src/main.rs
index 275d747b..a19abfa2 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -38,7 +38,15 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
REMOVE_ENV_RUST_LIB_BACKTRACE.store(true, Ordering::Relaxed);
}
- IS_SYSTEMD_SERVICE.store(env::var_os("NOTIFY_SOCKET").is_some(), Ordering::Relaxed);
+ if env::var_os("NOTIFY_SOCKET").is_some() {
+ IS_SYSTEMD_SERVICE.store(true, Ordering::Relaxed);
+
+ #[cfg(not(feature = "systemd"))]
+ warn!(
+ "running as a systemd service, but systemd support is compiled out. \
+ Are you sure you did not forget to set `--features systemd`?"
+ );
+ }
let directives = env::var("RUST_LOG").unwrap_or_else(|_| "niri=debug".to_owned());
let env_filter = EnvFilter::builder().parse_lossy(directives);
@@ -249,11 +257,16 @@ fn import_environment() {
]
.join(" ");
+ #[cfg(feature = "systemd")]
+ let systemctl = format!("systemctl --user import-environment {variables} && ");
+ #[cfg(not(feature = "systemd"))]
+ let systemctl = String::new();
+
let rv = Command::new("/bin/sh")
.args([
"-c",
&format!(
- "systemctl --user import-environment {variables} && \
+ "{systemctl}\
hash dbus-update-activation-environment 2>/dev/null && \
dbus-update-activation-environment {variables}"
),
@@ -273,7 +286,7 @@ fn import_environment() {
}
},
Err(err) => {
- warn!("error spawning shell to import environment into systemd: {err:?}");
+ warn!("error spawning shell to import environment: {err:?}");
}
}
}
diff --git a/src/niri.rs b/src/niri.rs
index 35337653..d88893a9 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -1063,8 +1063,6 @@ impl Niri {
pub fn inhibit_power_key(&mut self) -> anyhow::Result<()> {
let conn = zbus::blocking::ConnectionBuilder::system()?.build()?;
- // logind-zbus has a wrong signature for this method, so do it manually.
- // https://gitlab.com/flukejones/logind-zbus/-/merge_requests/5
let message = conn.call_method(
Some("org.freedesktop.login1"),
"/org/freedesktop/login1",
diff --git a/src/utils.rs b/src/utils.rs
index 298dace1..5801de9e 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -229,7 +229,7 @@ fn spawn_sync(command: impl AsRef<OsStr>, args: impl IntoIterator<Item = impl As
trace!("spawned PID: {pid}");
// Start a systemd scope for the grandchild.
- #[cfg(feature = "dbus")]
+ #[cfg(feature = "systemd")]
if let Err(err) = start_systemd_scope(command, child.id(), pid as u32) {
trace!("error starting systemd scope for spawned command: {err:?}");
}
@@ -292,7 +292,7 @@ pub static IS_SYSTEMD_SERVICE: AtomicBool = AtomicBool::new(false);
///
/// This separates the pid from the compositor scope, which for example prevents the OOM killer
/// from bringing down the compositor together with a misbehaving client.
-#[cfg(feature = "dbus")]
+#[cfg(feature = "systemd")]
fn start_systemd_scope(name: &OsStr, intermediate_pid: u32, child_pid: u32) -> anyhow::Result<()> {
use std::fmt::Write as _;
use std::path::Path;