i3status_rs/
signals.rs

1use futures::stream::StreamExt as _;
2use libc::{SIGRTMAX, SIGRTMIN};
3use signal_hook::consts::{SIGUSR1, SIGUSR2};
4use signal_hook_tokio::Signals;
5
6use crate::BoxedStream;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum Signal {
10    Usr1,
11    Usr2,
12    Custom(i32),
13}
14
15/// Returns an infinite stream of `Signal`s
16pub fn signals_stream() -> BoxedStream<Signal> {
17    let (sigmin, sigmax) = (SIGRTMIN(), SIGRTMAX());
18    let signals = Signals::new((sigmin..sigmax).chain([SIGUSR1, SIGUSR2])).unwrap();
19    signals
20        .map(move |signal| match signal {
21            SIGUSR1 => Signal::Usr1,
22            SIGUSR2 => Signal::Usr2,
23            x => Signal::Custom(x - sigmin),
24        })
25        .boxed()
26}