event.rs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #[derive(Copy, Clone, Debug)]
  2. pub enum EventOption {
  3. /// 按键事件
  4. Key(KeyEvent),
  5. /// 鼠标相对移动事件
  6. MouseRelative(MouseRelativeEvent),
  7. /// 鼠标按键事件
  8. Button(ButtonEvent),
  9. /// 窗口位置移动事件
  10. WindowMove(WindowMoveEvent),
  11. /// 窗口大小改变事件
  12. WindowResize(WindowResizeEvent),
  13. /// 未知事件
  14. Unknown(Event),
  15. /// 空事件
  16. None,
  17. }
  18. pub const EVENT_NONE: i64 = 0;
  19. pub const EVENT_KEY: i64 = 1;
  20. pub const EVENT_MOUSE_RELATIVE: i64 = 2;
  21. pub const EVENT_BUTTON: i64 = 3;
  22. pub const EVENT_MOUSE_UPDATE: i64 = 4;
  23. pub const EVENT_WINDOW_MOVE: i64 = 5;
  24. pub const EVENT_WINDOW_RESIZE: i64 = 6;
  25. /// 通用事件
  26. #[derive(Copy, Clone, Debug)]
  27. pub struct Event {
  28. pub code: i64,
  29. pub a: i64,
  30. pub b: i64,
  31. }
  32. impl Event {
  33. pub fn new() -> Event {
  34. Event {
  35. code: 0,
  36. a: 0,
  37. b: 0,
  38. }
  39. }
  40. pub fn to_option(self) -> EventOption {
  41. match self.code {
  42. EVENT_NONE => EventOption::None,
  43. EVENT_KEY => EventOption::Key(KeyEvent::from_event(self)),
  44. EVENT_MOUSE_RELATIVE => {
  45. EventOption::MouseRelative(MouseRelativeEvent::from_event(self))
  46. }
  47. EVENT_BUTTON => EventOption::Button(ButtonEvent::from_event(self)),
  48. _ => EventOption::Unknown(self),
  49. }
  50. }
  51. }
  52. /// 键盘按键事件
  53. #[derive(Copy, Clone, Debug)]
  54. pub struct KeyEvent {
  55. /// 按键字符
  56. pub character: char,
  57. /// 按键扫描码
  58. pub scancode: u8,
  59. /// 是否按下
  60. pub pressed: bool,
  61. }
  62. impl KeyEvent {
  63. /// 转换为Event
  64. pub fn to_event(&self) -> Event {
  65. Event {
  66. code: EVENT_KEY,
  67. a: self.character as i64,
  68. b: self.scancode as i64 | (self.pressed as i64) << 8,
  69. }
  70. }
  71. /// 从Event转换为KeyEvent
  72. pub fn from_event(event: Event) -> KeyEvent {
  73. KeyEvent {
  74. character: char::from_u32(event.a as u32).unwrap_or('\0'),
  75. scancode: event.b as u8,
  76. pressed: event.b & (1 << 8) == (1 << 8),
  77. }
  78. }
  79. }
  80. /// 鼠标相对移动事件
  81. #[derive(Copy, Clone, Debug)]
  82. pub struct MouseRelativeEvent {
  83. /// x轴向上的相对运动
  84. pub dx: i32,
  85. /// y轴向上的相对运动
  86. pub dy: i32,
  87. }
  88. impl MouseRelativeEvent {
  89. /// 转换为Event
  90. pub fn to_event(&self) -> Event {
  91. Event {
  92. code: EVENT_MOUSE_RELATIVE,
  93. a: self.dx as i64,
  94. b: self.dy as i64,
  95. }
  96. }
  97. /// 从Event转换为MouseRelativeEvent
  98. pub fn from_event(event: Event) -> MouseRelativeEvent {
  99. MouseRelativeEvent {
  100. dx: event.a as i32,
  101. dy: event.b as i32,
  102. }
  103. }
  104. }
  105. /// TODO: 按键松开事件
  106. /// 鼠标按键事件
  107. #[derive(Clone, Copy, Debug)]
  108. pub struct ButtonEvent {
  109. /// 左键是否按下
  110. pub left: bool,
  111. /// 右键是否按下
  112. pub right: bool,
  113. /// 中键是否按下
  114. pub middle: bool,
  115. }
  116. impl ButtonEvent {
  117. pub fn new(byte: u8) -> Self {
  118. ButtonEvent {
  119. left: byte & (1 << 0) == 1,
  120. middle: byte & (1 << 1) == 1,
  121. right: byte & (1 << 2) == 1,
  122. }
  123. }
  124. /// 转换为Event
  125. pub fn to_event(&self) -> Event {
  126. Event {
  127. code: EVENT_BUTTON,
  128. a: self.left as i64 | (self.middle as i64) << 1 | (self.right as i64) << 2,
  129. b: 0,
  130. }
  131. }
  132. /// 从Event转换为ButtonEvent
  133. pub fn from_event(event: Event) -> ButtonEvent {
  134. ButtonEvent {
  135. left: event.a & (1 << 0) == 1,
  136. middle: event.a & (1 << 1) == 1,
  137. right: event.a & (1 << 2) == 1,
  138. }
  139. }
  140. }
  141. /// 鼠标位置更新事件
  142. pub struct MouseUpdateEvent {
  143. /// 更新后鼠标位置x坐标
  144. pub x: i32,
  145. /// 更新后鼠标位置y坐标
  146. pub y: i32,
  147. }
  148. impl MouseUpdateEvent {
  149. /// 转换为Event
  150. pub fn to_event(&self) -> Event {
  151. Event {
  152. code: EVENT_MOUSE_UPDATE,
  153. a: self.x as i64,
  154. b: self.y as i64,
  155. }
  156. }
  157. /// 从Event转换为MouseUpdateEvent
  158. pub fn from_event(event: Event) -> MouseUpdateEvent {
  159. MouseUpdateEvent {
  160. x: event.a as i32,
  161. y: event.b as i32,
  162. }
  163. }
  164. }
  165. /// 窗口位置移动事件
  166. #[derive(Copy, Clone, Debug)]
  167. pub struct WindowMoveEvent {
  168. pub x: i32,
  169. pub y: i32,
  170. }
  171. impl WindowMoveEvent {
  172. pub fn to_event(&self) -> Event {
  173. Event {
  174. code: EVENT_WINDOW_MOVE,
  175. a: self.x as i64,
  176. b: self.y as i64,
  177. }
  178. }
  179. pub fn from_event(event: Event) -> WindowMoveEvent {
  180. WindowMoveEvent {
  181. x: event.a as i32,
  182. y: event.b as i32,
  183. }
  184. }
  185. }
  186. /// 窗口改变大小事件
  187. #[derive(Copy, Clone, Debug)]
  188. pub struct WindowResizeEvent {
  189. pub width: u32,
  190. pub height: u32,
  191. }
  192. impl WindowResizeEvent {
  193. pub fn to_event(&self) -> Event {
  194. Event {
  195. code: EVENT_WINDOW_RESIZE,
  196. a: self.width as i64,
  197. b: self.height as i64,
  198. }
  199. }
  200. pub fn from_event(event: Event) -> WindowResizeEvent {
  201. WindowResizeEvent {
  202. width: event.a as u32,
  203. height: event.b as u32,
  204. }
  205. }
  206. }