Skip to main content

zellij_utils/input/
mouse.rs

1use serde::{Deserialize, Serialize};
2
3use crate::position::Position;
4
5#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
6/// A mouse event can have any number of buttons (including no
7/// buttons) pressed or released.
8pub struct MouseEvent {
9    /// A mouse event can current be a Press, Release, or Motion.
10    /// Future events could consider double-click and triple-click.
11    pub event_type: MouseEventType,
12
13    // Mouse buttons associated with this event.
14    pub left: bool,
15    pub right: bool,
16    pub middle: bool,
17    pub wheel_up: bool,
18    pub wheel_down: bool,
19    #[serde(default)]
20    pub wheel_left: bool,
21    #[serde(default)]
22    pub wheel_right: bool,
23
24    // Keyboard modifier flags can be encoded with events too.  They
25    // are not often passed on the wire (instead used for
26    // selection/copy-paste and changing terminal properties
27    // on-the-fly at the user-facing terminal), but alt-mouseclick
28    // usually passes through and is testable on vttest.  termwiz
29    // already exposes them too.
30    pub shift: bool,
31    pub alt: bool,
32    pub ctrl: bool,
33
34    /// The coordinates are zero-based.
35    pub position: Position,
36}
37
38/// A mouse related event
39#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Deserialize, Serialize)]
40pub enum MouseEventType {
41    /// A mouse button was pressed.
42    Press,
43    /// A mouse button was released.
44    Release,
45    /// A mouse button is held over the given coordinates.
46    Motion,
47}
48
49impl MouseEvent {
50    pub fn new() -> Self {
51        let event = MouseEvent {
52            event_type: MouseEventType::Motion,
53            left: false,
54            right: false,
55            middle: false,
56            wheel_up: false,
57            wheel_down: false,
58            wheel_left: false,
59            wheel_right: false,
60            shift: false,
61            alt: false,
62            ctrl: false,
63            position: Position::new(0, 0),
64        };
65        event
66    }
67    pub fn new_buttonless_motion(position: Position) -> Self {
68        let event = MouseEvent {
69            event_type: MouseEventType::Motion,
70            left: false,
71            right: false,
72            middle: false,
73            wheel_up: false,
74            wheel_down: false,
75            wheel_left: false,
76            wheel_right: false,
77            shift: false,
78            alt: false,
79            ctrl: false,
80            position,
81        };
82        event
83    }
84    pub fn new_left_press_event(position: Position) -> Self {
85        let event = MouseEvent {
86            event_type: MouseEventType::Press,
87            left: true,
88            right: false,
89            middle: false,
90            wheel_up: false,
91            wheel_down: false,
92            wheel_left: false,
93            wheel_right: false,
94            shift: false,
95            alt: false,
96            ctrl: false,
97            position,
98        };
99        event
100    }
101    pub fn new_right_press_event(position: Position) -> Self {
102        let event = MouseEvent {
103            event_type: MouseEventType::Press,
104            left: false,
105            right: true,
106            middle: false,
107            wheel_up: false,
108            wheel_down: false,
109            wheel_left: false,
110            wheel_right: false,
111            shift: false,
112            alt: false,
113            ctrl: false,
114            position,
115        };
116        event
117    }
118    pub fn new_middle_press_event(position: Position) -> Self {
119        let event = MouseEvent {
120            event_type: MouseEventType::Press,
121            left: false,
122            right: false,
123            middle: true,
124            wheel_up: false,
125            wheel_down: false,
126            wheel_left: false,
127            wheel_right: false,
128            shift: false,
129            alt: false,
130            ctrl: false,
131            position,
132        };
133        event
134    }
135    pub fn new_middle_release_event(position: Position) -> Self {
136        let event = MouseEvent {
137            event_type: MouseEventType::Release,
138            left: false,
139            right: false,
140            middle: true,
141            wheel_up: false,
142            wheel_down: false,
143            wheel_left: false,
144            wheel_right: false,
145            shift: false,
146            alt: false,
147            ctrl: false,
148            position,
149        };
150        event
151    }
152    pub fn new_left_release_event(position: Position) -> Self {
153        let event = MouseEvent {
154            event_type: MouseEventType::Release,
155            left: true,
156            right: false,
157            middle: false,
158            wheel_up: false,
159            wheel_down: false,
160            wheel_left: false,
161            wheel_right: false,
162            shift: false,
163            alt: false,
164            ctrl: false,
165            position,
166        };
167        event
168    }
169    pub fn new_left_motion_event(position: Position) -> Self {
170        let event = MouseEvent {
171            event_type: MouseEventType::Motion,
172            left: true,
173            right: false,
174            middle: false,
175            wheel_up: false,
176            wheel_down: false,
177            wheel_left: false,
178            wheel_right: false,
179            shift: false,
180            alt: false,
181            ctrl: false,
182            position,
183        };
184        event
185    }
186    pub fn new_right_release_event(position: Position) -> Self {
187        let event = MouseEvent {
188            event_type: MouseEventType::Release,
189            left: false,
190            right: true,
191            middle: false,
192            wheel_up: false,
193            wheel_down: false,
194            wheel_left: false,
195            wheel_right: false,
196            shift: false,
197            alt: false,
198            ctrl: false,
199            position,
200        };
201        event
202    }
203    pub fn new_right_motion_event(position: Position) -> Self {
204        let event = MouseEvent {
205            event_type: MouseEventType::Motion,
206            left: false,
207            right: true,
208            middle: false,
209            wheel_up: false,
210            wheel_down: false,
211            wheel_left: false,
212            wheel_right: false,
213            shift: false,
214            alt: false,
215            ctrl: false,
216            position,
217        };
218        event
219    }
220    pub fn new_middle_motion_event(position: Position) -> Self {
221        let event = MouseEvent {
222            event_type: MouseEventType::Motion,
223            left: false,
224            right: false,
225            middle: true,
226            wheel_up: false,
227            wheel_down: false,
228            wheel_left: false,
229            wheel_right: false,
230            shift: false,
231            alt: false,
232            ctrl: false,
233            position,
234        };
235        event
236    }
237    pub fn new_left_press_with_alt_event(position: Position) -> Self {
238        let event = MouseEvent {
239            event_type: MouseEventType::Press,
240            left: true,
241            right: false,
242            middle: false,
243            wheel_up: false,
244            wheel_down: false,
245            wheel_left: false,
246            wheel_right: false,
247            shift: false,
248            alt: true,
249            ctrl: false,
250            position,
251        };
252        event
253    }
254    pub fn new_right_press_with_alt_event(position: Position) -> Self {
255        let event = MouseEvent {
256            event_type: MouseEventType::Press,
257            left: false,
258            right: true,
259            middle: false,
260            wheel_up: false,
261            wheel_down: false,
262            wheel_left: false,
263            wheel_right: false,
264            shift: false,
265            alt: true,
266            ctrl: false,
267            position,
268        };
269        event
270    }
271    pub fn new_left_press_with_ctrl_event(position: Position) -> Self {
272        let event = MouseEvent {
273            event_type: MouseEventType::Press,
274            left: true,
275            right: false,
276            middle: false,
277            wheel_up: false,
278            wheel_down: false,
279            wheel_left: false,
280            wheel_right: false,
281            shift: false,
282            alt: false,
283            ctrl: true,
284            position,
285        };
286        event
287    }
288    pub fn new_left_motion_with_ctrl_event(position: Position) -> Self {
289        let event = MouseEvent {
290            event_type: MouseEventType::Motion,
291            left: true,
292            right: false,
293            middle: false,
294            wheel_up: false,
295            wheel_down: false,
296            wheel_left: false,
297            wheel_right: false,
298            shift: false,
299            alt: false,
300            ctrl: true,
301            position,
302        };
303        event
304    }
305    pub fn new_left_release_with_ctrl_event(position: Position) -> Self {
306        let event = MouseEvent {
307            event_type: MouseEventType::Release,
308            left: true,
309            right: false,
310            middle: false,
311            wheel_up: false,
312            wheel_down: false,
313            wheel_left: false,
314            wheel_right: false,
315            shift: false,
316            alt: false,
317            ctrl: true,
318            position,
319        };
320        event
321    }
322    pub fn new_left_motion_with_alt_event(position: Position) -> Self {
323        let event = MouseEvent {
324            event_type: MouseEventType::Motion,
325            left: true,
326            right: false,
327            middle: false,
328            wheel_up: false,
329            wheel_down: false,
330            wheel_left: false,
331            wheel_right: false,
332            shift: false,
333            alt: true,
334            ctrl: false,
335            position,
336        };
337        event
338    }
339    pub fn new_scroll_up_event(position: Position) -> Self {
340        let event = MouseEvent {
341            event_type: MouseEventType::Press,
342            left: false,
343            right: false,
344            middle: false,
345            wheel_up: true,
346            wheel_down: false,
347            wheel_left: false,
348            wheel_right: false,
349            shift: false,
350            alt: false,
351            ctrl: false,
352            position,
353        };
354        event
355    }
356    pub fn new_scroll_down_event(position: Position) -> Self {
357        let event = MouseEvent {
358            event_type: MouseEventType::Press,
359            left: false,
360            right: false,
361            middle: false,
362            wheel_up: false,
363            wheel_down: true,
364            wheel_left: false,
365            wheel_right: false,
366            shift: false,
367            alt: false,
368            ctrl: false,
369            position,
370        };
371        event
372    }
373    pub fn new_alt_scroll_up_event(position: Position) -> Self {
374        let event = MouseEvent {
375            event_type: MouseEventType::Press,
376            left: false,
377            right: false,
378            middle: false,
379            wheel_up: true,
380            wheel_down: false,
381            wheel_left: false,
382            wheel_right: false,
383            shift: false,
384            alt: true,
385            ctrl: false,
386            position,
387        };
388        event
389    }
390    pub fn new_alt_scroll_down_event(position: Position) -> Self {
391        let event = MouseEvent {
392            event_type: MouseEventType::Press,
393            left: false,
394            right: false,
395            middle: false,
396            wheel_up: false,
397            wheel_down: true,
398            wheel_left: false,
399            wheel_right: false,
400            shift: false,
401            alt: true,
402            ctrl: false,
403            position,
404        };
405        event
406    }
407    pub fn new_ctrl_scroll_up_event(position: Position) -> Self {
408        let event = MouseEvent {
409            event_type: MouseEventType::Press,
410            left: false,
411            right: false,
412            middle: false,
413            wheel_up: true,
414            wheel_down: false,
415            wheel_left: false,
416            wheel_right: false,
417            shift: false,
418            alt: false,
419            ctrl: true,
420            position,
421        };
422        event
423    }
424    pub fn new_ctrl_scroll_down_event(position: Position) -> Self {
425        let event = MouseEvent {
426            event_type: MouseEventType::Press,
427            left: false,
428            right: false,
429            middle: false,
430            wheel_up: false,
431            wheel_down: true,
432            wheel_left: false,
433            wheel_right: false,
434            shift: false,
435            alt: false,
436            ctrl: true,
437            position,
438        };
439        event
440    }
441    pub fn new_scroll_left_event(position: Position) -> Self {
442        MouseEvent {
443            event_type: MouseEventType::Press,
444            left: false,
445            right: false,
446            middle: false,
447            wheel_up: false,
448            wheel_down: false,
449            wheel_left: true,
450            wheel_right: false,
451            shift: false,
452            alt: false,
453            ctrl: false,
454            position,
455        }
456    }
457    pub fn new_scroll_right_event(position: Position) -> Self {
458        MouseEvent {
459            event_type: MouseEventType::Press,
460            left: false,
461            right: false,
462            middle: false,
463            wheel_up: false,
464            wheel_down: false,
465            wheel_left: false,
466            wheel_right: true,
467            shift: false,
468            alt: false,
469            ctrl: false,
470            position,
471        }
472    }
473}
474
475impl Default for MouseEvent {
476    fn default() -> Self {
477        MouseEvent::new()
478    }
479}