1use alacritty_terminal::vte::ansi::{self, Handler};
2
3use crate::{PtyWriter, Term};
4
5pub enum AnsiSignal {
6 ClearScreen,
8 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}