rat_event/
crossterm.rs

1//! Support for the [ct_event!](macro.ct_event.html) macro.
2
3#![allow(dead_code)]
4
5/// A copy of the crossterm-KeyModifiers. Plus a few combinations of modifiers.
6pub mod modifiers {
7    use crossterm::event::KeyModifiers;
8
9    pub const NONE: KeyModifiers = KeyModifiers::NONE;
10    pub const CONTROL: KeyModifiers = KeyModifiers::CONTROL;
11    pub const SHIFT: KeyModifiers = KeyModifiers::SHIFT;
12    pub const ALT: KeyModifiers = KeyModifiers::ALT;
13    pub const META: KeyModifiers = KeyModifiers::META;
14    pub const SUPER: KeyModifiers = KeyModifiers::SUPER;
15    pub const HYPER: KeyModifiers = KeyModifiers::HYPER;
16    pub const CONTROL_ALT: KeyModifiers = KeyModifiers::from_bits_truncate(0b0000_0110);
17    pub const CONTROL_SHIFT: KeyModifiers = KeyModifiers::from_bits_truncate(0b0000_0011);
18    pub const ALT_SHIFT: KeyModifiers = KeyModifiers::from_bits_truncate(0b0000_0101);
19}
20
21/// This macro produces pattern matches for crossterm events.
22///
23/// Example:
24/// ```rust ignore
25/// match event {
26///     ct_event!(keycode press Left) => self.move_to_prev(false),
27///     ct_event!(keycode press Right) => self .move_to_next(false),
28///     ct_event!(keycode press CONTROL-Left) => {
29///         let pos = self.prev_word_boundary();
30///         self.set_cursor(pos, false);
31///     }
32///     ct_event!(keycode press CONTROL_SHIFT-Left) => {
33///         let pos = self.prev_word_boundary();
34///         self.set_cursor(pos, true);
35///     }
36///     ct_event!(key press CONTROL-'a') => self.set_selection(0, self.len()),
37///     ct_event!(key press c) | ct_event!(key press SHIFT-c) => self.insert_char( * c),
38///
39///     ct_event!(mouse down Left for column,row) => {
40///         // ...
41///     }
42///     ct_event!(mouse drag Left for column, _row) => {
43///         // ...
44///     }
45///     ct_event!(mouse moved) => {
46///         // ...
47///     }
48/// }
49/// ```
50///
51/// __Caveat__
52/// press covers both KeyEventKind::Press and KeyEventKind::Repeat
53/// which is probably what you expect. This macro doesn't cover
54/// the case where those two need to be distinguished.
55///
56///
57/// Syntax:
58/// ```bnf
59/// "key" ("press"|"release") (modifier "-")? "'" char "'"
60/// "keycode" ("press"|"release") (modifier "-")? keycode
61/// "mouse" ("down"|"up"|"drag") (modifier "-")? button "for" col_id "," row_id
62/// "mouse" "any" (modifier)? ("for" mouseevt)?
63/// "mouse" "moved" ("for" col_id "," row_id)?
64/// "scroll" ("up"|"down") "for" col_id "," row_id
65/// "resized" "for" cols_id "," rows_id
66/// "focus_gained"
67/// "focus_lost"
68/// "paste" identifier
69/// ```
70///
71/// where
72///
73/// ```bnf
74/// modifier := <<one of the KeyModifiers's>> | "CONTROL_SHIFT" | "ALT_SHIFT"
75/// char := <<some character>>
76/// keycode := <<one of the defined KeyCode's>>
77/// button := <<one of the defined MouseButton's>>
78/// ```
79///
80/// __Caveat__
81/// `ct_event!(key press SHIFT-'f')` doesn't work. It must be
82/// `ct_event!(key press SHIFT-'F')` with capital F. This holds for
83/// any combination of SHIFT too.
84///
85#[macro_export]
86macro_rules! ct_event {
87    (key press $keychar:pat) => {
88        crossterm::event::Event::Key(crossterm::event::KeyEvent {
89            code: crossterm::event::KeyCode::Char($keychar),
90            modifiers: $crate::crossterm::modifiers::NONE,
91            kind: crossterm::event::KeyEventKind::Press|crossterm::event::KeyEventKind::Repeat,
92            ..
93        })
94    };
95    (key press ANY-$keychar:pat) => {
96        crossterm::event::Event::Key(crossterm::event::KeyEvent {
97            code: crossterm::event::KeyCode::Char($keychar),
98            kind: crossterm::event::KeyEventKind::Press|crossterm::event::KeyEventKind::Repeat,
99            ..
100        })
101    };
102    (key press $mod:ident-$keychar:pat) => {
103        crossterm::event::Event::Key(crossterm::event::KeyEvent {
104            code: crossterm::event::KeyCode::Char($keychar),
105            modifiers: $crate::crossterm::modifiers::$mod,
106            kind: crossterm::event::KeyEventKind::Press|crossterm::event::KeyEventKind::Repeat,
107            ..
108        })
109    };
110    (key release $keychar:pat) => {
111        crossterm::event::Event::Key(crossterm::event::KeyEvent {
112            code: crossterm::event::KeyCode::Char($keychar),
113            modifiers: $crate::crossterm::modifiers::NONE,
114            kind: crossterm::event::KeyEventKind::Release,
115            ..
116        })
117    };
118    (key release ANY-$keychar:pat) => {
119        crossterm::event::Event::Key(crossterm::event::KeyEvent {
120            code: crossterm::event::KeyCode::Char($keychar),
121            kind: crossterm::event::KeyEventKind::Release,
122            ..
123        })
124    };
125    (key release $mod:ident-$keychar:pat) => {
126        crossterm::event::Event::Key(crossterm::event::KeyEvent {
127            code: crossterm::event::KeyCode::Char($keychar),
128            modifiers: $crate::crossterm::modifiers::$mod,
129            kind: crossterm::event::KeyEventKind::Release,
130            ..
131        })
132    };
133
134    (keycode press F($code:literal)) => {
135        crossterm::event::Event::Key(crossterm::event::KeyEvent {
136            code: crossterm::event::KeyCode::F($code),
137            modifiers: $crate::crossterm::modifiers::NONE,
138            kind: crossterm::event::KeyEventKind::Press|crossterm::event::KeyEventKind::Repeat,
139            ..
140        })
141    };
142    (keycode press $mod:ident-F($code:literal)) => {
143        crossterm::event::Event::Key(crossterm::event::KeyEvent {
144            code: crossterm::event::KeyCode::F($code),
145            modifiers: $crate::crossterm::modifiers::$mod,
146            kind: crossterm::event::KeyEventKind::Press|crossterm::event::KeyEventKind::Repeat,
147            ..
148        })
149    };
150    (keycode press $code:ident) => {
151        crossterm::event::Event::Key(crossterm::event::KeyEvent {
152            code: crossterm::event::KeyCode::$code,
153            modifiers: $crate::crossterm::modifiers::NONE,
154            kind: crossterm::event::KeyEventKind::Press|crossterm::event::KeyEventKind::Repeat,
155            ..
156        })
157    };
158    (keycode press $mod:ident-$code:ident) => {
159        crossterm::event::Event::Key(crossterm::event::KeyEvent {
160            code: crossterm::event::KeyCode::$code,
161            modifiers: $crate::crossterm::modifiers::$mod,
162            kind: crossterm::event::KeyEventKind::Press|crossterm::event::KeyEventKind::Repeat,
163            ..
164        })
165    };
166    (keycode release F($code:literal)) => {
167        crossterm::event::Event::Key(crossterm::event::KeyEvent {
168            code: crossterm::event::KeyCode::F($code),
169            modifiers: $crate::crossterm::modifiers::NONE,
170            kind: crossterm::event::KeyEventKind::Release,
171            ..
172        })
173    };
174    (keycode release $mod:ident-F($code:literal)) => {
175        crossterm::event::Event::Key(crossterm::event::KeyEvent {
176            code: crossterm::event::KeyCode::F($code),
177            modifiers: $crate::crossterm::modifiers::$mod,
178            kind: crossterm::event::KeyEventKind::Release,
179            ..
180        })
181    };
182    (keycode release $code:ident) => {
183        crossterm::event::Event::Key(crossterm::event::KeyEvent {
184            code: crossterm::event::KeyCode::$code,
185            modifiers: $crate::crossterm::modifiers::NONE,
186            kind: crossterm::event::KeyEventKind::Release,
187            ..
188        })
189    };
190    (keycode release $mod:ident-$code:ident) => {
191        crossterm::event::Event::Key(crossterm::event::KeyEvent {
192            code: crossterm::event::KeyCode::$code,
193            modifiers: $crate::crossterm::modifiers::$mod,
194            kind: crossterm::event::KeyEventKind::Release,
195            ..
196        })
197    };
198
199    (mouse down $button:ident for $col:ident, $row:ident ) => {
200        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
201            kind: crossterm::event::MouseEventKind::Down(crossterm::event::MouseButton::$button),
202            column: $col,
203            row: $row,
204            modifiers: $crate::crossterm::modifiers::NONE,
205        })
206    };
207    (mouse down $mod:ident-$button:ident for $col:ident, $row:ident ) => {
208        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
209            kind: crossterm::event::MouseEventKind::Down(crossterm::event::MouseButton::$button),
210            column: $col,
211            row: $row,
212            modifiers: $crate::crossterm::modifiers::$mod,
213        })
214    };
215    (mouse up $button:ident for $col:ident, $row:ident ) => {
216        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
217            kind: crossterm::event::MouseEventKind::Up(crossterm::event::MouseButton::$button),
218            column: $col,
219            row: $row,
220            modifiers: $crate::crossterm::modifiers::NONE,
221        })
222    };
223    (mouse up $mod:ident-$button:ident for $col:ident, $row:ident ) => {
224        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
225            kind: crossterm::event::MouseEventKind::Up(crossterm::event::MouseButton::$button),
226            column: $col,
227            row: $row,
228            modifiers: $crate::crossterm::modifiers::$mod,
229        })
230    };
231    (mouse drag $button:ident for $col:ident, $row:ident ) => {
232        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
233            kind: crossterm::event::MouseEventKind::Drag(crossterm::event::MouseButton::$button),
234            column: $col,
235            row: $row,
236            modifiers: $crate::crossterm::modifiers::NONE,
237        })
238    };
239    (mouse drag $mod:ident-$button:ident for $col:ident, $row:ident ) => {
240        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
241            kind: crossterm::event::MouseEventKind::Drag(crossterm::event::MouseButton::$button),
242            column: $col,
243            row: $row,
244            modifiers: $crate::crossterm::modifiers::$mod,
245        })
246    };
247
248
249    (mouse any for $mouse:ident) => {
250        crossterm::event::Event::Mouse($mouse)
251    };
252    (mouse any $mod:ident for $mouse:ident ) => {
253        crossterm::event::Event::Mouse($mouse @ crossterm::event::MouseEvent {
254            modifiers: $crate::crossterm::modifiers::$mod,
255            ..
256        })
257    };
258
259    (mouse moved ) => {
260        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
261            kind: crossterm::event::MouseEventKind::Moved,
262            modifiers: $crate::crossterm::modifiers::NONE,
263            ..
264        })
265    };
266    (mouse moved for $col:ident, $row:ident) => {
267        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
268            kind: crossterm::event::MouseEventKind::Moved,
269            column: $col,
270            row: $row,
271            modifiers: $crate::crossterm::modifiers::NONE,
272        })
273    };
274
275    (scroll $mod:ident down for $col:ident, $row:ident) => {
276        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
277            kind: crossterm::event::MouseEventKind::ScrollDown,
278            column: $col,
279            row: $row,
280            modifiers: $crate::crossterm::modifiers::$mod,
281        })
282    };
283    (scroll down for $col:ident, $row:ident) => {
284        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
285            kind: crossterm::event::MouseEventKind::ScrollDown,
286            column: $col,
287            row: $row,
288            modifiers: $crate::crossterm::modifiers::NONE,
289        })
290    };
291    (scroll down) => {
292        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
293            kind: crossterm::event::MouseEventKind::ScrollDown,
294            modifiers: $crate::crossterm::modifiers::NONE,
295            ..
296        })
297    };
298    (scroll $mod:ident up for $col:ident, $row:ident) => {
299        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
300            kind: crossterm::event::MouseEventKind::ScrollUp,
301            column: $col,
302            row: $row,
303            modifiers: $crate::crossterm::modifiers::$mod,
304        })
305    };
306    (scroll up for $col:ident, $row:ident) => {
307        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
308            kind: crossterm::event::MouseEventKind::ScrollUp,
309            column: $col,
310            row: $row,
311            modifiers: $crate::crossterm::modifiers::NONE,
312        })
313    };
314    (scroll up) => {
315        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
316            kind: crossterm::event::MouseEventKind::ScrollUp,
317            modifiers: $crate::crossterm::modifiers::NONE,
318            ..
319        })
320    };
321
322    //??
323    (scroll left for $col:ident, $row:ident) => {
324        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
325            kind: crossterm::event::MouseEventKind::ScrollLeft,
326            column: $col,
327            row: $row,
328            modifiers: $crate::crossterm::modifiers::NONE,
329        })
330    };
331    (scroll left) => {
332        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
333            kind: crossterm::event::MouseEventKind::ScrollLeft,
334            modifiers: $crate::crossterm::modifiers::NONE,
335            ..
336        })
337    };
338    //??
339    (scroll right for $col:ident, $row:ident) => {
340        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
341            kind: crossterm::event::MouseEventKind::ScrollRight,
342            column: $col,
343            row: $row,
344            modifiers: $crate::crossterm::modifiers::NONE,
345        })
346    };
347    (scroll right) => {
348        crossterm::event::Event::Mouse(crossterm::event::MouseEvent {
349            kind: crossterm::event::MouseEventKind::ScrollRight,
350            modifiers: $crate::crossterm::modifiers::NONE,
351            ..
352        })
353    };
354
355    (resized) => {
356        crossterm::event::Event::Resize(_, _)
357    };
358    (resized for $cols:ident, $rows:ident ) => {
359        crossterm::event::Event::Resize($cols, $rows)
360    };
361    (focus_gained) => {
362        crossterm::event::Event::FocusGained
363    };
364    (focus_lost) => {
365        crossterm::event::Event::FocusLost
366    };
367    (paste $value:ident) => {
368        crossterm::event::Event::Paste($value)
369    };
370}