diff options
Diffstat (limited to 'src/action.rs')
-rw-r--r-- | src/action.rs | 123 |
1 files changed, 0 insertions, 123 deletions
diff --git a/src/action.rs b/src/action.rs deleted file mode 100644 index 22f088e..0000000 --- a/src/action.rs +++ /dev/null @@ -1,123 +0,0 @@ -#[derive(Debug)] -pub enum Action { - Render, - ForceRedraw, - Run(String), - UpdateFocus(crate::state::Focus), - ToggleFullscreen(usize), - Resize((u16, u16)), - Quit, -} - -pub struct Debouncer { - pending: async_std::sync::Mutex<Pending>, - cvar: async_std::sync::Condvar, -} - -impl Debouncer { - pub async fn recv(&self) -> Option<Action> { - let mut pending = self - .cvar - .wait_until(self.pending.lock().await, |pending| { - pending.has_event() - }) - .await; - pending.get_event() - } - - async fn send(&self, action: Option<Action>) { - let mut pending = self.pending.lock().await; - pending.new_event(&action); - self.cvar.notify_one(); - } -} - -#[derive(Default)] -struct Pending { - render: Option<()>, - force_redraw: Option<()>, - run: std::collections::VecDeque<String>, - focus: Option<crate::state::Focus>, - fullscreen: std::collections::VecDeque<usize>, - size: Option<(u16, u16)>, - done: bool, -} - -impl Pending { - fn new() -> Self { - Self::default() - } - - fn has_event(&self) -> bool { - self.done - || self.render.is_some() - || self.force_redraw.is_some() - || !self.run.is_empty() - || self.focus.is_some() - || !self.fullscreen.is_empty() - || self.size.is_some() - } - - fn get_event(&mut self) -> Option<Action> { - if self.size.is_some() { - return Some(Action::Resize(self.size.take().unwrap())); - } - if !self.run.is_empty() { - return Some(Action::Run(self.run.pop_front().unwrap())); - } - if self.focus.is_some() { - return Some(Action::UpdateFocus(self.focus.take().unwrap())); - } - if !self.fullscreen.is_empty() { - return Some(Action::ToggleFullscreen( - self.fullscreen.pop_front().unwrap(), - )); - } - if self.force_redraw.is_some() { - self.force_redraw.take(); - self.render.take(); - return Some(Action::ForceRedraw); - } - if self.render.is_some() { - self.render.take(); - return Some(Action::Render); - } - if self.done { - return None; - } - unreachable!() - } - - fn new_event(&mut self, action: &Option<Action>) { - match action { - Some(Action::Render) => self.render = Some(()), - Some(Action::ForceRedraw) => self.force_redraw = Some(()), - Some(Action::Run(cmd)) => self.run.push_back(cmd.to_string()), - Some(Action::UpdateFocus(focus)) => self.focus = Some(*focus), - Some(Action::ToggleFullscreen(idx)) => { - self.fullscreen.push_back(*idx); - } - Some(Action::Resize(size)) => self.size = Some(*size), - Some(Action::Quit) | None => self.done = true, - } - } -} - -pub fn debounce( - input: async_std::channel::Receiver<Action>, -) -> async_std::sync::Arc<Debouncer> { - let debouncer = std::sync::Arc::new(Debouncer { - pending: async_std::sync::Mutex::new(Pending::new()), - cvar: async_std::sync::Condvar::new(), - }); - { - let debouncer = std::sync::Arc::clone(&debouncer); - async_std::task::spawn(async move { - while let Ok(action) = input.recv().await { - debouncer.send(Some(action)).await; - } - debouncer.send(None).await; - }); - } - debouncer -} |