summaryrefslogtreecommitdiffstats
path: root/src/shell/inputs/signals.rs
blob: 4b912739bbe2ff64b785d10fafc6d629bcad987e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use crate::shell::prelude::*;

pub struct Handler;

impl Handler {
    pub fn new(event_w: crate::shell::event::Writer) -> Result<Self> {
        let signals = tokio::signal::unix::signal(
            tokio::signal::unix::SignalKind::window_change(),
        )?;
        tokio::spawn(Self::task(signals, event_w));
        Ok(Self)
    }

    async fn task(
        mut signals: tokio::signal::unix::Signal,
        event_w: crate::shell::event::Writer,
    ) {
        event_w.send(resize_event());
        while signals.recv().await.is_some() {
            event_w.send(resize_event());
        }
    }
}

fn resize_event() -> Event {
    Event::Resize(terminal_size::terminal_size().map_or(
        (24, 80),
        |(terminal_size::Width(w), terminal_size::Height(h))| (h, w),
    ))
}