pyxel_platform/
event.rs

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            // Window
37            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            // Keyboard
48            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            // Mouse
59            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            // Gamepad
70            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}