summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-01-18 21:53:36 -0500
committerLLLL Colonq <llll@colonq>2025-01-18 21:53:36 -0500
commitfdafae3cdcb03a8b7fa736039556bcc465a34959 (patch)
tree6d7f004030300c62f31f9d9888c4289c53c0ac5b
parent6c00c069ccf08ef5e577c16acc78a5b1f53a0f8f (diff)
Serializable SDL2 keycodes
-rw-r--r--src/lib.rs6
-rw-r--r--src/state.rs50
2 files changed, 41 insertions, 15 deletions
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<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;