1#[derive(Debug, Clone, Copy)]
2pub struct MouseEvent {
3 pub dx: i32,
4 pub dy: i32,
5 pub left_btn: bool,
6 pub right_btn: bool,
7 pub middle_btn: bool,
8}
9
10pub struct MouseDecoder {
11 state: u8,
12 buf: [u8; 3],
13}
14
15impl Default for MouseDecoder {
16 fn default() -> Self {
17 Self::new()
18 }
19}
20
21impl MouseDecoder {
22 pub const fn new() -> Self {
23 Self {
24 state: 0,
25 buf: [0; 3],
26 }
27 }
28
29 pub fn decode(&mut self, data: u8) -> Option<MouseEvent> {
32 match self.state {
33 0 => {
34 if (data & 0x08) != 0 {
37 self.buf[0] = data;
38 self.state = 1;
39 }
40 }
41 1 => {
42 self.buf[1] = data;
43 self.state = 2;
44 }
45 2 => {
46 self.buf[2] = data;
47 self.state = 0; let btn = self.buf[0];
50 let raw_x = self.buf[1];
51 let raw_y = self.buf[2];
52
53 let left_btn = (btn & 0x01) != 0;
54 let right_btn = (btn & 0x02) != 0;
55 let middle_btn = (btn & 0x04) != 0;
56
57 let mut dx = raw_x as i32;
59 let mut dy = raw_y as i32;
60
61 if (btn & 0x10) != 0 {
63 dx |= !0xFF;
64 }
65 if (btn & 0x20) != 0 {
67 dy |= !0xFF;
68 }
69
70 dy = -dy;
73
74 return Some(MouseEvent {
75 dx,
76 dy,
77 left_btn,
78 right_btn,
79 middle_btn,
80 });
81 }
82 _ => self.state = 0,
83 }
84 None
85 }
86}