Files
porcel8/src/sdl_adapters/sdl_keyboard_adapter.rs
2025-02-14 20:07:31 +00:00

79 lines
2.8 KiB
Rust

use std::sync::mpsc::Sender;
use crate::device::keyboard::{Key, Keyboard, KeyboardEvent};
use crate::device::keyboard::KeyboardEvent::{KeyDown, KeyUp};
use crate::util::EmulatorResult;
#[derive(Debug)]
pub struct SdlKeyboardAdapter {
keyboard_event_sender: Sender<KeyboardEvent>,
}
impl SdlKeyboardAdapter {
fn new(keyboard_event_sender: Sender<KeyboardEvent>) -> SdlKeyboardAdapter {
SdlKeyboardAdapter {
keyboard_event_sender
}
}
/// Creates a paired keyboard and adapter.
pub fn new_keyboard()->(SdlKeyboardAdapter, Keyboard){
let (sender,receiver) = std::sync::mpsc::channel();
let sdl2_kb_adapter = Self::new(sender);
let device_kb = Keyboard::new(receiver);
(sdl2_kb_adapter,device_kb)
}
pub fn process_key_up(&self, keycode: sdl2::keyboard::Keycode) -> EmulatorResult<()> {
log::debug!("Sending Key up {}",keycode);
if let Some(key) = Self::keycode_to_key(keycode){
self.keyboard_event_sender.send(KeyUp(key))?;
}
Ok(())
}
pub fn process_key_down(&self, keycode: sdl2::keyboard::Keycode) -> EmulatorResult<()> {
log::trace!("Sending Key down {}",keycode);
if let Some(key) = Self::keycode_to_key(keycode){
self.keyboard_event_sender.send(KeyDown(key))?;
}
Ok(())
}
/// Key map configuration
pub fn keycode_to_key(keycode: sdl2::keyboard::Keycode) -> Option<Key>{
match keycode {
sdl2::keyboard::Keycode::X=>Some(Key::K0),
sdl2::keyboard::Keycode::Num1=>Some(Key::K1),
sdl2::keyboard::Keycode::Num2=>Some(Key::K2),
sdl2::keyboard::Keycode::Num3=>Some(Key::K3),
sdl2::keyboard::Keycode::Q=>Some(Key::K4),
sdl2::keyboard::Keycode::W=>Some(Key::K5),
sdl2::keyboard::Keycode::E=>Some(Key::K6),
sdl2::keyboard::Keycode::A=>Some(Key::K7),
sdl2::keyboard::Keycode::S=>Some(Key::K8),
sdl2::keyboard::Keycode::D=>Some(Key::K9),
sdl2::keyboard::Keycode::Z=>Some(Key::KA),
sdl2::keyboard::Keycode::C=>Some(Key::KB),
sdl2::keyboard::Keycode::Num4=>Some(Key::KC),
sdl2::keyboard::Keycode::R=>Some(Key::KD),
sdl2::keyboard::Keycode::F=>Some(Key::KE),
sdl2::keyboard::Keycode::V=>Some(Key::KF),
_=>None
}
}
}
#[cfg(test)]
mod tests{
use crate::device::keyboard::Key;
use super::SdlKeyboardAdapter;
#[test]
fn test_keycode_to_key(){
assert_eq!(Some(Key::K7), SdlKeyboardAdapter::keycode_to_key(sdl2::keyboard::Keycode::A));
}
#[test]
fn test_keycode_to_key_no_key(){
assert_eq!(None, SdlKeyboardAdapter::keycode_to_key(sdl2::keyboard::Keycode::L));
}
}