mirror of
https://github.com/YaLTeR/niri.git
synced 2024-09-11 12:35:58 +03:00
Add initial session / systemd integration
This commit is contained in:
parent
99484afe52
commit
d268cfcf9f
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -813,6 +813,7 @@ dependencies = [
|
|||||||
"clap",
|
"clap",
|
||||||
"keyframe",
|
"keyframe",
|
||||||
"profiling",
|
"profiling",
|
||||||
|
"sd-notify",
|
||||||
"smithay",
|
"smithay",
|
||||||
"smithay-drm-extras",
|
"smithay-drm-extras",
|
||||||
"tracing",
|
"tracing",
|
||||||
@ -1186,6 +1187,12 @@ version = "1.0.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
|
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sd-notify"
|
||||||
|
version = "0.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "621e3680f3e07db4c9c2c3fb07c6223ab2fab2e54bd3c04c3ae037990f428c32"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sharded-slab"
|
name = "sharded-slab"
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
|
@ -12,6 +12,7 @@ bitflags = "2.3.3"
|
|||||||
clap = { version = "4.3.21", features = ["derive"] }
|
clap = { version = "4.3.21", features = ["derive"] }
|
||||||
keyframe = { version = "1.1.1", default-features = false }
|
keyframe = { version = "1.1.1", default-features = false }
|
||||||
profiling = "1.0.9"
|
profiling = "1.0.9"
|
||||||
|
sd-notify = "0.4.1"
|
||||||
smithay-drm-extras = { version = "0.1.0", path = "../smithay/smithay-drm-extras" }
|
smithay-drm-extras = { version = "0.1.0", path = "../smithay/smithay-drm-extras" }
|
||||||
tracing = "0.1.37"
|
tracing = "0.1.37"
|
||||||
tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
|
||||||
|
30
resources/niri-session
Executable file
30
resources/niri-session
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Make sure there's no already running session.
|
||||||
|
if systemctl --user -q is-active niri.service; then
|
||||||
|
echo 'A niri session is already running.'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Reset failed state of all user units.
|
||||||
|
systemctl --user reset-failed
|
||||||
|
|
||||||
|
# Set the current desktop for xdg-desktop-portal.
|
||||||
|
export XDG_CURRENT_DESKTOP=niri
|
||||||
|
|
||||||
|
# Ensure the session type is set to Wayland for xdg-autostart apps.
|
||||||
|
export XDG_SESSION_TYPE=wayland
|
||||||
|
|
||||||
|
# Import the login manager environment.
|
||||||
|
systemctl --user import-environment
|
||||||
|
|
||||||
|
# DBus activation environment is independent from systemd. While most of
|
||||||
|
# dbus-activated services are already using `SystemdService` directive, some
|
||||||
|
# still don't and thus we should set the dbus environment with a separate
|
||||||
|
# command.
|
||||||
|
if hash dbus-update-activation-environment 2>/dev/null; then
|
||||||
|
dbus-update-activation-environment --all
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start niri and wait for it to terminate.
|
||||||
|
exec systemctl --user --wait start niri.service
|
6
resources/niri.desktop
Normal file
6
resources/niri.desktop
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Name=Niri
|
||||||
|
Comment=A scrollable-tiling Wayland compositor
|
||||||
|
Exec=niri-session
|
||||||
|
Type=Application
|
||||||
|
DesktopNames=niri
|
9
resources/niri.service
Normal file
9
resources/niri.service
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=A scrollable-tiling Wayland compositor
|
||||||
|
BindsTo=graphical-session.target
|
||||||
|
Wants=graphical-session-pre.target
|
||||||
|
After=graphical-session-pre.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
ExecStart=/usr/bin/niri
|
@ -19,6 +19,7 @@ use std::ffi::OsString;
|
|||||||
use backend::Backend;
|
use backend::Backend;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use niri::Niri;
|
use niri::Niri;
|
||||||
|
use sd_notify::NotifyState;
|
||||||
use smithay::reexports::calloop::EventLoop;
|
use smithay::reexports::calloop::EventLoop;
|
||||||
use smithay::reexports::wayland_server::{Display, DisplayHandle};
|
use smithay::reexports::wayland_server::{Display, DisplayHandle};
|
||||||
use tracing_subscriber::EnvFilter;
|
use tracing_subscriber::EnvFilter;
|
||||||
@ -121,4 +122,9 @@ fn main() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
// Tell systemd we're stopping.
|
||||||
|
if let Err(err) = sd_notify::notify(false, &[NotifyState::Stopping]) {
|
||||||
|
warn!("error notifying systemd: {err:?}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
23
src/niri.rs
23
src/niri.rs
@ -1,8 +1,10 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::os::unix::io::AsRawFd;
|
use std::os::unix::io::AsRawFd;
|
||||||
|
use std::process::Command;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use sd_notify::NotifyState;
|
||||||
use smithay::backend::renderer::element::surface::{
|
use smithay::backend::renderer::element::surface::{
|
||||||
render_elements_from_surface_tree, WaylandSurfaceRenderElement,
|
render_elements_from_surface_tree, WaylandSurfaceRenderElement,
|
||||||
};
|
};
|
||||||
@ -149,6 +151,27 @@ impl Niri {
|
|||||||
socket_name.to_string_lossy()
|
socket_name.to_string_lossy()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if std::env::var_os("NOTIFY_SOCKET").is_some() {
|
||||||
|
// We're starting as a systemd service. Export our variables and tell systemd we're
|
||||||
|
// ready.
|
||||||
|
let rv = Command::new("/bin/sh")
|
||||||
|
.args([
|
||||||
|
"-c",
|
||||||
|
"systemctl --user import-environment WAYLAND_DISPLAY && \
|
||||||
|
hash dbus-update-activation-environment 2>/dev/null && \
|
||||||
|
dbus-update-activation-environment WAYLAND_DISPLAY",
|
||||||
|
])
|
||||||
|
.spawn();
|
||||||
|
if let Err(err) = rv {
|
||||||
|
warn!("error spawning shell to import environment into systemd: {err:?}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify systemd we're ready.
|
||||||
|
if let Err(err) = sd_notify::notify(false, &[NotifyState::Ready]) {
|
||||||
|
warn!("error notifying systemd: {err:?}");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
let display_source = Generic::new(
|
let display_source = Generic::new(
|
||||||
display.backend().poll_fd().as_raw_fd(),
|
display.backend().poll_fd().as_raw_fd(),
|
||||||
Interest::READ,
|
Interest::READ,
|
||||||
|
Loading…
Reference in New Issue
Block a user