termsnap_lib/
ansi.rs

1use alacritty_terminal::vte::ansi::{self, Handler};
2
3use crate::{PtyWriter, Term};
4
5pub enum AnsiSignal {
6    /// Clear the entire terminal screen.
7    ClearScreen,
8    /// Enable or disable the alternate terminal screen buffer.
9    AlternateScreenBuffer { enable: bool },
10}
11
12pub(crate) struct HandlerWrapper<'t, W: PtyWriter> {
13    pub term: &'t mut Term<W>,
14    pub cb: &'t mut dyn FnMut(&Term<W>, AnsiSignal),
15}
16
17impl<'t, W: PtyWriter> Handler for HandlerWrapper<'t, W> {
18    fn set_title(&mut self, p: Option<String>) {
19        self.term.term.set_title(p)
20    }
21    fn set_cursor_style(&mut self, p: Option<ansi::CursorStyle>) {
22        self.term.term.set_cursor_style(p)
23    }
24    fn set_cursor_shape(&mut self, p: ansi::CursorShape) {
25        self.term.term.set_cursor_shape(p)
26    }
27    fn input(&mut self, p: char) {
28        self.term.term.input(p)
29    }
30    fn goto(&mut self, p1: i32, p2: usize) {
31        self.term.term.goto(p1, p2)
32    }
33    fn goto_line(&mut self, p: i32) {
34        self.term.term.goto_line(p)
35    }
36    fn goto_col(&mut self, p: usize) {
37        self.term.term.goto_col(p)
38    }
39    fn insert_blank(&mut self, p: usize) {
40        self.term.term.insert_blank(p)
41    }
42    fn move_up(&mut self, p: usize) {
43        self.term.term.move_up(p)
44    }
45    fn move_down(&mut self, p: usize) {
46        self.term.term.move_down(p)
47    }
48    fn identify_terminal(&mut self, p: Option<char>) {
49        self.term.term.identify_terminal(p)
50    }
51    fn device_status(&mut self, p: usize) {
52        self.term.term.device_status(p)
53    }
54    fn move_forward(&mut self, p: usize) {
55        self.term.term.move_forward(p)
56    }
57    fn move_backward(&mut self, p: usize) {
58        self.term.term.move_backward(p)
59    }
60    fn move_down_and_cr(&mut self, p: usize) {
61        self.term.term.move_down_and_cr(p)
62    }
63    fn move_up_and_cr(&mut self, p: usize) {
64        self.term.term.move_up_and_cr(p)
65    }
66    fn put_tab(&mut self, p: u16) {
67        self.term.term.put_tab(p)
68    }
69    fn backspace(&mut self) {
70        self.term.term.backspace()
71    }
72    fn carriage_return(&mut self) {
73        self.term.term.carriage_return()
74    }
75    fn linefeed(&mut self) {
76        self.term.term.linefeed()
77    }
78    fn bell(&mut self) {
79        self.term.term.bell()
80    }
81    fn substitute(&mut self) {
82        self.term.term.substitute()
83    }
84    fn newline(&mut self) {
85        self.term.term.newline()
86    }
87    fn set_horizontal_tabstop(&mut self) {
88        self.term.term.set_horizontal_tabstop()
89    }
90    fn scroll_up(&mut self, p: usize) {
91        self.term.term.scroll_up(p)
92    }
93    fn scroll_down(&mut self, p: usize) {
94        self.term.term.scroll_down(p)
95    }
96    fn insert_blank_lines(&mut self, p: usize) {
97        self.term.term.insert_blank_lines(p)
98    }
99    fn delete_lines(&mut self, p: usize) {
100        self.term.term.delete_lines(p)
101    }
102    fn erase_chars(&mut self, p: usize) {
103        self.term.term.erase_chars(p)
104    }
105    fn delete_chars(&mut self, p: usize) {
106        self.term.term.delete_chars(p)
107    }
108    fn move_backward_tabs(&mut self, p: u16) {
109        self.term.term.move_backward_tabs(p)
110    }
111    fn move_forward_tabs(&mut self, p: u16) {
112        self.term.term.move_forward_tabs(p)
113    }
114    fn save_cursor_position(&mut self) {
115        self.term.term.save_cursor_position()
116    }
117    fn restore_cursor_position(&mut self) {
118        self.term.term.restore_cursor_position()
119    }
120    fn clear_line(&mut self, p: ansi::LineClearMode) {
121        self.term.term.clear_line(p)
122    }
123    fn clear_screen(&mut self, p: ansi::ClearMode) {
124        (self.cb)(&self.term, AnsiSignal::ClearScreen);
125
126        self.term.term.clear_screen(p)
127    }
128    fn clear_tabs(&mut self, p: ansi::TabulationClearMode) {
129        self.term.term.clear_tabs(p)
130    }
131    fn reset_state(&mut self) {
132        self.term.term.reset_state()
133    }
134    fn reverse_index(&mut self) {
135        self.term.term.reverse_index()
136    }
137    fn terminal_attribute(&mut self, p: ansi::Attr) {
138        self.term.term.terminal_attribute(p)
139    }
140    fn set_mode(&mut self, p: ansi::Mode) {
141        self.term.term.set_mode(p)
142    }
143    fn unset_mode(&mut self, p: ansi::Mode) {
144        self.term.term.unset_mode(p)
145    }
146    fn report_mode(&mut self, p: ansi::Mode) {
147        self.term.term.report_mode(p)
148    }
149    fn set_private_mode(&mut self, p: ansi::PrivateMode) {
150        if matches!(
151            p,
152            ansi::PrivateMode::Named(ansi::NamedPrivateMode::SwapScreenAndSetRestoreCursor)
153        ) {
154            (self.cb)(
155                &self.term,
156                AnsiSignal::AlternateScreenBuffer { enable: true },
157            );
158        }
159
160        self.term.term.set_private_mode(p)
161    }
162    fn unset_private_mode(&mut self, p: ansi::PrivateMode) {
163        if matches!(
164            p,
165            ansi::PrivateMode::Named(ansi::NamedPrivateMode::SwapScreenAndSetRestoreCursor)
166        ) {
167            (self.cb)(
168                &self.term,
169                AnsiSignal::AlternateScreenBuffer { enable: false },
170            );
171        }
172
173        self.term.term.unset_private_mode(p)
174    }
175    fn report_private_mode(&mut self, p: ansi::PrivateMode) {
176        self.term.term.report_private_mode(p)
177    }
178    fn set_scrolling_region(&mut self, p1: usize, p2: Option<usize>) {
179        self.term.term.set_scrolling_region(p1, p2)
180    }
181    fn set_keypad_application_mode(&mut self) {
182        self.term.term.set_keypad_application_mode()
183    }
184    fn unset_keypad_application_mode(&mut self) {
185        self.term.term.unset_keypad_application_mode()
186    }
187    fn set_active_charset(&mut self, p: ansi::CharsetIndex) {
188        self.term.term.set_active_charset(p)
189    }
190    fn configure_charset(&mut self, p1: ansi::CharsetIndex, p2: ansi::StandardCharset) {
191        self.term.term.configure_charset(p1, p2)
192    }
193    fn set_color(&mut self, p1: usize, p2: ansi::Rgb) {
194        self.term.term.set_color(p1, p2)
195    }
196    fn dynamic_color_sequence(&mut self, p1: String, p2: usize, p3: &str) {
197        self.term.term.dynamic_color_sequence(p1, p2, p3)
198    }
199    fn reset_color(&mut self, p: usize) {
200        self.term.term.reset_color(p)
201    }
202    fn clipboard_store(&mut self, p1: u8, p2: &[u8]) {
203        self.term.term.clipboard_store(p1, p2)
204    }
205    fn clipboard_load(&mut self, p1: u8, p2: &str) {
206        self.term.term.clipboard_load(p1, p2)
207    }
208    fn decaln(&mut self) {
209        self.term.term.decaln()
210    }
211    fn push_title(&mut self) {
212        self.term.term.push_title()
213    }
214    fn pop_title(&mut self) {
215        self.term.term.pop_title()
216    }
217    fn text_area_size_pixels(&mut self) {
218        self.term.term.text_area_size_pixels()
219    }
220    fn text_area_size_chars(&mut self) {
221        self.term.term.text_area_size_chars()
222    }
223    fn set_hyperlink(&mut self, p: Option<ansi::Hyperlink>) {
224        self.term.term.set_hyperlink(p)
225    }
226    fn set_mouse_cursor_icon(&mut self, p: ansi::cursor_icon::CursorIcon) {
227        self.term.term.set_mouse_cursor_icon(p)
228    }
229    fn report_keyboard_mode(&mut self) {
230        self.term.term.report_keyboard_mode()
231    }
232    fn push_keyboard_mode(&mut self, p: ansi::KeyboardModes) {
233        self.term.term.push_keyboard_mode(p)
234    }
235    fn pop_keyboard_modes(&mut self, p: u16) {
236        self.term.term.pop_keyboard_modes(p)
237    }
238    fn set_keyboard_mode(&mut self, p1: ansi::KeyboardModes, p2: ansi::KeyboardModesApplyBehavior) {
239        self.term.term.set_keyboard_mode(p1, p2)
240    }
241    fn set_modify_other_keys(&mut self, p: ansi::ModifyOtherKeys) {
242        self.term.term.set_modify_other_keys(p)
243    }
244    fn report_modify_other_keys(&mut self) {
245        self.term.term.report_modify_other_keys()
246    }
247}