supercode_frontend_tui/terminal/
event_stream.rs1use crossterm::event::Event;
10use crossterm::event::KeyEvent;
11
12#[derive(Clone, Debug, Eq, PartialEq)]
14pub enum TerminalEvent {
15 Key(KeyEvent),
16 Paste(String),
17 Resize { width: u16, height: u16 },
18 FocusChanged(bool),
19}
20
21pub fn map_crossterm_event(event: Event) -> Option<TerminalEvent> {
23 match event {
24 Event::Key(key) => Some(TerminalEvent::Key(key)),
25 Event::Paste(text) => Some(TerminalEvent::Paste(text)),
26 Event::Resize(width, height) => Some(TerminalEvent::Resize { width, height }),
27 Event::FocusGained => Some(TerminalEvent::FocusChanged(true)),
28 Event::FocusLost => Some(TerminalEvent::FocusChanged(false)),
29 Event::Mouse(_) => None,
30 }
31}
32
33#[derive(Clone, Copy, Debug, Eq, PartialEq)]
35pub struct TerminalState {
36 pub width: u16,
37 pub height: u16,
38 pub focused: bool,
39}
40
41impl TerminalState {
42 pub const fn new(width: u16, height: u16) -> Self {
43 Self {
44 width,
45 height,
46 focused: true,
47 }
48 }
49
50 pub fn apply(&mut self, event: &TerminalEvent) -> bool {
52 match event {
53 TerminalEvent::Resize { width, height } => {
54 let changed = self.width != *width || self.height != *height;
55 self.width = *width;
56 self.height = *height;
57 changed
58 }
59 TerminalEvent::FocusChanged(focused) => {
60 let changed = self.focused != *focused;
61 self.focused = *focused;
62 changed
63 }
64 TerminalEvent::Key(_) | TerminalEvent::Paste(_) => false,
65 }
66 }
67}