diff options
| author | LLLL Colonq <llll@colonq> | 2025-01-18 21:53:36 -0500 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2025-01-18 21:53:36 -0500 |
| commit | fdafae3cdcb03a8b7fa736039556bcc465a34959 (patch) | |
| tree | 6d7f004030300c62f31f9d9888c4289c53c0ac5b | |
| parent | 6c00c069ccf08ef5e577c16acc78a5b1f53a0f8f (diff) | |
Serializable SDL2 keycodes
| -rw-r--r-- | src/lib.rs | 6 | ||||
| -rw-r--r-- | src/state.rs | 50 |
2 files changed, 41 insertions, 15 deletions
@@ -60,7 +60,7 @@ where // gl_attr.set_context_profile(sdl2::video::GLProfile::Core); // gl_attr.set_context_version(3, 0); let window = video - .window(title, 640, 360) + .window(title, w as _, h as _) .opengl() // .fullscreen_desktop() .resizable() @@ -107,10 +107,10 @@ where st.mouse_released(&ctx) }, sdl2::event::Event::KeyDown { keycode: Some(key), repeat: false, .. } => { - st.key_pressed(&ctx, key) + st.key_pressed(&ctx, state::Keycode::new(key)) }, sdl2::event::Event::KeyUp { keycode: Some(key), repeat: false, .. } => { - st.key_released(&ctx, key) + st.key_released(&ctx, state::Keycode::new(key)) }, _ => {}, } diff --git a/src/state.rs b/src/state.rs index cf910a3..03ebf5e 100644 --- a/src/state.rs +++ b/src/state.rs @@ -100,7 +100,33 @@ type Timestamp = f64; pub type Keycode = winit::keyboard::KeyCode; #[cfg(not(target_arch = "wasm32"))] -pub type Keycode = sdl2::keyboard::Keycode; +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct Keycode { + pub kc: sdl2::keyboard::Keycode +} +#[cfg(not(target_arch = "wasm32"))] +impl Keycode { + pub fn new(kc: sdl2::keyboard::Keycode) -> Self { Self { kc } } +} +#[cfg(not(target_arch = "wasm32"))] +impl Serialize for Keycode { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where S: serde::Serializer { + (self.kc.into_i32()).serialize(serializer) + } +} +#[cfg(not(target_arch = "wasm32"))] +impl<'de> Deserialize<'de> for Keycode { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where D: serde::Deserializer<'de> { + i32::deserialize(deserializer) + .and_then(|x| { + sdl2::keyboard::Keycode::from_i32(x) + .map(|kc| Keycode { kc }) + .ok_or(serde::de::Error::custom("invalid entity flags")) + }) + } +} pub struct State { pub acc: f64, @@ -158,16 +184,16 @@ pub fn default_keybindings() -> BiHashMap<Keycode, Key> { #[cfg(not(target_arch = "wasm32"))] pub fn default_keybindings() -> BiHashMap<Keycode, Key> { BiHashMap::from_iter(vec![ - (sdl2::keyboard::Keycode::W, Key::Up), - (sdl2::keyboard::Keycode::S, Key::Down), - (sdl2::keyboard::Keycode::A, Key::Left), - (sdl2::keyboard::Keycode::D, Key::Right), - (sdl2::keyboard::Keycode::NUM_1, Key::A), - (sdl2::keyboard::Keycode::NUM_2, Key::B), - (sdl2::keyboard::Keycode::Q, Key::L), - (sdl2::keyboard::Keycode::E, Key::R), - (sdl2::keyboard::Keycode::TAB, Key::Start), - (sdl2::keyboard::Keycode::SPACE, Key::Select), + (Keycode::new(sdl2::keyboard::Keycode::W), Key::Up), + (Keycode::new(sdl2::keyboard::Keycode::S), Key::Down), + (Keycode::new(sdl2::keyboard::Keycode::A), Key::Left), + (Keycode::new(sdl2::keyboard::Keycode::D), Key::Right), + (Keycode::new(sdl2::keyboard::Keycode::NUM_1), Key::A), + (Keycode::new(sdl2::keyboard::Keycode::NUM_2), Key::B), + (Keycode::new(sdl2::keyboard::Keycode::Q), Key::L), + (Keycode::new(sdl2::keyboard::Keycode::E), Key::R), + (Keycode::new(sdl2::keyboard::Keycode::TAB), Key::Start), + (Keycode::new(sdl2::keyboard::Keycode::SPACE), Key::Select), ]) } @@ -394,7 +420,7 @@ impl State { #[cfg(target_arch = "wasm32")] let rebind = key == winit::keyboard::KeyCode::F12; #[cfg(not(target_arch = "wasm32"))] - let rebind = key == sdl2::keyboard::Keycode::F12; + let rebind = key.kc == sdl2::keyboard::Keycode::F12; if rebind { self.keybindings = default_keybindings(); self.rebinding = None; |
