mod.rs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. use std::{cell::RefCell, fs::File, io::Read, sync::Arc};
  2. use starry_client::base::event::Event;
  3. use self::inputs::{KeyboardInputHandler, MouseInputHandler};
  4. use super::window_manager::window_manager;
  5. pub mod inputs;
  6. static mut INPUT_MANAGER: Option<Arc<InputManager>> = None;
  7. pub fn input_manager() -> Option<Arc<InputManager>> {
  8. unsafe { INPUT_MANAGER.clone() }
  9. }
  10. /// 输入管理器
  11. #[allow(dead_code)]
  12. pub struct InputManager {
  13. /// 轮询的文件数组
  14. handlers: RefCell<Vec<Box<dyn InputHandler>>>,
  15. }
  16. impl InputManager {
  17. /// 创建输入管理器
  18. pub fn new() {
  19. let mut input_handlers = Vec::new();
  20. input_handlers.push(MouseInputHandler::new() as Box<dyn InputHandler>);
  21. input_handlers.push(KeyboardInputHandler::new() as Box<dyn InputHandler>);
  22. let input_manager = InputManager {
  23. handlers: RefCell::new(input_handlers),
  24. };
  25. unsafe {
  26. INPUT_MANAGER = Some(Arc::new(input_manager));
  27. }
  28. // println!("[Init] Input_Manager created successfully!");
  29. }
  30. /// 驱动所有输入处理器
  31. pub fn polling_all(&self) {
  32. // println!("[Info] Input_Manager polling all");
  33. for handle in self.handlers.borrow_mut().iter_mut() {
  34. handle.polling();
  35. }
  36. }
  37. }
  38. /// 输入处理器需要实现的特性
  39. #[allow(dead_code)]
  40. pub trait InputHandler {
  41. /// 获得监听的文件
  42. fn get_listening_file(&mut self) -> &File;
  43. /// 设置监听的文件
  44. fn set_listening_file(&mut self, file: File);
  45. /// 处理字节数据
  46. fn handle(&mut self, packet: u8) -> Vec<Event>;
  47. /// 轮询文件
  48. fn polling(&mut self) {
  49. let mut buf: [u8; 1024] = [0; 1024];
  50. let mut file = self.get_listening_file();
  51. let result = file.read(&mut buf);
  52. if result.is_err() {
  53. println!("[Error] Filed to polling file {:?}", file);
  54. } else {
  55. let count = result.ok().unwrap();
  56. // println!("[Info] Input_Handler polling read {:?} bytes", count);
  57. for i in 0..count {
  58. let events = self.handle(buf[i]);
  59. window_manager().unwrap().send_events(events);
  60. }
  61. }
  62. }
  63. }