From fdafae3cdcb03a8b7fa736039556bcc465a34959 Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Sat, 18 Jan 2025 21:53:36 -0500 Subject: Serializable SDL2 keycodes --- src/lib.rs | 6 +++--- src/state.rs | 50 ++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 32502d2..3bd1668 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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(&self, serializer: S) -> Result + where S: serde::Serializer { + (self.kc.into_i32()).serialize(serializer) + } +} +#[cfg(not(target_arch = "wasm32"))] +impl<'de> Deserialize<'de> for Keycode { + fn deserialize(deserializer: D) -> Result + 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 { #[cfg(not(target_arch = "wasm32"))] pub fn default_keybindings() -> BiHashMap { 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; -- cgit v1.2.3