1use std::mem::zeroed;
2use std::ptr::addr_of_mut;
3
4use crate::gamepad::{
5 handle_controller_axis_motion, handle_controller_button_down, handle_controller_button_up,
6 handle_controller_device_added, handle_controller_device_removed,
7};
8#[cfg(target_os = "emscripten")]
9use crate::gamepad::{handle_joy_button_down, handle_joy_button_up, handle_virtual_gamepad_inputs};
10use crate::keyboard::{handle_key_down, handle_key_up, handle_text_input};
11use crate::keys::{Key, KeyValue};
12use crate::mouse::{
13 handle_mouse_button_down, handle_mouse_button_up, handle_mouse_motion, handle_mouse_wheel,
14};
15use crate::sdl2_sys::*;
16use crate::window::{handle_drop_file, handle_quit, handle_window_event};
17
18#[derive(Clone)]
19pub enum Event {
20 WindowShown,
21 WindowHidden,
22 KeyPressed { key: Key },
23 KeyReleased { key: Key },
24 KeyValueChanged { key: Key, value: KeyValue },
25 TextInput { text: String },
26 FileDropped { filename: String },
27 Quit,
28}
29
30pub fn poll_events() -> Vec<Event> {
31 let mut pyxel_events = Vec::new();
32 let mut sdl_event: SDL_Event = unsafe { zeroed() };
33
34 while unsafe { SDL_PollEvent(addr_of_mut!(sdl_event)) } != 0 {
35 match unsafe { sdl_event.type_ as SDL_EventType } {
36 SDL_WINDOWEVENT => {
38 pyxel_events.extend(handle_window_event(sdl_event));
39 }
40 SDL_DROPFILE => {
41 pyxel_events.extend(handle_drop_file(sdl_event));
42 }
43 SDL_QUIT => {
44 pyxel_events.extend(handle_quit());
45 }
46
47 SDL_KEYDOWN => {
49 pyxel_events.extend(handle_key_down(sdl_event));
50 }
51 SDL_KEYUP => {
52 pyxel_events.extend(handle_key_up(sdl_event));
53 }
54 SDL_TEXTINPUT => {
55 pyxel_events.extend(handle_text_input(sdl_event));
56 }
57
58 SDL_MOUSEBUTTONDOWN => {
60 pyxel_events.extend(handle_mouse_button_down(sdl_event));
61 }
62 SDL_MOUSEBUTTONUP => {
63 pyxel_events.extend(handle_mouse_button_up(sdl_event));
64 }
65 SDL_MOUSEWHEEL => {
66 pyxel_events.extend(handle_mouse_wheel(sdl_event));
67 }
68
69 SDL_CONTROLLERDEVICEADDED => {
71 handle_controller_device_added(sdl_event);
72 }
73 SDL_CONTROLLERDEVICEREMOVED => {
74 handle_controller_device_removed(sdl_event);
75 }
76 SDL_CONTROLLERAXISMOTION => {
77 pyxel_events.extend(handle_controller_axis_motion(sdl_event));
78 }
79 SDL_CONTROLLERBUTTONDOWN => {
80 pyxel_events.extend(handle_controller_button_down(sdl_event));
81 }
82 SDL_CONTROLLERBUTTONUP => {
83 pyxel_events.extend(handle_controller_button_up(sdl_event));
84 }
85 #[cfg(target_os = "emscripten")]
86 SDL_JOYBUTTONDOWN => {
87 pyxel_events.extend(handle_joy_button_down(sdl_event));
88 }
89 #[cfg(target_os = "emscripten")]
90 SDL_JOYBUTTONUP => {
91 pyxel_events.extend(handle_joy_button_up(sdl_event));
92 }
93 _ => {}
94 }
95 }
96
97 pyxel_events.extend(handle_mouse_motion());
98 #[cfg(target_os = "emscripten")]
99 pyxel_events.extend(handle_virtual_gamepad_inputs());
100
101 pyxel_events
102}