1 use super::InputHandler; 2 use bitflags::bitflags; 3 use starry_client::base::event::{ButtonEvent, Event, MouseRelativeEvent}; 4 use std::{fs::File, io::Read}; 5 6 const MOUSE_DEVICE_PATH: &str = "/dev/char/psmouse"; 7 const KBD_DEVICE_PATH: &str = "/dev/char/tty0"; 8 9 bitflags! { 10 /// 鼠标状态掩码 11 #[derive(Default)] 12 pub struct MouseFlags: u8 { 13 /// 左键是否按下 14 const LEFT_BUTTON = 0b0000_0001; 15 16 /// 右键是否按下 17 const RIGHT_BUTTON = 0b0000_0010; 18 19 /// 滚轮是否按下 20 const MIDDLE_BUTTON = 0b0000_0100; 21 22 /// 鼠标是否启用 23 const ALWAYS_ONE = 0b0000_1000; 24 25 /// x轴移动方向是否为负 26 const X_SIGN = 0b0001_0000; 27 28 /// y轴移动方向是否为负 29 const Y_SIGN = 0b0010_0000; 30 31 /// x方向移动超出范围 32 const X_OVERFLOW = 0b0100_0000; 33 34 /// y方向移动超出范围 35 const Y_OVERFLOW = 0b1000_0000; 36 } 37 } 38 39 #[allow(dead_code)] 40 pub struct MouseInputHandler { 41 /// 读取的文件 42 file: File, 43 /// 当前数据包序号 44 packet_index: u8, 45 /// 鼠标状态 46 flags: MouseFlags, 47 /// x轴相对移动 48 dx: i16, 49 /// y轴相对移动 50 dy: i16, 51 /// 移动系数/灵敏度 52 scale: u8, 53 } 54 55 impl MouseInputHandler { new() -> Box<MouseInputHandler>56 pub fn new() -> Box<MouseInputHandler> { 57 let file = File::open(MOUSE_DEVICE_PATH).expect("Fail to open mouse device"); 58 // println!("[Init] Mouse_Input_Handler created successfully!"); 59 Box::new(MouseInputHandler { 60 flags: MouseFlags::empty(), 61 packet_index: 0, 62 file: file, 63 dx: 0, 64 dy: 0, 65 scale: 1, 66 }) 67 } 68 } 69 70 impl InputHandler for MouseInputHandler { get_listening_file(&mut self) -> &File71 fn get_listening_file(&mut self) -> &File { 72 self.file.by_ref() 73 } 74 set_listening_file(&mut self, file: File)75 fn set_listening_file(&mut self, file: File) { 76 self.file = file; 77 } 78 handle(&mut self, packet: u8) -> Vec<Event>79 fn handle(&mut self, packet: u8) -> Vec<Event> { 80 // println!("[Info] Mouse_Input_Handler handle packet {:?}", packet); 81 /// 求补码 82 fn sign_extend(value: u8) -> i16 { 83 ((value as u16) | 0xFF00) as i16 84 } 85 86 let mut events: Vec<Event> = Vec::new(); 87 match self.packet_index { 88 0 => { 89 let flags = MouseFlags::from_bits_truncate(packet); 90 if flags.contains(MouseFlags::ALWAYS_ONE) { 91 self.flags = flags; 92 events.push(ButtonEvent::new(packet).to_event()); 93 } 94 } 95 1 => { 96 // 计算dx 97 if self.flags.contains(MouseFlags::X_OVERFLOW) { 98 self.dx = 0; 99 } else if self.flags.contains(MouseFlags::X_SIGN) { 100 self.dx = sign_extend(packet); 101 } else { 102 self.dx = packet as i16; 103 } 104 } 105 2 => { 106 // 计算dy 107 if self.flags.contains(MouseFlags::Y_OVERFLOW) { 108 self.dy = 0; 109 } else if self.flags.contains(MouseFlags::Y_SIGN) { 110 self.dy = sign_extend(packet); 111 } else { 112 self.dy = packet as i16; 113 } 114 115 // 传入移动事件 116 events.push( 117 MouseRelativeEvent { 118 dx: self.dx as i32 * self.scale as i32, 119 dy: self.dy as i32 * self.scale as i32, 120 } 121 .to_event(), 122 ); 123 } 124 _ => unreachable!(), 125 } 126 self.packet_index = (self.packet_index + 1) % 3; 127 return events; 128 } 129 } 130 131 // TODO 132 pub struct KeyboardInputHandler { 133 /// 读取的文件 134 file: File, 135 } 136 137 impl KeyboardInputHandler { new() -> Box<KeyboardInputHandler>138 pub fn new() -> Box<KeyboardInputHandler> { 139 let file = File::open(KBD_DEVICE_PATH).expect("Fail to open mouse device"); 140 // println!("[Init] Keyboard_Input_Handler created successfully!"); 141 Box::new(KeyboardInputHandler { file: file }) 142 } 143 } 144 145 impl InputHandler for KeyboardInputHandler { get_listening_file(&mut self) -> &File146 fn get_listening_file(&mut self) -> &File { 147 &self.file 148 } 149 set_listening_file(&mut self, file: File)150 fn set_listening_file(&mut self, file: File) { 151 self.file = file; 152 } 153 handle(&mut self, _packet: u8) -> Vec<Event>154 fn handle(&mut self, _packet: u8) -> Vec<Event> { 155 Vec::new() 156 } 157 } 158