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
20    // Keyboard modifier flags can be encoded with events too.  They
21    // are not often passed on the wire (instead used for
22    // selection/copy-paste and changing terminal properties
23    // on-the-fly at the user-facing terminal), but alt-mouseclick
24    // usually passes through and is testable on vttest.  termwiz
25    // already exposes them too.
26    pub shift: bool,
27    pub alt: bool,
28    pub ctrl: bool,
29
30    /// The coordinates are zero-based.
31    pub position: Position,
32}
33
34/// A mouse related event
35#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Deserialize, Serialize)]
36pub enum MouseEventType {
37    /// A mouse button was pressed.
38    Press,
39    /// A mouse button was released.
40    Release,
41    /// A mouse button is held over the given coordinates.
42    Motion,
43}
44
45impl MouseEvent {
46    pub fn new() -> Self {
47        let event = MouseEvent {
48            event_type: MouseEventType::Motion,
49            left: false,
50            right: false,
51            middle: false,
52            wheel_up: false,
53            wheel_down: false,
54            shift: false,
55            alt: false,
56            ctrl: false,
57            position: Position::new(0, 0),
58        };
59        event
60    }
61    pub fn new_buttonless_motion(position: Position) -> Self {
62        let event = MouseEvent {
63            event_type: MouseEventType::Motion,
64            left: false,
65            right: false,
66            middle: false,
67            wheel_up: false,
68            wheel_down: false,
69            shift: false,
70            alt: false,
71            ctrl: false,
72            position,
73        };
74        event
75    }
76    pub fn new_left_press_event(position: Position) -> Self {
77        let event = MouseEvent {
78            event_type: MouseEventType::Press,
79            left: true,
80            right: false,
81            middle: false,
82            wheel_up: false,
83            wheel_down: false,
84            shift: false,
85            alt: false,
86            ctrl: false,
87            position,
88        };
89        event
90    }
91    pub fn new_right_press_event(position: Position) -> Self {
92        let event = MouseEvent {
93            event_type: MouseEventType::Press,
94            left: false,
95            right: true,
96            middle: false,
97            wheel_up: false,
98            wheel_down: false,
99            shift: false,
100            alt: false,
101            ctrl: false,
102            position,
103        };
104        event
105    }
106    pub fn new_middle_press_event(position: Position) -> Self {
107        let event = MouseEvent {
108            event_type: MouseEventType::Press,
109            left: false,
110            right: false,
111            middle: true,
112            wheel_up: false,
113            wheel_down: false,
114            shift: false,
115            alt: false,
116            ctrl: false,
117            position,
118        };
119        event
120    }
121    pub fn new_middle_release_event(position: Position) -> Self {
122        let event = MouseEvent {
123            event_type: MouseEventType::Release,
124            left: false,
125            right: false,
126            middle: true,
127            wheel_up: false,
128            wheel_down: false,
129            shift: false,
130            alt: false,
131            ctrl: false,
132            position,
133        };
134        event
135    }
136    pub fn new_left_release_event(position: Position) -> Self {
137        let event = MouseEvent {
138            event_type: MouseEventType::Release,
139            left: true,
140            right: false,
141            middle: false,
142            wheel_up: false,
143            wheel_down: false,
144            shift: false,
145            alt: false,
146            ctrl: false,
147            position,
148        };
149        event
150    }
151    pub fn new_left_motion_event(position: Position) -> Self {
152        let event = MouseEvent {
153            event_type: MouseEventType::Motion,
154            left: true,
155            right: false,
156            middle: false,
157            wheel_up: false,
158            wheel_down: false,
159            shift: false,
160            alt: false,
161            ctrl: false,
162            position,
163        };
164        event
165    }
166    pub fn new_right_release_event(position: Position) -> Self {
167        let event = MouseEvent {
168            event_type: MouseEventType::Release,
169            left: false,
170            right: true,
171            middle: false,
172            wheel_up: false,
173            wheel_down: false,
174            shift: false,
175            alt: false,
176            ctrl: false,
177            position,
178        };
179        event
180    }
181    pub fn new_right_motion_event(position: Position) -> Self {
182        let event = MouseEvent {
183            event_type: MouseEventType::Motion,
184            left: false,
185            right: true,
186            middle: false,
187            wheel_up: false,
188            wheel_down: false,
189            shift: false,
190            alt: false,
191            ctrl: false,
192            position,
193        };
194        event
195    }
196    pub fn new_middle_motion_event(position: Position) -> Self {
197        let event = MouseEvent {
198            event_type: MouseEventType::Motion,
199            left: false,
200            right: false,
201            middle: true,
202            wheel_up: false,
203            wheel_down: false,
204            shift: false,
205            alt: false,
206            ctrl: false,
207            position,
208        };
209        event
210    }
211    pub fn new_left_press_with_alt_event(position: Position) -> Self {
212        let event = MouseEvent {
213            event_type: MouseEventType::Press,
214            left: true,
215            right: false,
216            middle: false,
217            wheel_up: false,
218            wheel_down: false,
219            shift: false,
220            alt: true,
221            ctrl: false,
222            position,
223        };
224        event
225    }
226    pub fn new_right_press_with_alt_event(position: Position) -> Self {
227        let event = MouseEvent {
228            event_type: MouseEventType::Press,
229            left: false,
230            right: true,
231            middle: false,
232            wheel_up: false,
233            wheel_down: false,
234            shift: false,
235            alt: true,
236            ctrl: false,
237            position,
238        };
239        event
240    }
241    pub fn new_left_press_with_ctrl_event(position: Position) -> Self {
242        let event = MouseEvent {
243            event_type: MouseEventType::Press,
244            left: true,
245            right: false,
246            middle: false,
247            wheel_up: false,
248            wheel_down: false,
249            shift: false,
250            alt: false,
251            ctrl: true,
252            position,
253        };
254        event
255    }
256    pub fn new_left_motion_with_ctrl_event(position: Position) -> Self {
257        let event = MouseEvent {
258            event_type: MouseEventType::Motion,
259            left: true,
260            right: false,
261            middle: false,
262            wheel_up: false,
263            wheel_down: false,
264            shift: false,
265            alt: false,
266            ctrl: true,
267            position,
268        };
269        event
270    }
271    pub fn new_left_release_with_ctrl_event(position: Position) -> Self {
272        let event = MouseEvent {
273            event_type: MouseEventType::Release,
274            left: true,
275            right: false,
276            middle: false,
277            wheel_up: false,
278            wheel_down: false,
279            shift: false,
280            alt: false,
281            ctrl: true,
282            position,
283        };
284        event
285    }
286    pub fn new_left_motion_with_alt_event(position: Position) -> Self {
287        let event = MouseEvent {
288            event_type: MouseEventType::Motion,
289            left: true,
290            right: false,
291            middle: false,
292            wheel_up: false,
293            wheel_down: false,
294            shift: false,
295            alt: true,
296            ctrl: false,
297            position,
298        };
299        event
300    }
301    pub fn new_scroll_up_event(position: Position) -> Self {
302        let event = MouseEvent {
303            event_type: MouseEventType::Press,
304            left: false,
305            right: false,
306            middle: false,
307            wheel_up: true,
308            wheel_down: false,
309            shift: false,
310            alt: false,
311            ctrl: false,
312            position,
313        };
314        event
315    }
316    pub fn new_scroll_down_event(position: Position) -> Self {
317        let event = MouseEvent {
318            event_type: MouseEventType::Press,
319            left: false,
320            right: false,
321            middle: false,
322            wheel_up: false,
323            wheel_down: true,
324            shift: false,
325            alt: false,
326            ctrl: false,
327            position,
328        };
329        event
330    }
331    pub fn new_ctrl_scroll_up_event(position: Position) -> Self {
332        let event = MouseEvent {
333            event_type: MouseEventType::Press,
334            left: false,
335            right: false,
336            middle: false,
337            wheel_up: true,
338            wheel_down: false,
339            shift: false,
340            alt: false,
341            ctrl: true,
342            position,
343        };
344        event
345    }
346    pub fn new_ctrl_scroll_down_event(position: Position) -> Self {
347        let event = MouseEvent {
348            event_type: MouseEventType::Press,
349            left: false,
350            right: false,
351            middle: false,
352            wheel_up: false,
353            wheel_down: true,
354            shift: false,
355            alt: false,
356            ctrl: true,
357            position,
358        };
359        event
360    }
361}
362
363impl Default for MouseEvent {
364    fn default() -> Self {
365        MouseEvent::new()
366    }
367}