mod.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. use std::{
  2. fs::File,
  3. io::Read,
  4. sync::{Arc, RwLock},
  5. };
  6. use starry_client::base::event::Event;
  7. use self::inputs::MouseInputHandler;
  8. use super::window_manager::window_manager;
  9. pub mod inputs;
  10. static mut INPUT_MANAGER: Option<Arc<InputManager>> = None;
  11. pub fn input_manager() -> Option<Arc<InputManager>> {
  12. unsafe { INPUT_MANAGER.clone() }
  13. }
  14. /// 输入管理器
  15. #[allow(dead_code)]
  16. pub struct InputManager {
  17. /// 数据锁
  18. data: RwLock<InputManagerData>,
  19. }
  20. pub struct InputManagerData {
  21. /// 轮询的文件数组
  22. handlers: Vec<Box<dyn InputHandler>>,
  23. }
  24. impl InputManager {
  25. /// 创建输入管理器
  26. pub fn new(){
  27. let mut input_handlers = Vec::new();
  28. // TODO: 通过设备检测添加
  29. input_handlers.push(MouseInputHandler::new() as Box<dyn InputHandler>);
  30. // TODO: 处理键盘输入
  31. let input_manager = InputManager {
  32. data: RwLock::new(InputManagerData {
  33. handlers: input_handlers,
  34. }),
  35. };
  36. unsafe {
  37. INPUT_MANAGER = Some(Arc::new(input_manager));
  38. }
  39. // println!("[Init] Input_Manager created successfully!");
  40. }
  41. /// 轮询所有输入设备
  42. pub fn polling_all(&self) {
  43. // println!("[Info] Input_Manager polling all");
  44. let mut guard = self.data.write().unwrap();
  45. for handle in guard.handlers.iter_mut() {
  46. handle.polling();
  47. }
  48. }
  49. }
  50. /// 输入处理器需要实现的特性
  51. #[allow(dead_code)]
  52. pub trait InputHandler {
  53. /// 获得监听的文件
  54. fn get_listening_file(&mut self) -> &File;
  55. /// 设置监听的文件
  56. fn set_listening_file(&mut self, file: File);
  57. /// 处理字节数据
  58. fn handle(&mut self, packet: u8) -> Vec<Event>;
  59. /// 轮询文件
  60. fn polling(&mut self) {
  61. let mut buf: [u8; 1024] = [0; 1024];
  62. // TODO: 错误信息提示相应文件路径
  63. let count = self
  64. .get_listening_file()
  65. .read(&mut buf)
  66. .expect("[Error] Fail to polling file");
  67. // println!("[Info] Input_Handler polling read {:?} bytes", count);
  68. for i in 0..count {
  69. let events = self.handle(buf[i]);
  70. window_manager().unwrap().send_events(events);
  71. }
  72. }
  73. }