use std::borrow::Cow; use std::fmt::{self, Debug, Formatter}; use std::sync::Arc; use crate::term::color::Rgb; use crate::term::ClipboardType; /// Terminal event. /// /// These events instruct the UI over changes that can't be handled by the terminal emulation layer /// itself. #[derive(Clone)] pub enum Event { /// Grid has changed possibly requiring a mouse cursor shape change. MouseCursorDirty, /// Window title change. Title(String), /// Reset to the default window title. ResetTitle, /// Request to store a text string in the clipboard. ClipboardStore(ClipboardType, String), /// Request to write the contents of the clipboard to the PTY. /// /// The attached function is a formatter which will corectly transform the clipboard content /// into the expected escape sequence format. ClipboardLoad(ClipboardType, Arc String + Sync + Send + 'static>), /// Request to write the RGB value of a color to the PTY. /// /// The attached function is a formatter which will corectly transform the RGB color into the /// expected escape sequence format. ColorRequest(usize, Arc String + Sync + Send + 'static>), /// Write some text to the PTY. PtyWrite(String), /// Request to write the text area size. TextAreaSizeRequest(Arc String + Sync + Send + 'static>), /// Cursor blinking state has changed. CursorBlinkingChange, /// New terminal content available. Wakeup, /// Terminal bell ring. Bell, /// Shutdown request. Exit, } impl Debug for Event { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { match self { Event::ClipboardStore(ty, text) => write!(f, "ClipboardStore({:?}, {})", ty, text), Event::ClipboardLoad(ty, _) => write!(f, "ClipboardLoad({:?})", ty), Event::TextAreaSizeRequest(_) => write!(f, "TextAreaSizeRequest"), Event::ColorRequest(index, _) => write!(f, "ColorRequest({})", index), Event::PtyWrite(text) => write!(f, "PtyWrite({})", text), Event::Title(title) => write!(f, "Title({})", title), Event::CursorBlinkingChange => write!(f, "CursorBlinkingChange"), Event::MouseCursorDirty => write!(f, "MouseCursorDirty"), Event::ResetTitle => write!(f, "ResetTitle"), Event::Wakeup => write!(f, "Wakeup"), Event::Bell => write!(f, "Bell"), Event::Exit => write!(f, "Exit"), } } } /// Byte sequences are sent to a `Notify` in response to some events. pub trait Notify { /// Notify that an escape sequence should be written to the PTY. /// /// TODO this needs to be able to error somehow. fn notify>>(&self, _: B); } #[derive(Copy, Clone, Debug)] pub struct WindowSize { pub num_lines: u16, pub num_cols: u16, pub cell_width: u16, pub cell_height: u16, } /// Types that are interested in when the display is resized. pub trait OnResize { fn on_resize(&mut self, window_size: WindowSize); } /// Event Loop for notifying the renderer about terminal events. pub trait EventListener { fn send_event(&self, _event: Event) {} } /// Null sink for events. pub struct VoidListener; impl EventListener for VoidListener {}