use std::ffi::OsString; use crossterm::event::KeyEvent; use tokio::sync::{mpsc, oneshot}; use super::Exec; use crate::{term::Term, Layer, RoCell}; static TX: RoCell> = RoCell::new(); #[derive(Debug)] pub enum Event { Call(Vec, Layer), Render, Key(KeyEvent), Resize, Paste(String), Quit(EventQuit), } #[derive(Debug, Default)] pub struct EventQuit { pub no_cwd_file: bool, pub selected: Option, } impl Event { #[inline] pub fn init(tx: mpsc::UnboundedSender) { TX.init(tx); } #[inline] pub fn emit(self) { TX.send(self).ok(); } #[inline] pub async fn wait(self, rx: oneshot::Receiver) -> T { TX.send(self).ok(); rx.await.unwrap_or_else(|_| Term::goodbye(|| false)) } } #[macro_export] macro_rules! emit { (Quit($opt:expr)) => { $crate::event::Event::Quit($opt).emit(); }; (Call($exec:expr, $layer:expr)) => { $crate::event::Event::Call($exec, $layer).emit(); }; ($event:ident) => { $crate::event::Event::$event.emit(); }; }