diff --git a/libretrogd/Cargo.toml b/libretrogd/Cargo.toml index d3fc34e..15e5b74 100644 --- a/libretrogd/Cargo.toml +++ b/libretrogd/Cargo.toml @@ -16,6 +16,7 @@ byteorder = "1.4.3" thiserror = "=1.0.30" rand = "0.8.5" num-traits = "0.2.14" +bitflags = "1.3" [dev-dependencies] claim = "0.5.0" diff --git a/libretrogd/src/system/event.rs b/libretrogd/src/system/event.rs new file mode 100644 index 0000000..091e66f --- /dev/null +++ b/libretrogd/src/system/event.rs @@ -0,0 +1,192 @@ +// The primary reason for these "event" enumerations existing is to allow +// us to *not* expose SDL2 types back to applications, thus preventing them +// from being required to explicitly add SDL2 as a dependency even if they +// never call into SDL2 directly anywhere (the SDL2 dependency can just be +// provided automatically by libretrogd). +// +// Also note, that with the intended use-cases (for now) that I have for libretrogd, +// I don't really care about all possible SDL2 events that could be raised. Thus, +// I only map the SDL2 events which I care about here. I will extend this in the +// future should I require it. + +use bitflags::bitflags; + +use crate::system::{Keycode, MouseButton, MouseButtons, Scancode}; +use crate::system::MouseEvent::MouseButtonUp; + +#[derive(Debug, Clone, PartialEq)] +pub enum WindowEvent { + Shown, + Hidden, + Exposed, + Moved(i32, i32), + Resized(i32, i32), + SizeChanged(i32, i32), + Minimized, + Maximized, + Restored, + Enter, + Leave, + FocusGained, + FocusLost, + Close, +} + +impl TryFrom for WindowEvent { + type Error = (); + + fn try_from(value: sdl2::event::WindowEvent) -> Result { + match value { + sdl2::event::WindowEvent::Shown => Ok(WindowEvent::Shown), + sdl2::event::WindowEvent::Hidden => Ok(WindowEvent::Hidden), + sdl2::event::WindowEvent::Exposed => Ok(WindowEvent::Exposed), + sdl2::event::WindowEvent::Moved(x, y) => Ok(WindowEvent::Moved(x, y)), + sdl2::event::WindowEvent::Resized(width, height) => Ok(WindowEvent::Resized(width, height)), + sdl2::event::WindowEvent::SizeChanged(width, height) => Ok(WindowEvent::SizeChanged(width, height)), + sdl2::event::WindowEvent::Minimized => Ok(WindowEvent::Minimized), + sdl2::event::WindowEvent::Maximized => Ok(WindowEvent::Maximized), + sdl2::event::WindowEvent::Restored => Ok(WindowEvent::Restored), + sdl2::event::WindowEvent::Enter => Ok(WindowEvent::Enter), + sdl2::event::WindowEvent::Leave => Ok(WindowEvent::Leave), + sdl2::event::WindowEvent::FocusGained => Ok(WindowEvent::FocusGained), + sdl2::event::WindowEvent::FocusLost => Ok(WindowEvent::FocusLost), + sdl2::event::WindowEvent::Close => Ok(WindowEvent::Close), + _ => Err(()) + } + } +} + +bitflags! { + pub struct KeyModifiers: u16 { + const NOMOD = 0x0000; + const LSHIFTMOD = 0x0001; + const RSHIFTMOD = 0x0002; + const LCTRLMOD = 0x0040; + const RCTRLMOD = 0x0080; + const LALTMOD = 0x0100; + const RALTMOD = 0x0200; + const LGUIMOD = 0x0400; + const RGUIMOD = 0x0800; + const NUMMOD = 0x1000; + const CAPSMOD = 0x2000; + const MODEMOD = 0x4000; + const RESERVEDMOD = 0x8000; + } +} + +#[derive(Debug, Clone, PartialEq)] +pub enum KeyboardEvent { + KeyUp { + keycode: Option, + scancode: Option, + keymod: KeyModifiers, + repeat: bool, + }, + KeyDown { + keycode: Option, + scancode: Option, + keymod: KeyModifiers, + repeat: bool, + }, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum MouseEvent { + MouseMotion { + x: i32, + y: i32, + x_delta: i32, + y_delta: i32, + buttons: MouseButtons, + }, + MouseButtonDown { + x: i32, + y: i32, + button: MouseButton, + clicks: u8, + }, + MouseButtonUp { + x: i32, + y: i32, + button: MouseButton, + clicks: u8, + }, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum SystemEvent { + Quit, + AppTerminating, + AppLowMemory, + AppWillEnterBackground, + AppDidEnterBackground, + AppWillEnterForeground, + AppDidEnterForeground, + Window(WindowEvent), + Keyboard(KeyboardEvent), + Mouse(MouseEvent), +} + +impl TryFrom for SystemEvent { + type Error = (); + + fn try_from(value: sdl2::event::Event) -> Result { + match value { + sdl2::event::Event::Quit { .. } => Ok(SystemEvent::Quit), + sdl2::event::Event::AppTerminating { .. } => Ok(SystemEvent::AppTerminating), + sdl2::event::Event::AppLowMemory { .. } => Ok(SystemEvent::AppLowMemory), + sdl2::event::Event::AppWillEnterBackground { .. } => Ok(SystemEvent::AppWillEnterBackground), + sdl2::event::Event::AppDidEnterBackground { .. } => Ok(SystemEvent::AppDidEnterBackground), + sdl2::event::Event::AppWillEnterForeground { .. } => Ok(SystemEvent::AppWillEnterForeground), + sdl2::event::Event::AppDidEnterForeground { .. } => Ok(SystemEvent::AppDidEnterForeground), + sdl2::event::Event::Window { win_event, .. } => { + match win_event.try_into() { + Ok(window_event) => Ok(SystemEvent::Window(window_event)), + Err(e) => Err(e), + } + }, + sdl2::event::Event::KeyDown { keycode, scancode, keymod, repeat, .. } => { + Ok(SystemEvent::Keyboard(KeyboardEvent::KeyDown { + keycode: keycode.map(|keycode| keycode.into()), + scancode: scancode.map(|scancode| scancode.into()), + keymod: KeyModifiers::from_bits_truncate(keymod.bits()), + repeat + })) + }, + sdl2::event::Event::KeyUp { keycode, scancode, keymod, repeat, .. } => { + Ok(SystemEvent::Keyboard(KeyboardEvent::KeyUp { + keycode: keycode.map(|keycode| keycode.into()), + scancode: scancode.map(|scancode| scancode.into()), + keymod: KeyModifiers::from_bits_truncate(keymod.bits()), + repeat + })) + } + sdl2::event::Event::MouseMotion { mousestate, x, y, xrel, yrel, .. } => { + Ok(SystemEvent::Mouse(MouseEvent::MouseMotion { + x, + y, + x_delta: xrel, + y_delta: yrel, + buttons: MouseButtons::from_bits_truncate(mousestate.to_sdl_state()), + })) + }, + sdl2::event::Event::MouseButtonDown { mouse_btn, clicks, x, y, .. } => { + Ok(SystemEvent::Mouse(MouseEvent::MouseButtonDown { + x, + y, + clicks, + button: mouse_btn.into(), + })) + }, + sdl2::event::Event::MouseButtonUp { mouse_btn, clicks, x, y, .. } => { + Ok(SystemEvent::Mouse(MouseButtonUp { + x, + y, + clicks, + button: mouse_btn.into(), + })) + }, + _ => Err(()) + } + } +} \ No newline at end of file diff --git a/libretrogd/src/system/input_devices/keyboard/codes.rs b/libretrogd/src/system/input_devices/keyboard/codes.rs new file mode 100644 index 0000000..1f4b434 --- /dev/null +++ b/libretrogd/src/system/input_devices/keyboard/codes.rs @@ -0,0 +1,483 @@ +// ugh + +#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] +#[repr(i32)] +pub enum Keycode { + Backspace = sdl2::keyboard::Keycode::Backspace as i32, + Tab = sdl2::keyboard::Keycode::Tab as i32, + Return = sdl2::keyboard::Keycode::Return as i32, + Escape = sdl2::keyboard::Keycode::Escape as i32, + Space = sdl2::keyboard::Keycode::Space as i32, + Exclaim = sdl2::keyboard::Keycode::Exclaim as i32, + Quotedbl = sdl2::keyboard::Keycode::Quotedbl as i32, + Hash = sdl2::keyboard::Keycode::Hash as i32, + Dollar = sdl2::keyboard::Keycode::Dollar as i32, + Percent = sdl2::keyboard::Keycode::Percent as i32, + Ampersand = sdl2::keyboard::Keycode::Ampersand as i32, + Quote = sdl2::keyboard::Keycode::Quote as i32, + LeftParen = sdl2::keyboard::Keycode::LeftParen as i32, + RightParen = sdl2::keyboard::Keycode::RightParen as i32, + Asterisk = sdl2::keyboard::Keycode::Asterisk as i32, + Plus = sdl2::keyboard::Keycode::Plus as i32, + Comma = sdl2::keyboard::Keycode::Comma as i32, + Minus = sdl2::keyboard::Keycode::Minus as i32, + Period = sdl2::keyboard::Keycode::Period as i32, + Slash = sdl2::keyboard::Keycode::Slash as i32, + Num0 = sdl2::keyboard::Keycode::Num0 as i32, + Num1 = sdl2::keyboard::Keycode::Num1 as i32, + Num2 = sdl2::keyboard::Keycode::Num2 as i32, + Num3 = sdl2::keyboard::Keycode::Num3 as i32, + Num4 = sdl2::keyboard::Keycode::Num4 as i32, + Num5 = sdl2::keyboard::Keycode::Num5 as i32, + Num6 = sdl2::keyboard::Keycode::Num6 as i32, + Num7 = sdl2::keyboard::Keycode::Num7 as i32, + Num8 = sdl2::keyboard::Keycode::Num8 as i32, + Num9 = sdl2::keyboard::Keycode::Num9 as i32, + Colon = sdl2::keyboard::Keycode::Colon as i32, + Semicolon = sdl2::keyboard::Keycode::Semicolon as i32, + Less = sdl2::keyboard::Keycode::Less as i32, + Equals = sdl2::keyboard::Keycode::Equals as i32, + Greater = sdl2::keyboard::Keycode::Greater as i32, + Question = sdl2::keyboard::Keycode::Question as i32, + At = sdl2::keyboard::Keycode::At as i32, + LeftBracket = sdl2::keyboard::Keycode::LeftBracket as i32, + Backslash = sdl2::keyboard::Keycode::Backslash as i32, + RightBracket = sdl2::keyboard::Keycode::RightBracket as i32, + Caret = sdl2::keyboard::Keycode::Caret as i32, + Underscore = sdl2::keyboard::Keycode::Underscore as i32, + Backquote = sdl2::keyboard::Keycode::Backquote as i32, + A = sdl2::keyboard::Keycode::A as i32, + B = sdl2::keyboard::Keycode::B as i32, + C = sdl2::keyboard::Keycode::C as i32, + D = sdl2::keyboard::Keycode::D as i32, + E = sdl2::keyboard::Keycode::E as i32, + F = sdl2::keyboard::Keycode::F as i32, + G = sdl2::keyboard::Keycode::G as i32, + H = sdl2::keyboard::Keycode::H as i32, + I = sdl2::keyboard::Keycode::I as i32, + J = sdl2::keyboard::Keycode::J as i32, + K = sdl2::keyboard::Keycode::K as i32, + L = sdl2::keyboard::Keycode::L as i32, + M = sdl2::keyboard::Keycode::M as i32, + N = sdl2::keyboard::Keycode::N as i32, + O = sdl2::keyboard::Keycode::O as i32, + P = sdl2::keyboard::Keycode::P as i32, + Q = sdl2::keyboard::Keycode::Q as i32, + R = sdl2::keyboard::Keycode::R as i32, + S = sdl2::keyboard::Keycode::S as i32, + T = sdl2::keyboard::Keycode::T as i32, + U = sdl2::keyboard::Keycode::U as i32, + V = sdl2::keyboard::Keycode::V as i32, + W = sdl2::keyboard::Keycode::W as i32, + X = sdl2::keyboard::Keycode::X as i32, + Y = sdl2::keyboard::Keycode::Y as i32, + Z = sdl2::keyboard::Keycode::Z as i32, + Delete = sdl2::keyboard::Keycode::Delete as i32, + CapsLock = sdl2::keyboard::Keycode::CapsLock as i32, + F1 = sdl2::keyboard::Keycode::F1 as i32, + F2 = sdl2::keyboard::Keycode::F2 as i32, + F3 = sdl2::keyboard::Keycode::F3 as i32, + F4 = sdl2::keyboard::Keycode::F4 as i32, + F5 = sdl2::keyboard::Keycode::F5 as i32, + F6 = sdl2::keyboard::Keycode::F6 as i32, + F7 = sdl2::keyboard::Keycode::F7 as i32, + F8 = sdl2::keyboard::Keycode::F8 as i32, + F9 = sdl2::keyboard::Keycode::F9 as i32, + F10 = sdl2::keyboard::Keycode::F10 as i32, + F11 = sdl2::keyboard::Keycode::F11 as i32, + F12 = sdl2::keyboard::Keycode::F12 as i32, + PrintScreen = sdl2::keyboard::Keycode::PrintScreen as i32, + ScrollLock = sdl2::keyboard::Keycode::ScrollLock as i32, + Pause = sdl2::keyboard::Keycode::Pause as i32, + Insert = sdl2::keyboard::Keycode::Insert as i32, + Home = sdl2::keyboard::Keycode::Home as i32, + PageUp = sdl2::keyboard::Keycode::PageUp as i32, + End = sdl2::keyboard::Keycode::End as i32, + PageDown = sdl2::keyboard::Keycode::PageDown as i32, + Right = sdl2::keyboard::Keycode::Right as i32, + Left = sdl2::keyboard::Keycode::Left as i32, + Down = sdl2::keyboard::Keycode::Down as i32, + Up = sdl2::keyboard::Keycode::Up as i32, + NumLockClear = sdl2::keyboard::Keycode::NumLockClear as i32, + KpDivide = sdl2::keyboard::Keycode::KpDivide as i32, + KpMultiply = sdl2::keyboard::Keycode::KpMultiply as i32, + KpMinus = sdl2::keyboard::Keycode::KpMinus as i32, + KpPlus = sdl2::keyboard::Keycode::KpPlus as i32, + KpEnter = sdl2::keyboard::Keycode::KpEnter as i32, + Kp1 = sdl2::keyboard::Keycode::Kp1 as i32, + Kp2 = sdl2::keyboard::Keycode::Kp2 as i32, + Kp3 = sdl2::keyboard::Keycode::Kp3 as i32, + Kp4 = sdl2::keyboard::Keycode::Kp4 as i32, + Kp5 = sdl2::keyboard::Keycode::Kp5 as i32, + Kp6 = sdl2::keyboard::Keycode::Kp6 as i32, + Kp7 = sdl2::keyboard::Keycode::Kp7 as i32, + Kp8 = sdl2::keyboard::Keycode::Kp8 as i32, + Kp9 = sdl2::keyboard::Keycode::Kp9 as i32, + Kp0 = sdl2::keyboard::Keycode::Kp0 as i32, + KpPeriod = sdl2::keyboard::Keycode::KpPeriod as i32, + Application = sdl2::keyboard::Keycode::Application as i32, + Power = sdl2::keyboard::Keycode::Power as i32, + KpEquals = sdl2::keyboard::Keycode::KpEquals as i32, + F13 = sdl2::keyboard::Keycode::F13 as i32, + F14 = sdl2::keyboard::Keycode::F14 as i32, + F15 = sdl2::keyboard::Keycode::F15 as i32, + F16 = sdl2::keyboard::Keycode::F16 as i32, + F17 = sdl2::keyboard::Keycode::F17 as i32, + F18 = sdl2::keyboard::Keycode::F18 as i32, + F19 = sdl2::keyboard::Keycode::F19 as i32, + F20 = sdl2::keyboard::Keycode::F20 as i32, + F21 = sdl2::keyboard::Keycode::F21 as i32, + F22 = sdl2::keyboard::Keycode::F22 as i32, + F23 = sdl2::keyboard::Keycode::F23 as i32, + F24 = sdl2::keyboard::Keycode::F24 as i32, + Execute = sdl2::keyboard::Keycode::Execute as i32, + Help = sdl2::keyboard::Keycode::Help as i32, + Menu = sdl2::keyboard::Keycode::Menu as i32, + Select = sdl2::keyboard::Keycode::Select as i32, + Stop = sdl2::keyboard::Keycode::Stop as i32, + Again = sdl2::keyboard::Keycode::Again as i32, + Undo = sdl2::keyboard::Keycode::Undo as i32, + Cut = sdl2::keyboard::Keycode::Cut as i32, + Copy = sdl2::keyboard::Keycode::Copy as i32, + Paste = sdl2::keyboard::Keycode::Paste as i32, + Find = sdl2::keyboard::Keycode::Find as i32, + Mute = sdl2::keyboard::Keycode::Mute as i32, + VolumeUp = sdl2::keyboard::Keycode::VolumeUp as i32, + VolumeDown = sdl2::keyboard::Keycode::VolumeDown as i32, + KpComma = sdl2::keyboard::Keycode::KpComma as i32, + KpEqualsAS400 = sdl2::keyboard::Keycode::KpEqualsAS400 as i32, + AltErase = sdl2::keyboard::Keycode::AltErase as i32, + Sysreq = sdl2::keyboard::Keycode::Sysreq as i32, + Cancel = sdl2::keyboard::Keycode::Cancel as i32, + Clear = sdl2::keyboard::Keycode::Clear as i32, + Prior = sdl2::keyboard::Keycode::Prior as i32, + Return2 = sdl2::keyboard::Keycode::Return2 as i32, + Separator = sdl2::keyboard::Keycode::Separator as i32, + Out = sdl2::keyboard::Keycode::Out as i32, + Oper = sdl2::keyboard::Keycode::Oper as i32, + ClearAgain = sdl2::keyboard::Keycode::ClearAgain as i32, + CrSel = sdl2::keyboard::Keycode::CrSel as i32, + ExSel = sdl2::keyboard::Keycode::ExSel as i32, + Kp00 = sdl2::keyboard::Keycode::Kp00 as i32, + Kp000 = sdl2::keyboard::Keycode::Kp000 as i32, + ThousandsSeparator = sdl2::keyboard::Keycode::ThousandsSeparator as i32, + DecimalSeparator = sdl2::keyboard::Keycode::DecimalSeparator as i32, + CurrencyUnit = sdl2::keyboard::Keycode::CurrencyUnit as i32, + CurrencySubUnit = sdl2::keyboard::Keycode::CurrencySubUnit as i32, + KpLeftParen = sdl2::keyboard::Keycode::KpLeftParen as i32, + KpRightParen = sdl2::keyboard::Keycode::KpRightParen as i32, + KpLeftBrace = sdl2::keyboard::Keycode::KpLeftBrace as i32, + KpRightBrace = sdl2::keyboard::Keycode::KpRightBrace as i32, + KpTab = sdl2::keyboard::Keycode::KpTab as i32, + KpBackspace = sdl2::keyboard::Keycode::KpBackspace as i32, + KpA = sdl2::keyboard::Keycode::KpA as i32, + KpB = sdl2::keyboard::Keycode::KpB as i32, + KpC = sdl2::keyboard::Keycode::KpC as i32, + KpD = sdl2::keyboard::Keycode::KpD as i32, + KpE = sdl2::keyboard::Keycode::KpE as i32, + KpF = sdl2::keyboard::Keycode::KpF as i32, + KpXor = sdl2::keyboard::Keycode::KpXor as i32, + KpPower = sdl2::keyboard::Keycode::KpPower as i32, + KpPercent = sdl2::keyboard::Keycode::KpPercent as i32, + KpLess = sdl2::keyboard::Keycode::KpLess as i32, + KpGreater = sdl2::keyboard::Keycode::KpGreater as i32, + KpAmpersand = sdl2::keyboard::Keycode::KpAmpersand as i32, + KpDblAmpersand = sdl2::keyboard::Keycode::KpDblAmpersand as i32, + KpVerticalBar = sdl2::keyboard::Keycode::KpVerticalBar as i32, + KpDblVerticalBar = sdl2::keyboard::Keycode::KpDblVerticalBar as i32, + KpColon = sdl2::keyboard::Keycode::KpColon as i32, + KpHash = sdl2::keyboard::Keycode::KpHash as i32, + KpSpace = sdl2::keyboard::Keycode::KpSpace as i32, + KpAt = sdl2::keyboard::Keycode::KpAt as i32, + KpExclam = sdl2::keyboard::Keycode::KpExclam as i32, + KpMemStore = sdl2::keyboard::Keycode::KpMemStore as i32, + KpMemRecall = sdl2::keyboard::Keycode::KpMemRecall as i32, + KpMemClear = sdl2::keyboard::Keycode::KpMemClear as i32, + KpMemAdd = sdl2::keyboard::Keycode::KpMemAdd as i32, + KpMemSubtract = sdl2::keyboard::Keycode::KpMemSubtract as i32, + KpMemMultiply = sdl2::keyboard::Keycode::KpMemMultiply as i32, + KpMemDivide = sdl2::keyboard::Keycode::KpMemDivide as i32, + KpPlusMinus = sdl2::keyboard::Keycode::KpPlusMinus as i32, + KpClear = sdl2::keyboard::Keycode::KpClear as i32, + KpClearEntry = sdl2::keyboard::Keycode::KpClearEntry as i32, + KpBinary = sdl2::keyboard::Keycode::KpBinary as i32, + KpOctal = sdl2::keyboard::Keycode::KpOctal as i32, + KpDecimal = sdl2::keyboard::Keycode::KpDecimal as i32, + KpHexadecimal = sdl2::keyboard::Keycode::KpHexadecimal as i32, + LCtrl = sdl2::keyboard::Keycode::LCtrl as i32, + LShift = sdl2::keyboard::Keycode::LShift as i32, + LAlt = sdl2::keyboard::Keycode::LAlt as i32, + LGui = sdl2::keyboard::Keycode::LGui as i32, + RCtrl = sdl2::keyboard::Keycode::RCtrl as i32, + RShift = sdl2::keyboard::Keycode::RShift as i32, + RAlt = sdl2::keyboard::Keycode::RAlt as i32, + RGui = sdl2::keyboard::Keycode::RGui as i32, + Mode = sdl2::keyboard::Keycode::Mode as i32, + AudioNext = sdl2::keyboard::Keycode::AudioNext as i32, + AudioPrev = sdl2::keyboard::Keycode::AudioPrev as i32, + AudioStop = sdl2::keyboard::Keycode::AudioStop as i32, + AudioPlay = sdl2::keyboard::Keycode::AudioPlay as i32, + AudioMute = sdl2::keyboard::Keycode::AudioMute as i32, + MediaSelect = sdl2::keyboard::Keycode::MediaSelect as i32, + Www = sdl2::keyboard::Keycode::Www as i32, + Mail = sdl2::keyboard::Keycode::Mail as i32, + Calculator = sdl2::keyboard::Keycode::Calculator as i32, + Computer = sdl2::keyboard::Keycode::Computer as i32, + AcSearch = sdl2::keyboard::Keycode::AcSearch as i32, + AcHome = sdl2::keyboard::Keycode::AcHome as i32, + AcBack = sdl2::keyboard::Keycode::AcBack as i32, + AcForward = sdl2::keyboard::Keycode::AcForward as i32, + AcStop = sdl2::keyboard::Keycode::AcStop as i32, + AcRefresh = sdl2::keyboard::Keycode::AcRefresh as i32, + AcBookmarks = sdl2::keyboard::Keycode::AcBookmarks as i32, + BrightnessDown = sdl2::keyboard::Keycode::BrightnessDown as i32, + BrightnessUp = sdl2::keyboard::Keycode::BrightnessUp as i32, + DisplaySwitch = sdl2::keyboard::Keycode::DisplaySwitch as i32, + KbdIllumToggle = sdl2::keyboard::Keycode::KbdIllumToggle as i32, + KbdIllumDown = sdl2::keyboard::Keycode::KbdIllumDown as i32, + KbdIllumUp = sdl2::keyboard::Keycode::KbdIllumUp as i32, + Eject = sdl2::keyboard::Keycode::Eject as i32, + Sleep = sdl2::keyboard::Keycode::Sleep as i32, +} + +impl From for Keycode { + fn from(value: sdl2::keyboard::Keycode) -> Self { + match value { + sdl2::keyboard::Keycode::Backspace => Keycode::Backspace, + sdl2::keyboard::Keycode::Tab => Keycode::Tab, + sdl2::keyboard::Keycode::Return => Keycode::Return, + sdl2::keyboard::Keycode::Escape => Keycode::Escape, + sdl2::keyboard::Keycode::Space => Keycode::Space, + sdl2::keyboard::Keycode::Exclaim => Keycode::Exclaim, + sdl2::keyboard::Keycode::Quotedbl => Keycode::Quotedbl, + sdl2::keyboard::Keycode::Hash => Keycode::Hash, + sdl2::keyboard::Keycode::Dollar => Keycode::Dollar, + sdl2::keyboard::Keycode::Percent => Keycode::Percent, + sdl2::keyboard::Keycode::Ampersand => Keycode::Ampersand, + sdl2::keyboard::Keycode::Quote => Keycode::Quote, + sdl2::keyboard::Keycode::LeftParen => Keycode::LeftParen, + sdl2::keyboard::Keycode::RightParen => Keycode::RightParen, + sdl2::keyboard::Keycode::Asterisk => Keycode::Asterisk, + sdl2::keyboard::Keycode::Plus => Keycode::Plus, + sdl2::keyboard::Keycode::Comma => Keycode::Comma, + sdl2::keyboard::Keycode::Minus => Keycode::Minus, + sdl2::keyboard::Keycode::Period => Keycode::Period, + sdl2::keyboard::Keycode::Slash => Keycode::Slash, + sdl2::keyboard::Keycode::Num0 => Keycode::Num0, + sdl2::keyboard::Keycode::Num1 => Keycode::Num1, + sdl2::keyboard::Keycode::Num2 => Keycode::Num2, + sdl2::keyboard::Keycode::Num3 => Keycode::Num3, + sdl2::keyboard::Keycode::Num4 => Keycode::Num4, + sdl2::keyboard::Keycode::Num5 => Keycode::Num5, + sdl2::keyboard::Keycode::Num6 => Keycode::Num6, + sdl2::keyboard::Keycode::Num7 => Keycode::Num7, + sdl2::keyboard::Keycode::Num8 => Keycode::Num8, + sdl2::keyboard::Keycode::Num9 => Keycode::Num9, + sdl2::keyboard::Keycode::Colon => Keycode::Colon, + sdl2::keyboard::Keycode::Semicolon => Keycode::Semicolon, + sdl2::keyboard::Keycode::Less => Keycode::Less, + sdl2::keyboard::Keycode::Equals => Keycode::Equals, + sdl2::keyboard::Keycode::Greater => Keycode::Greater, + sdl2::keyboard::Keycode::Question => Keycode::Question, + sdl2::keyboard::Keycode::At => Keycode::At, + sdl2::keyboard::Keycode::LeftBracket => Keycode::LeftBracket, + sdl2::keyboard::Keycode::Backslash => Keycode::Backslash, + sdl2::keyboard::Keycode::RightBracket => Keycode::RightBracket, + sdl2::keyboard::Keycode::Caret => Keycode::Caret, + sdl2::keyboard::Keycode::Underscore => Keycode::Underscore, + sdl2::keyboard::Keycode::Backquote => Keycode::Backquote, + sdl2::keyboard::Keycode::A => Keycode::A, + sdl2::keyboard::Keycode::B => Keycode::B, + sdl2::keyboard::Keycode::C => Keycode::C, + sdl2::keyboard::Keycode::D => Keycode::D, + sdl2::keyboard::Keycode::E => Keycode::E, + sdl2::keyboard::Keycode::F => Keycode::F, + sdl2::keyboard::Keycode::G => Keycode::G, + sdl2::keyboard::Keycode::H => Keycode::H, + sdl2::keyboard::Keycode::I => Keycode::I, + sdl2::keyboard::Keycode::J => Keycode::J, + sdl2::keyboard::Keycode::K => Keycode::K, + sdl2::keyboard::Keycode::L => Keycode::L, + sdl2::keyboard::Keycode::M => Keycode::M, + sdl2::keyboard::Keycode::N => Keycode::N, + sdl2::keyboard::Keycode::O => Keycode::O, + sdl2::keyboard::Keycode::P => Keycode::P, + sdl2::keyboard::Keycode::Q => Keycode::Q, + sdl2::keyboard::Keycode::R => Keycode::R, + sdl2::keyboard::Keycode::S => Keycode::S, + sdl2::keyboard::Keycode::T => Keycode::T, + sdl2::keyboard::Keycode::U => Keycode::U, + sdl2::keyboard::Keycode::V => Keycode::V, + sdl2::keyboard::Keycode::W => Keycode::W, + sdl2::keyboard::Keycode::X => Keycode::X, + sdl2::keyboard::Keycode::Y => Keycode::Y, + sdl2::keyboard::Keycode::Z => Keycode::Z, + sdl2::keyboard::Keycode::Delete => Keycode::Delete, + sdl2::keyboard::Keycode::CapsLock => Keycode::CapsLock, + sdl2::keyboard::Keycode::F1 => Keycode::F1, + sdl2::keyboard::Keycode::F2 => Keycode::F2, + sdl2::keyboard::Keycode::F3 => Keycode::F3, + sdl2::keyboard::Keycode::F4 => Keycode::F4, + sdl2::keyboard::Keycode::F5 => Keycode::F5, + sdl2::keyboard::Keycode::F6 => Keycode::F6, + sdl2::keyboard::Keycode::F7 => Keycode::F7, + sdl2::keyboard::Keycode::F8 => Keycode::F8, + sdl2::keyboard::Keycode::F9 => Keycode::F9, + sdl2::keyboard::Keycode::F10 => Keycode::F10, + sdl2::keyboard::Keycode::F11 => Keycode::F11, + sdl2::keyboard::Keycode::F12 => Keycode::F12, + sdl2::keyboard::Keycode::PrintScreen => Keycode::PrintScreen, + sdl2::keyboard::Keycode::ScrollLock => Keycode::ScrollLock, + sdl2::keyboard::Keycode::Pause => Keycode::Pause, + sdl2::keyboard::Keycode::Insert => Keycode::Insert, + sdl2::keyboard::Keycode::Home => Keycode::Home, + sdl2::keyboard::Keycode::PageUp => Keycode::PageUp, + sdl2::keyboard::Keycode::End => Keycode::End, + sdl2::keyboard::Keycode::PageDown => Keycode::PageDown, + sdl2::keyboard::Keycode::Right => Keycode::Right, + sdl2::keyboard::Keycode::Left => Keycode::Left, + sdl2::keyboard::Keycode::Down => Keycode::Down, + sdl2::keyboard::Keycode::Up => Keycode::Up, + sdl2::keyboard::Keycode::NumLockClear => Keycode::NumLockClear, + sdl2::keyboard::Keycode::KpDivide => Keycode::KpDivide, + sdl2::keyboard::Keycode::KpMultiply => Keycode::KpMultiply, + sdl2::keyboard::Keycode::KpMinus => Keycode::KpMinus, + sdl2::keyboard::Keycode::KpPlus => Keycode::KpPlus, + sdl2::keyboard::Keycode::KpEnter => Keycode::KpEnter, + sdl2::keyboard::Keycode::Kp1 => Keycode::Kp1, + sdl2::keyboard::Keycode::Kp2 => Keycode::Kp2, + sdl2::keyboard::Keycode::Kp3 => Keycode::Kp3, + sdl2::keyboard::Keycode::Kp4 => Keycode::Kp4, + sdl2::keyboard::Keycode::Kp5 => Keycode::Kp5, + sdl2::keyboard::Keycode::Kp6 => Keycode::Kp6, + sdl2::keyboard::Keycode::Kp7 => Keycode::Kp7, + sdl2::keyboard::Keycode::Kp8 => Keycode::Kp8, + sdl2::keyboard::Keycode::Kp9 => Keycode::Kp9, + sdl2::keyboard::Keycode::Kp0 => Keycode::Kp0, + sdl2::keyboard::Keycode::KpPeriod => Keycode::KpPeriod, + sdl2::keyboard::Keycode::Application => Keycode::Application, + sdl2::keyboard::Keycode::Power => Keycode::Power, + sdl2::keyboard::Keycode::KpEquals => Keycode::KpEquals, + sdl2::keyboard::Keycode::F13 => Keycode::F13, + sdl2::keyboard::Keycode::F14 => Keycode::F14, + sdl2::keyboard::Keycode::F15 => Keycode::F15, + sdl2::keyboard::Keycode::F16 => Keycode::F16, + sdl2::keyboard::Keycode::F17 => Keycode::F17, + sdl2::keyboard::Keycode::F18 => Keycode::F18, + sdl2::keyboard::Keycode::F19 => Keycode::F19, + sdl2::keyboard::Keycode::F20 => Keycode::F20, + sdl2::keyboard::Keycode::F21 => Keycode::F21, + sdl2::keyboard::Keycode::F22 => Keycode::F22, + sdl2::keyboard::Keycode::F23 => Keycode::F23, + sdl2::keyboard::Keycode::F24 => Keycode::F24, + sdl2::keyboard::Keycode::Execute => Keycode::Execute, + sdl2::keyboard::Keycode::Help => Keycode::Help, + sdl2::keyboard::Keycode::Menu => Keycode::Menu, + sdl2::keyboard::Keycode::Select => Keycode::Select, + sdl2::keyboard::Keycode::Stop => Keycode::Stop, + sdl2::keyboard::Keycode::Again => Keycode::Again, + sdl2::keyboard::Keycode::Undo => Keycode::Undo, + sdl2::keyboard::Keycode::Cut => Keycode::Cut, + sdl2::keyboard::Keycode::Copy => Keycode::Copy, + sdl2::keyboard::Keycode::Paste => Keycode::Paste, + sdl2::keyboard::Keycode::Find => Keycode::Find, + sdl2::keyboard::Keycode::Mute => Keycode::Mute, + sdl2::keyboard::Keycode::VolumeUp => Keycode::VolumeUp, + sdl2::keyboard::Keycode::VolumeDown => Keycode::VolumeDown, + sdl2::keyboard::Keycode::KpComma => Keycode::KpComma, + sdl2::keyboard::Keycode::KpEqualsAS400 => Keycode::KpEqualsAS400, + sdl2::keyboard::Keycode::AltErase => Keycode::AltErase, + sdl2::keyboard::Keycode::Sysreq => Keycode::Sysreq, + sdl2::keyboard::Keycode::Cancel => Keycode::Cancel, + sdl2::keyboard::Keycode::Clear => Keycode::Clear, + sdl2::keyboard::Keycode::Prior => Keycode::Prior, + sdl2::keyboard::Keycode::Return2 => Keycode::Return2, + sdl2::keyboard::Keycode::Separator => Keycode::Separator, + sdl2::keyboard::Keycode::Out => Keycode::Out, + sdl2::keyboard::Keycode::Oper => Keycode::Oper, + sdl2::keyboard::Keycode::ClearAgain => Keycode::ClearAgain, + sdl2::keyboard::Keycode::CrSel => Keycode::CrSel, + sdl2::keyboard::Keycode::ExSel => Keycode::ExSel, + sdl2::keyboard::Keycode::Kp00 => Keycode::Kp00, + sdl2::keyboard::Keycode::Kp000 => Keycode::Kp000, + sdl2::keyboard::Keycode::ThousandsSeparator => Keycode::ThousandsSeparator, + sdl2::keyboard::Keycode::DecimalSeparator => Keycode::DecimalSeparator, + sdl2::keyboard::Keycode::CurrencyUnit => Keycode::CurrencyUnit, + sdl2::keyboard::Keycode::CurrencySubUnit => Keycode::CurrencySubUnit, + sdl2::keyboard::Keycode::KpLeftParen => Keycode::KpLeftParen, + sdl2::keyboard::Keycode::KpRightParen => Keycode::KpRightParen, + sdl2::keyboard::Keycode::KpLeftBrace => Keycode::KpLeftBrace, + sdl2::keyboard::Keycode::KpRightBrace => Keycode::KpRightBrace, + sdl2::keyboard::Keycode::KpTab => Keycode::KpTab, + sdl2::keyboard::Keycode::KpBackspace => Keycode::KpBackspace, + sdl2::keyboard::Keycode::KpA => Keycode::KpA, + sdl2::keyboard::Keycode::KpB => Keycode::KpB, + sdl2::keyboard::Keycode::KpC => Keycode::KpC, + sdl2::keyboard::Keycode::KpD => Keycode::KpD, + sdl2::keyboard::Keycode::KpE => Keycode::KpE, + sdl2::keyboard::Keycode::KpF => Keycode::KpF, + sdl2::keyboard::Keycode::KpXor => Keycode::KpXor, + sdl2::keyboard::Keycode::KpPower => Keycode::KpPower, + sdl2::keyboard::Keycode::KpPercent => Keycode::KpPercent, + sdl2::keyboard::Keycode::KpLess => Keycode::KpLess, + sdl2::keyboard::Keycode::KpGreater => Keycode::KpGreater, + sdl2::keyboard::Keycode::KpAmpersand => Keycode::KpAmpersand, + sdl2::keyboard::Keycode::KpDblAmpersand => Keycode::KpDblAmpersand, + sdl2::keyboard::Keycode::KpVerticalBar => Keycode::KpVerticalBar, + sdl2::keyboard::Keycode::KpDblVerticalBar => Keycode::KpDblVerticalBar, + sdl2::keyboard::Keycode::KpColon => Keycode::KpColon, + sdl2::keyboard::Keycode::KpHash => Keycode::KpHash, + sdl2::keyboard::Keycode::KpSpace => Keycode::KpSpace, + sdl2::keyboard::Keycode::KpAt => Keycode::KpAt, + sdl2::keyboard::Keycode::KpExclam => Keycode::KpExclam, + sdl2::keyboard::Keycode::KpMemStore => Keycode::KpMemStore, + sdl2::keyboard::Keycode::KpMemRecall => Keycode::KpMemRecall, + sdl2::keyboard::Keycode::KpMemClear => Keycode::KpMemClear, + sdl2::keyboard::Keycode::KpMemAdd => Keycode::KpMemAdd, + sdl2::keyboard::Keycode::KpMemSubtract => Keycode::KpMemSubtract, + sdl2::keyboard::Keycode::KpMemMultiply => Keycode::KpMemMultiply, + sdl2::keyboard::Keycode::KpMemDivide => Keycode::KpMemDivide, + sdl2::keyboard::Keycode::KpPlusMinus => Keycode::KpPlusMinus, + sdl2::keyboard::Keycode::KpClear => Keycode::KpClear, + sdl2::keyboard::Keycode::KpClearEntry => Keycode::KpClearEntry, + sdl2::keyboard::Keycode::KpBinary => Keycode::KpBinary, + sdl2::keyboard::Keycode::KpOctal => Keycode::KpOctal, + sdl2::keyboard::Keycode::KpDecimal => Keycode::KpDecimal, + sdl2::keyboard::Keycode::KpHexadecimal => Keycode::KpHexadecimal, + sdl2::keyboard::Keycode::LCtrl => Keycode::LCtrl, + sdl2::keyboard::Keycode::LShift => Keycode::LShift, + sdl2::keyboard::Keycode::LAlt => Keycode::LAlt, + sdl2::keyboard::Keycode::LGui => Keycode::LGui, + sdl2::keyboard::Keycode::RCtrl => Keycode::RCtrl, + sdl2::keyboard::Keycode::RShift => Keycode::RShift, + sdl2::keyboard::Keycode::RAlt => Keycode::RAlt, + sdl2::keyboard::Keycode::RGui => Keycode::RGui, + sdl2::keyboard::Keycode::Mode => Keycode::Mode, + sdl2::keyboard::Keycode::AudioNext => Keycode::AudioNext, + sdl2::keyboard::Keycode::AudioPrev => Keycode::AudioPrev, + sdl2::keyboard::Keycode::AudioStop => Keycode::AudioStop, + sdl2::keyboard::Keycode::AudioPlay => Keycode::AudioPlay, + sdl2::keyboard::Keycode::AudioMute => Keycode::AudioMute, + sdl2::keyboard::Keycode::MediaSelect => Keycode::MediaSelect, + sdl2::keyboard::Keycode::Www => Keycode::Www, + sdl2::keyboard::Keycode::Mail => Keycode::Mail, + sdl2::keyboard::Keycode::Calculator => Keycode::Calculator, + sdl2::keyboard::Keycode::Computer => Keycode::Computer, + sdl2::keyboard::Keycode::AcSearch => Keycode::AcSearch, + sdl2::keyboard::Keycode::AcHome => Keycode::AcHome, + sdl2::keyboard::Keycode::AcBack => Keycode::AcBack, + sdl2::keyboard::Keycode::AcForward => Keycode::AcForward, + sdl2::keyboard::Keycode::AcStop => Keycode::AcStop, + sdl2::keyboard::Keycode::AcRefresh => Keycode::AcRefresh, + sdl2::keyboard::Keycode::AcBookmarks => Keycode::AcBookmarks, + sdl2::keyboard::Keycode::BrightnessDown => Keycode::BrightnessDown, + sdl2::keyboard::Keycode::BrightnessUp => Keycode::BrightnessUp, + sdl2::keyboard::Keycode::DisplaySwitch => Keycode::DisplaySwitch, + sdl2::keyboard::Keycode::KbdIllumToggle => Keycode::KbdIllumToggle, + sdl2::keyboard::Keycode::KbdIllumDown => Keycode::KbdIllumDown, + sdl2::keyboard::Keycode::KbdIllumUp => Keycode::KbdIllumUp, + sdl2::keyboard::Keycode::Eject => Keycode::Eject, + sdl2::keyboard::Keycode::Sleep => Keycode::Sleep, + } + } +} \ No newline at end of file diff --git a/libretrogd/src/system/input_devices/keyboard.rs b/libretrogd/src/system/input_devices/keyboard/mod.rs similarity index 88% rename from libretrogd/src/system/input_devices/keyboard.rs rename to libretrogd/src/system/input_devices/keyboard/mod.rs index 9f0a2d4..328723e 100644 --- a/libretrogd/src/system/input_devices/keyboard.rs +++ b/libretrogd/src/system/input_devices/keyboard/mod.rs @@ -1,8 +1,13 @@ -use sdl2::event::Event; -use sdl2::keyboard::Scancode; +use crate::system::event::{KeyboardEvent, SystemEvent}; use super::*; +pub use self::codes::*; +pub use self::scancodes::*; + +pub mod codes; +pub mod scancodes; + const MAX_KEYS: usize = 256; /// Holds the current state of the keyboard. @@ -71,9 +76,9 @@ impl InputDevice for Keyboard { } } - fn handle_event(&mut self, event: &Event) { + fn handle_event(&mut self, event: &SystemEvent) { match event { - Event::KeyDown { scancode, .. } => { + SystemEvent::Keyboard(KeyboardEvent::KeyDown { scancode, .. }) => { if let Some(scancode) = scancode { let state = &mut self.keyboard[*scancode as usize]; *state = match *state { @@ -83,7 +88,7 @@ impl InputDevice for Keyboard { }; } } - Event::KeyUp { scancode, .. } => { + SystemEvent::Keyboard(KeyboardEvent::KeyUp { scancode, .. }) => { if let Some(scancode) = scancode { self.keyboard[*scancode as usize] = ButtonState::Released; } diff --git a/libretrogd/src/system/input_devices/keyboard/scancodes.rs b/libretrogd/src/system/input_devices/keyboard/scancodes.rs new file mode 100644 index 0000000..7ef9b6f --- /dev/null +++ b/libretrogd/src/system/input_devices/keyboard/scancodes.rs @@ -0,0 +1,495 @@ +// ugh + +#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] +#[repr(i32)] +pub enum Scancode { + A = sdl2::keyboard::Scancode::A as i32, + B = sdl2::keyboard::Scancode::B as i32, + C = sdl2::keyboard::Scancode::C as i32, + D = sdl2::keyboard::Scancode::D as i32, + E = sdl2::keyboard::Scancode::E as i32, + F = sdl2::keyboard::Scancode::F as i32, + G = sdl2::keyboard::Scancode::G as i32, + H = sdl2::keyboard::Scancode::H as i32, + I = sdl2::keyboard::Scancode::I as i32, + J = sdl2::keyboard::Scancode::J as i32, + K = sdl2::keyboard::Scancode::K as i32, + L = sdl2::keyboard::Scancode::L as i32, + M = sdl2::keyboard::Scancode::M as i32, + N = sdl2::keyboard::Scancode::N as i32, + O = sdl2::keyboard::Scancode::O as i32, + P = sdl2::keyboard::Scancode::P as i32, + Q = sdl2::keyboard::Scancode::Q as i32, + R = sdl2::keyboard::Scancode::R as i32, + S = sdl2::keyboard::Scancode::S as i32, + T = sdl2::keyboard::Scancode::T as i32, + U = sdl2::keyboard::Scancode::U as i32, + V = sdl2::keyboard::Scancode::V as i32, + W = sdl2::keyboard::Scancode::W as i32, + X = sdl2::keyboard::Scancode::X as i32, + Y = sdl2::keyboard::Scancode::Y as i32, + Z = sdl2::keyboard::Scancode::Z as i32, + Num1 = sdl2::keyboard::Scancode::Num1 as i32, + Num2 = sdl2::keyboard::Scancode::Num2 as i32, + Num3 = sdl2::keyboard::Scancode::Num3 as i32, + Num4 = sdl2::keyboard::Scancode::Num4 as i32, + Num5 = sdl2::keyboard::Scancode::Num5 as i32, + Num6 = sdl2::keyboard::Scancode::Num6 as i32, + Num7 = sdl2::keyboard::Scancode::Num7 as i32, + Num8 = sdl2::keyboard::Scancode::Num8 as i32, + Num9 = sdl2::keyboard::Scancode::Num9 as i32, + Num0 = sdl2::keyboard::Scancode::Num0 as i32, + Return = sdl2::keyboard::Scancode::Return as i32, + Escape = sdl2::keyboard::Scancode::Escape as i32, + Backspace = sdl2::keyboard::Scancode::Backspace as i32, + Tab = sdl2::keyboard::Scancode::Tab as i32, + Space = sdl2::keyboard::Scancode::Space as i32, + Minus = sdl2::keyboard::Scancode::Minus as i32, + Equals = sdl2::keyboard::Scancode::Equals as i32, + LeftBracket = sdl2::keyboard::Scancode::LeftBracket as i32, + RightBracket = sdl2::keyboard::Scancode::RightBracket as i32, + Backslash = sdl2::keyboard::Scancode::Backslash as i32, + NonUsHash = sdl2::keyboard::Scancode::NonUsHash as i32, + Semicolon = sdl2::keyboard::Scancode::Semicolon as i32, + Apostrophe = sdl2::keyboard::Scancode::Apostrophe as i32, + Grave = sdl2::keyboard::Scancode::Grave as i32, + Comma = sdl2::keyboard::Scancode::Comma as i32, + Period = sdl2::keyboard::Scancode::Period as i32, + Slash = sdl2::keyboard::Scancode::Slash as i32, + CapsLock = sdl2::keyboard::Scancode::CapsLock as i32, + F1 = sdl2::keyboard::Scancode::F1 as i32, + F2 = sdl2::keyboard::Scancode::F2 as i32, + F3 = sdl2::keyboard::Scancode::F3 as i32, + F4 = sdl2::keyboard::Scancode::F4 as i32, + F5 = sdl2::keyboard::Scancode::F5 as i32, + F6 = sdl2::keyboard::Scancode::F6 as i32, + F7 = sdl2::keyboard::Scancode::F7 as i32, + F8 = sdl2::keyboard::Scancode::F8 as i32, + F9 = sdl2::keyboard::Scancode::F9 as i32, + F10 = sdl2::keyboard::Scancode::F10 as i32, + F11 = sdl2::keyboard::Scancode::F11 as i32, + F12 = sdl2::keyboard::Scancode::F12 as i32, + PrintScreen = sdl2::keyboard::Scancode::PrintScreen as i32, + ScrollLock = sdl2::keyboard::Scancode::ScrollLock as i32, + Pause = sdl2::keyboard::Scancode::Pause as i32, + Insert = sdl2::keyboard::Scancode::Insert as i32, + Home = sdl2::keyboard::Scancode::Home as i32, + PageUp = sdl2::keyboard::Scancode::PageUp as i32, + Delete = sdl2::keyboard::Scancode::Delete as i32, + End = sdl2::keyboard::Scancode::End as i32, + PageDown = sdl2::keyboard::Scancode::PageDown as i32, + Right = sdl2::keyboard::Scancode::Right as i32, + Left = sdl2::keyboard::Scancode::Left as i32, + Down = sdl2::keyboard::Scancode::Down as i32, + Up = sdl2::keyboard::Scancode::Up as i32, + NumLockClear = sdl2::keyboard::Scancode::NumLockClear as i32, + KpDivide = sdl2::keyboard::Scancode::KpDivide as i32, + KpMultiply = sdl2::keyboard::Scancode::KpMultiply as i32, + KpMinus = sdl2::keyboard::Scancode::KpMinus as i32, + KpPlus = sdl2::keyboard::Scancode::KpPlus as i32, + KpEnter = sdl2::keyboard::Scancode::KpEnter as i32, + Kp1 = sdl2::keyboard::Scancode::Kp1 as i32, + Kp2 = sdl2::keyboard::Scancode::Kp2 as i32, + Kp3 = sdl2::keyboard::Scancode::Kp3 as i32, + Kp4 = sdl2::keyboard::Scancode::Kp4 as i32, + Kp5 = sdl2::keyboard::Scancode::Kp5 as i32, + Kp6 = sdl2::keyboard::Scancode::Kp6 as i32, + Kp7 = sdl2::keyboard::Scancode::Kp7 as i32, + Kp8 = sdl2::keyboard::Scancode::Kp8 as i32, + Kp9 = sdl2::keyboard::Scancode::Kp9 as i32, + Kp0 = sdl2::keyboard::Scancode::Kp0 as i32, + KpPeriod = sdl2::keyboard::Scancode::KpPeriod as i32, + NonUsBackslash = sdl2::keyboard::Scancode::NonUsBackslash as i32, + Application = sdl2::keyboard::Scancode::Application as i32, + Power = sdl2::keyboard::Scancode::Power as i32, + KpEquals = sdl2::keyboard::Scancode::KpEquals as i32, + F13 = sdl2::keyboard::Scancode::F13 as i32, + F14 = sdl2::keyboard::Scancode::F14 as i32, + F15 = sdl2::keyboard::Scancode::F15 as i32, + F16 = sdl2::keyboard::Scancode::F16 as i32, + F17 = sdl2::keyboard::Scancode::F17 as i32, + F18 = sdl2::keyboard::Scancode::F18 as i32, + F19 = sdl2::keyboard::Scancode::F19 as i32, + F20 = sdl2::keyboard::Scancode::F20 as i32, + F21 = sdl2::keyboard::Scancode::F21 as i32, + F22 = sdl2::keyboard::Scancode::F22 as i32, + F23 = sdl2::keyboard::Scancode::F23 as i32, + F24 = sdl2::keyboard::Scancode::F24 as i32, + Execute = sdl2::keyboard::Scancode::Execute as i32, + Help = sdl2::keyboard::Scancode::Help as i32, + Menu = sdl2::keyboard::Scancode::Menu as i32, + Select = sdl2::keyboard::Scancode::Select as i32, + Stop = sdl2::keyboard::Scancode::Stop as i32, + Again = sdl2::keyboard::Scancode::Again as i32, + Undo = sdl2::keyboard::Scancode::Undo as i32, + Cut = sdl2::keyboard::Scancode::Cut as i32, + Copy = sdl2::keyboard::Scancode::Copy as i32, + Paste = sdl2::keyboard::Scancode::Paste as i32, + Find = sdl2::keyboard::Scancode::Find as i32, + Mute = sdl2::keyboard::Scancode::Mute as i32, + VolumeUp = sdl2::keyboard::Scancode::VolumeUp as i32, + VolumeDown = sdl2::keyboard::Scancode::VolumeDown as i32, + KpComma = sdl2::keyboard::Scancode::KpComma as i32, + KpEqualsAS400 = sdl2::keyboard::Scancode::KpEqualsAS400 as i32, + International1 = sdl2::keyboard::Scancode::International1 as i32, + International2 = sdl2::keyboard::Scancode::International2 as i32, + International3 = sdl2::keyboard::Scancode::International3 as i32, + International4 = sdl2::keyboard::Scancode::International4 as i32, + International5 = sdl2::keyboard::Scancode::International5 as i32, + International6 = sdl2::keyboard::Scancode::International6 as i32, + International7 = sdl2::keyboard::Scancode::International7 as i32, + International8 = sdl2::keyboard::Scancode::International8 as i32, + International9 = sdl2::keyboard::Scancode::International9 as i32, + Lang1 = sdl2::keyboard::Scancode::Lang1 as i32, + Lang2 = sdl2::keyboard::Scancode::Lang2 as i32, + Lang3 = sdl2::keyboard::Scancode::Lang3 as i32, + Lang4 = sdl2::keyboard::Scancode::Lang4 as i32, + Lang5 = sdl2::keyboard::Scancode::Lang5 as i32, + Lang6 = sdl2::keyboard::Scancode::Lang6 as i32, + Lang7 = sdl2::keyboard::Scancode::Lang7 as i32, + Lang8 = sdl2::keyboard::Scancode::Lang8 as i32, + Lang9 = sdl2::keyboard::Scancode::Lang9 as i32, + AltErase = sdl2::keyboard::Scancode::AltErase as i32, + SysReq = sdl2::keyboard::Scancode::SysReq as i32, + Cancel = sdl2::keyboard::Scancode::Cancel as i32, + Clear = sdl2::keyboard::Scancode::Clear as i32, + Prior = sdl2::keyboard::Scancode::Prior as i32, + Return2 = sdl2::keyboard::Scancode::Return2 as i32, + Separator = sdl2::keyboard::Scancode::Separator as i32, + Out = sdl2::keyboard::Scancode::Out as i32, + Oper = sdl2::keyboard::Scancode::Oper as i32, + ClearAgain = sdl2::keyboard::Scancode::ClearAgain as i32, + CrSel = sdl2::keyboard::Scancode::CrSel as i32, + ExSel = sdl2::keyboard::Scancode::ExSel as i32, + Kp00 = sdl2::keyboard::Scancode::Kp00 as i32, + Kp000 = sdl2::keyboard::Scancode::Kp000 as i32, + ThousandsSeparator = sdl2::keyboard::Scancode::ThousandsSeparator as i32, + DecimalSeparator = sdl2::keyboard::Scancode::DecimalSeparator as i32, + CurrencyUnit = sdl2::keyboard::Scancode::CurrencyUnit as i32, + CurrencySubUnit = sdl2::keyboard::Scancode::CurrencySubUnit as i32, + KpLeftParen = sdl2::keyboard::Scancode::KpLeftParen as i32, + KpRightParen = sdl2::keyboard::Scancode::KpRightParen as i32, + KpLeftBrace = sdl2::keyboard::Scancode::KpLeftBrace as i32, + KpRightBrace = sdl2::keyboard::Scancode::KpRightBrace as i32, + KpTab = sdl2::keyboard::Scancode::KpTab as i32, + KpBackspace = sdl2::keyboard::Scancode::KpBackspace as i32, + KpA = sdl2::keyboard::Scancode::KpA as i32, + KpB = sdl2::keyboard::Scancode::KpB as i32, + KpC = sdl2::keyboard::Scancode::KpC as i32, + KpD = sdl2::keyboard::Scancode::KpD as i32, + KpE = sdl2::keyboard::Scancode::KpE as i32, + KpF = sdl2::keyboard::Scancode::KpF as i32, + KpXor = sdl2::keyboard::Scancode::KpXor as i32, + KpPower = sdl2::keyboard::Scancode::KpPower as i32, + KpPercent = sdl2::keyboard::Scancode::KpPercent as i32, + KpLess = sdl2::keyboard::Scancode::KpLess as i32, + KpGreater = sdl2::keyboard::Scancode::KpGreater as i32, + KpAmpersand = sdl2::keyboard::Scancode::KpAmpersand as i32, + KpDblAmpersand = sdl2::keyboard::Scancode::KpDblAmpersand as i32, + KpVerticalBar = sdl2::keyboard::Scancode::KpVerticalBar as i32, + KpDblVerticalBar = sdl2::keyboard::Scancode::KpDblVerticalBar as i32, + KpColon = sdl2::keyboard::Scancode::KpColon as i32, + KpHash = sdl2::keyboard::Scancode::KpHash as i32, + KpSpace = sdl2::keyboard::Scancode::KpSpace as i32, + KpAt = sdl2::keyboard::Scancode::KpAt as i32, + KpExclam = sdl2::keyboard::Scancode::KpExclam as i32, + KpMemStore = sdl2::keyboard::Scancode::KpMemStore as i32, + KpMemRecall = sdl2::keyboard::Scancode::KpMemRecall as i32, + KpMemClear = sdl2::keyboard::Scancode::KpMemClear as i32, + KpMemAdd = sdl2::keyboard::Scancode::KpMemAdd as i32, + KpMemSubtract = sdl2::keyboard::Scancode::KpMemSubtract as i32, + KpMemMultiply = sdl2::keyboard::Scancode::KpMemMultiply as i32, + KpMemDivide = sdl2::keyboard::Scancode::KpMemDivide as i32, + KpPlusMinus = sdl2::keyboard::Scancode::KpPlusMinus as i32, + KpClear = sdl2::keyboard::Scancode::KpClear as i32, + KpClearEntry = sdl2::keyboard::Scancode::KpClearEntry as i32, + KpBinary = sdl2::keyboard::Scancode::KpBinary as i32, + KpOctal = sdl2::keyboard::Scancode::KpOctal as i32, + KpDecimal = sdl2::keyboard::Scancode::KpDecimal as i32, + KpHexadecimal = sdl2::keyboard::Scancode::KpHexadecimal as i32, + LCtrl = sdl2::keyboard::Scancode::LCtrl as i32, + LShift = sdl2::keyboard::Scancode::LShift as i32, + LAlt = sdl2::keyboard::Scancode::LAlt as i32, + LGui = sdl2::keyboard::Scancode::LGui as i32, + RCtrl = sdl2::keyboard::Scancode::RCtrl as i32, + RShift = sdl2::keyboard::Scancode::RShift as i32, + RAlt = sdl2::keyboard::Scancode::RAlt as i32, + RGui = sdl2::keyboard::Scancode::RGui as i32, + Mode = sdl2::keyboard::Scancode::Mode as i32, + AudioNext = sdl2::keyboard::Scancode::AudioNext as i32, + AudioPrev = sdl2::keyboard::Scancode::AudioPrev as i32, + AudioStop = sdl2::keyboard::Scancode::AudioStop as i32, + AudioPlay = sdl2::keyboard::Scancode::AudioPlay as i32, + AudioMute = sdl2::keyboard::Scancode::AudioMute as i32, + MediaSelect = sdl2::keyboard::Scancode::MediaSelect as i32, + Www = sdl2::keyboard::Scancode::Www as i32, + Mail = sdl2::keyboard::Scancode::Mail as i32, + Calculator = sdl2::keyboard::Scancode::Calculator as i32, + Computer = sdl2::keyboard::Scancode::Computer as i32, + AcSearch = sdl2::keyboard::Scancode::AcSearch as i32, + AcHome = sdl2::keyboard::Scancode::AcHome as i32, + AcBack = sdl2::keyboard::Scancode::AcBack as i32, + AcForward = sdl2::keyboard::Scancode::AcForward as i32, + AcStop = sdl2::keyboard::Scancode::AcStop as i32, + AcRefresh = sdl2::keyboard::Scancode::AcRefresh as i32, + AcBookmarks = sdl2::keyboard::Scancode::AcBookmarks as i32, + BrightnessDown = sdl2::keyboard::Scancode::BrightnessDown as i32, + BrightnessUp = sdl2::keyboard::Scancode::BrightnessUp as i32, + DisplaySwitch = sdl2::keyboard::Scancode::DisplaySwitch as i32, + KbdIllumToggle = sdl2::keyboard::Scancode::KbdIllumToggle as i32, + KbdIllumDown = sdl2::keyboard::Scancode::KbdIllumDown as i32, + KbdIllumUp = sdl2::keyboard::Scancode::KbdIllumUp as i32, + Eject = sdl2::keyboard::Scancode::Eject as i32, + Sleep = sdl2::keyboard::Scancode::Sleep as i32, + App1 = sdl2::keyboard::Scancode::App1 as i32, + App2 = sdl2::keyboard::Scancode::App2 as i32, + Num = sdl2::keyboard::Scancode::Num as i32, +} + +impl From for Scancode { + fn from(value: sdl2::keyboard::Scancode) -> Self { + match value { + sdl2::keyboard::Scancode::A => Scancode::A, + sdl2::keyboard::Scancode::B => Scancode::B, + sdl2::keyboard::Scancode::C => Scancode::C, + sdl2::keyboard::Scancode::D => Scancode::D, + sdl2::keyboard::Scancode::E => Scancode::E, + sdl2::keyboard::Scancode::F => Scancode::F, + sdl2::keyboard::Scancode::G => Scancode::G, + sdl2::keyboard::Scancode::H => Scancode::H, + sdl2::keyboard::Scancode::I => Scancode::I, + sdl2::keyboard::Scancode::J => Scancode::J, + sdl2::keyboard::Scancode::K => Scancode::K, + sdl2::keyboard::Scancode::L => Scancode::L, + sdl2::keyboard::Scancode::M => Scancode::M, + sdl2::keyboard::Scancode::N => Scancode::N, + sdl2::keyboard::Scancode::O => Scancode::O, + sdl2::keyboard::Scancode::P => Scancode::P, + sdl2::keyboard::Scancode::Q => Scancode::Q, + sdl2::keyboard::Scancode::R => Scancode::R, + sdl2::keyboard::Scancode::S => Scancode::S, + sdl2::keyboard::Scancode::T => Scancode::T, + sdl2::keyboard::Scancode::U => Scancode::U, + sdl2::keyboard::Scancode::V => Scancode::V, + sdl2::keyboard::Scancode::W => Scancode::W, + sdl2::keyboard::Scancode::X => Scancode::X, + sdl2::keyboard::Scancode::Y => Scancode::Y, + sdl2::keyboard::Scancode::Z => Scancode::Z, + sdl2::keyboard::Scancode::Num1 => Scancode::Num1, + sdl2::keyboard::Scancode::Num2 => Scancode::Num2, + sdl2::keyboard::Scancode::Num3 => Scancode::Num3, + sdl2::keyboard::Scancode::Num4 => Scancode::Num4, + sdl2::keyboard::Scancode::Num5 => Scancode::Num5, + sdl2::keyboard::Scancode::Num6 => Scancode::Num6, + sdl2::keyboard::Scancode::Num7 => Scancode::Num7, + sdl2::keyboard::Scancode::Num8 => Scancode::Num8, + sdl2::keyboard::Scancode::Num9 => Scancode::Num9, + sdl2::keyboard::Scancode::Num0 => Scancode::Num0, + sdl2::keyboard::Scancode::Return => Scancode::Return, + sdl2::keyboard::Scancode::Escape => Scancode::Escape, + sdl2::keyboard::Scancode::Backspace => Scancode::Backspace, + sdl2::keyboard::Scancode::Tab => Scancode::Tab, + sdl2::keyboard::Scancode::Space => Scancode::Space, + sdl2::keyboard::Scancode::Minus => Scancode::Minus, + sdl2::keyboard::Scancode::Equals => Scancode::Equals, + sdl2::keyboard::Scancode::LeftBracket => Scancode::LeftBracket, + sdl2::keyboard::Scancode::RightBracket => Scancode::RightBracket, + sdl2::keyboard::Scancode::Backslash => Scancode::Backslash, + sdl2::keyboard::Scancode::NonUsHash => Scancode::NonUsHash, + sdl2::keyboard::Scancode::Semicolon => Scancode::Semicolon, + sdl2::keyboard::Scancode::Apostrophe => Scancode::Apostrophe, + sdl2::keyboard::Scancode::Grave => Scancode::Grave, + sdl2::keyboard::Scancode::Comma => Scancode::Comma, + sdl2::keyboard::Scancode::Period => Scancode::Period, + sdl2::keyboard::Scancode::Slash => Scancode::Slash, + sdl2::keyboard::Scancode::CapsLock => Scancode::CapsLock, + sdl2::keyboard::Scancode::F1 => Scancode::F1, + sdl2::keyboard::Scancode::F2 => Scancode::F2, + sdl2::keyboard::Scancode::F3 => Scancode::F3, + sdl2::keyboard::Scancode::F4 => Scancode::F4, + sdl2::keyboard::Scancode::F5 => Scancode::F5, + sdl2::keyboard::Scancode::F6 => Scancode::F6, + sdl2::keyboard::Scancode::F7 => Scancode::F7, + sdl2::keyboard::Scancode::F8 => Scancode::F8, + sdl2::keyboard::Scancode::F9 => Scancode::F9, + sdl2::keyboard::Scancode::F10 => Scancode::F10, + sdl2::keyboard::Scancode::F11 => Scancode::F11, + sdl2::keyboard::Scancode::F12 => Scancode::F12, + sdl2::keyboard::Scancode::PrintScreen => Scancode::PrintScreen, + sdl2::keyboard::Scancode::ScrollLock => Scancode::ScrollLock, + sdl2::keyboard::Scancode::Pause => Scancode::Pause, + sdl2::keyboard::Scancode::Insert => Scancode::Insert, + sdl2::keyboard::Scancode::Home => Scancode::Home, + sdl2::keyboard::Scancode::PageUp => Scancode::PageUp, + sdl2::keyboard::Scancode::Delete => Scancode::Delete, + sdl2::keyboard::Scancode::End => Scancode::End, + sdl2::keyboard::Scancode::PageDown => Scancode::PageDown, + sdl2::keyboard::Scancode::Right => Scancode::Right, + sdl2::keyboard::Scancode::Left => Scancode::Left, + sdl2::keyboard::Scancode::Down => Scancode::Down, + sdl2::keyboard::Scancode::Up => Scancode::Up, + sdl2::keyboard::Scancode::NumLockClear => Scancode::NumLockClear, + sdl2::keyboard::Scancode::KpDivide => Scancode::KpDivide, + sdl2::keyboard::Scancode::KpMultiply => Scancode::KpMultiply, + sdl2::keyboard::Scancode::KpMinus => Scancode::KpMinus, + sdl2::keyboard::Scancode::KpPlus => Scancode::KpPlus, + sdl2::keyboard::Scancode::KpEnter => Scancode::KpEnter, + sdl2::keyboard::Scancode::Kp1 => Scancode::Kp1, + sdl2::keyboard::Scancode::Kp2 => Scancode::Kp2, + sdl2::keyboard::Scancode::Kp3 => Scancode::Kp3, + sdl2::keyboard::Scancode::Kp4 => Scancode::Kp4, + sdl2::keyboard::Scancode::Kp5 => Scancode::Kp5, + sdl2::keyboard::Scancode::Kp6 => Scancode::Kp6, + sdl2::keyboard::Scancode::Kp7 => Scancode::Kp7, + sdl2::keyboard::Scancode::Kp8 => Scancode::Kp8, + sdl2::keyboard::Scancode::Kp9 => Scancode::Kp9, + sdl2::keyboard::Scancode::Kp0 => Scancode::Kp0, + sdl2::keyboard::Scancode::KpPeriod => Scancode::KpPeriod, + sdl2::keyboard::Scancode::NonUsBackslash => Scancode::NonUsBackslash, + sdl2::keyboard::Scancode::Application => Scancode::Application, + sdl2::keyboard::Scancode::Power => Scancode::Power, + sdl2::keyboard::Scancode::KpEquals => Scancode::KpEquals, + sdl2::keyboard::Scancode::F13 => Scancode::F13, + sdl2::keyboard::Scancode::F14 => Scancode::F14, + sdl2::keyboard::Scancode::F15 => Scancode::F15, + sdl2::keyboard::Scancode::F16 => Scancode::F16, + sdl2::keyboard::Scancode::F17 => Scancode::F17, + sdl2::keyboard::Scancode::F18 => Scancode::F18, + sdl2::keyboard::Scancode::F19 => Scancode::F19, + sdl2::keyboard::Scancode::F20 => Scancode::F20, + sdl2::keyboard::Scancode::F21 => Scancode::F21, + sdl2::keyboard::Scancode::F22 => Scancode::F22, + sdl2::keyboard::Scancode::F23 => Scancode::F23, + sdl2::keyboard::Scancode::F24 => Scancode::F24, + sdl2::keyboard::Scancode::Execute => Scancode::Execute, + sdl2::keyboard::Scancode::Help => Scancode::Help, + sdl2::keyboard::Scancode::Menu => Scancode::Menu, + sdl2::keyboard::Scancode::Select => Scancode::Select, + sdl2::keyboard::Scancode::Stop => Scancode::Stop, + sdl2::keyboard::Scancode::Again => Scancode::Again, + sdl2::keyboard::Scancode::Undo => Scancode::Undo, + sdl2::keyboard::Scancode::Cut => Scancode::Cut, + sdl2::keyboard::Scancode::Copy => Scancode::Copy, + sdl2::keyboard::Scancode::Paste => Scancode::Paste, + sdl2::keyboard::Scancode::Find => Scancode::Find, + sdl2::keyboard::Scancode::Mute => Scancode::Mute, + sdl2::keyboard::Scancode::VolumeUp => Scancode::VolumeUp, + sdl2::keyboard::Scancode::VolumeDown => Scancode::VolumeDown, + sdl2::keyboard::Scancode::KpComma => Scancode::KpComma, + sdl2::keyboard::Scancode::KpEqualsAS400 => Scancode::KpEqualsAS400, + sdl2::keyboard::Scancode::International1 => Scancode::International1, + sdl2::keyboard::Scancode::International2 => Scancode::International2, + sdl2::keyboard::Scancode::International3 => Scancode::International3, + sdl2::keyboard::Scancode::International4 => Scancode::International4, + sdl2::keyboard::Scancode::International5 => Scancode::International5, + sdl2::keyboard::Scancode::International6 => Scancode::International6, + sdl2::keyboard::Scancode::International7 => Scancode::International7, + sdl2::keyboard::Scancode::International8 => Scancode::International8, + sdl2::keyboard::Scancode::International9 => Scancode::International9, + sdl2::keyboard::Scancode::Lang1 => Scancode::Lang1, + sdl2::keyboard::Scancode::Lang2 => Scancode::Lang2, + sdl2::keyboard::Scancode::Lang3 => Scancode::Lang3, + sdl2::keyboard::Scancode::Lang4 => Scancode::Lang4, + sdl2::keyboard::Scancode::Lang5 => Scancode::Lang5, + sdl2::keyboard::Scancode::Lang6 => Scancode::Lang6, + sdl2::keyboard::Scancode::Lang7 => Scancode::Lang7, + sdl2::keyboard::Scancode::Lang8 => Scancode::Lang8, + sdl2::keyboard::Scancode::Lang9 => Scancode::Lang9, + sdl2::keyboard::Scancode::AltErase => Scancode::AltErase, + sdl2::keyboard::Scancode::SysReq => Scancode::SysReq, + sdl2::keyboard::Scancode::Cancel => Scancode::Cancel, + sdl2::keyboard::Scancode::Clear => Scancode::Clear, + sdl2::keyboard::Scancode::Prior => Scancode::Prior, + sdl2::keyboard::Scancode::Return2 => Scancode::Return2, + sdl2::keyboard::Scancode::Separator => Scancode::Separator, + sdl2::keyboard::Scancode::Out => Scancode::Out, + sdl2::keyboard::Scancode::Oper => Scancode::Oper, + sdl2::keyboard::Scancode::ClearAgain => Scancode::ClearAgain, + sdl2::keyboard::Scancode::CrSel => Scancode::CrSel, + sdl2::keyboard::Scancode::ExSel => Scancode::ExSel, + sdl2::keyboard::Scancode::Kp00 => Scancode::Kp00, + sdl2::keyboard::Scancode::Kp000 => Scancode::Kp000, + sdl2::keyboard::Scancode::ThousandsSeparator => Scancode::ThousandsSeparator, + sdl2::keyboard::Scancode::DecimalSeparator => Scancode::DecimalSeparator, + sdl2::keyboard::Scancode::CurrencyUnit => Scancode::CurrencyUnit, + sdl2::keyboard::Scancode::CurrencySubUnit => Scancode::CurrencySubUnit, + sdl2::keyboard::Scancode::KpLeftParen => Scancode::KpLeftParen, + sdl2::keyboard::Scancode::KpRightParen => Scancode::KpRightParen, + sdl2::keyboard::Scancode::KpLeftBrace => Scancode::KpLeftBrace, + sdl2::keyboard::Scancode::KpRightBrace => Scancode::KpRightBrace, + sdl2::keyboard::Scancode::KpTab => Scancode::KpTab, + sdl2::keyboard::Scancode::KpBackspace => Scancode::KpBackspace, + sdl2::keyboard::Scancode::KpA => Scancode::KpA, + sdl2::keyboard::Scancode::KpB => Scancode::KpB, + sdl2::keyboard::Scancode::KpC => Scancode::KpC, + sdl2::keyboard::Scancode::KpD => Scancode::KpD, + sdl2::keyboard::Scancode::KpE => Scancode::KpE, + sdl2::keyboard::Scancode::KpF => Scancode::KpF, + sdl2::keyboard::Scancode::KpXor => Scancode::KpXor, + sdl2::keyboard::Scancode::KpPower => Scancode::KpPower, + sdl2::keyboard::Scancode::KpPercent => Scancode::KpPercent, + sdl2::keyboard::Scancode::KpLess => Scancode::KpLess, + sdl2::keyboard::Scancode::KpGreater => Scancode::KpGreater, + sdl2::keyboard::Scancode::KpAmpersand => Scancode::KpAmpersand, + sdl2::keyboard::Scancode::KpDblAmpersand => Scancode::KpDblAmpersand, + sdl2::keyboard::Scancode::KpVerticalBar => Scancode::KpVerticalBar, + sdl2::keyboard::Scancode::KpDblVerticalBar => Scancode::KpDblVerticalBar, + sdl2::keyboard::Scancode::KpColon => Scancode::KpColon, + sdl2::keyboard::Scancode::KpHash => Scancode::KpHash, + sdl2::keyboard::Scancode::KpSpace => Scancode::KpSpace, + sdl2::keyboard::Scancode::KpAt => Scancode::KpAt, + sdl2::keyboard::Scancode::KpExclam => Scancode::KpExclam, + sdl2::keyboard::Scancode::KpMemStore => Scancode::KpMemStore, + sdl2::keyboard::Scancode::KpMemRecall => Scancode::KpMemRecall, + sdl2::keyboard::Scancode::KpMemClear => Scancode::KpMemClear, + sdl2::keyboard::Scancode::KpMemAdd => Scancode::KpMemAdd, + sdl2::keyboard::Scancode::KpMemSubtract => Scancode::KpMemSubtract, + sdl2::keyboard::Scancode::KpMemMultiply => Scancode::KpMemMultiply, + sdl2::keyboard::Scancode::KpMemDivide => Scancode::KpMemDivide, + sdl2::keyboard::Scancode::KpPlusMinus => Scancode::KpPlusMinus, + sdl2::keyboard::Scancode::KpClear => Scancode::KpClear, + sdl2::keyboard::Scancode::KpClearEntry => Scancode::KpClearEntry, + sdl2::keyboard::Scancode::KpBinary => Scancode::KpBinary, + sdl2::keyboard::Scancode::KpOctal => Scancode::KpOctal, + sdl2::keyboard::Scancode::KpDecimal => Scancode::KpDecimal, + sdl2::keyboard::Scancode::KpHexadecimal => Scancode::KpHexadecimal, + sdl2::keyboard::Scancode::LCtrl => Scancode::LCtrl, + sdl2::keyboard::Scancode::LShift => Scancode::LShift, + sdl2::keyboard::Scancode::LAlt => Scancode::LAlt, + sdl2::keyboard::Scancode::LGui => Scancode::LGui, + sdl2::keyboard::Scancode::RCtrl => Scancode::RCtrl, + sdl2::keyboard::Scancode::RShift => Scancode::RShift, + sdl2::keyboard::Scancode::RAlt => Scancode::RAlt, + sdl2::keyboard::Scancode::RGui => Scancode::RGui, + sdl2::keyboard::Scancode::Mode => Scancode::Mode, + sdl2::keyboard::Scancode::AudioNext => Scancode::AudioNext, + sdl2::keyboard::Scancode::AudioPrev => Scancode::AudioPrev, + sdl2::keyboard::Scancode::AudioStop => Scancode::AudioStop, + sdl2::keyboard::Scancode::AudioPlay => Scancode::AudioPlay, + sdl2::keyboard::Scancode::AudioMute => Scancode::AudioMute, + sdl2::keyboard::Scancode::MediaSelect => Scancode::MediaSelect, + sdl2::keyboard::Scancode::Www => Scancode::Www, + sdl2::keyboard::Scancode::Mail => Scancode::Mail, + sdl2::keyboard::Scancode::Calculator => Scancode::Calculator, + sdl2::keyboard::Scancode::Computer => Scancode::Computer, + sdl2::keyboard::Scancode::AcSearch => Scancode::AcSearch, + sdl2::keyboard::Scancode::AcHome => Scancode::AcHome, + sdl2::keyboard::Scancode::AcBack => Scancode::AcBack, + sdl2::keyboard::Scancode::AcForward => Scancode::AcForward, + sdl2::keyboard::Scancode::AcStop => Scancode::AcStop, + sdl2::keyboard::Scancode::AcRefresh => Scancode::AcRefresh, + sdl2::keyboard::Scancode::AcBookmarks => Scancode::AcBookmarks, + sdl2::keyboard::Scancode::BrightnessDown => Scancode::BrightnessDown, + sdl2::keyboard::Scancode::BrightnessUp => Scancode::BrightnessUp, + sdl2::keyboard::Scancode::DisplaySwitch => Scancode::DisplaySwitch, + sdl2::keyboard::Scancode::KbdIllumToggle => Scancode::KbdIllumToggle, + sdl2::keyboard::Scancode::KbdIllumDown => Scancode::KbdIllumDown, + sdl2::keyboard::Scancode::KbdIllumUp => Scancode::KbdIllumUp, + sdl2::keyboard::Scancode::Eject => Scancode::Eject, + sdl2::keyboard::Scancode::Sleep => Scancode::Sleep, + sdl2::keyboard::Scancode::App1 => Scancode::App1, + sdl2::keyboard::Scancode::App2 => Scancode::App2, + sdl2::keyboard::Scancode::Num => Scancode::Num, + } + } +} \ No newline at end of file diff --git a/libretrogd/src/system/input_devices/mod.rs b/libretrogd/src/system/input_devices/mod.rs index 613177e..d3edad4 100644 --- a/libretrogd/src/system/input_devices/mod.rs +++ b/libretrogd/src/system/input_devices/mod.rs @@ -1,4 +1,4 @@ -use sdl2::event::Event; +use crate::system::SystemEvent; pub mod keyboard; pub mod mouse; @@ -18,10 +18,8 @@ pub trait InputDevice { /// input events have been processed via `handle_event`. fn update(&mut self); - /// Processes the data from the given [`Event`] if it is relevant for this input device. You - /// should pass in all events received every frame and let the input device figure out if it + /// Processes the data from the given [`SystemEvent`] if it is relevant for this input device. + /// You should pass in all events received every frame and let the input device figure out if it /// is relevant to it or not. - /// - /// [`Event`]: sdl2::event::Event - fn handle_event(&mut self, event: &Event); + fn handle_event(&mut self, event: &SystemEvent); } diff --git a/libretrogd/src/system/input_devices/mouse/buttons.rs b/libretrogd/src/system/input_devices/mouse/buttons.rs new file mode 100644 index 0000000..cd7671f --- /dev/null +++ b/libretrogd/src/system/input_devices/mouse/buttons.rs @@ -0,0 +1,35 @@ +use bitflags::bitflags; + +bitflags! { + pub struct MouseButtons: u32 { + const LEFT_BUTTON = sdl2::mouse::MouseButton::Left as u32; + const MIDDLE_BUTTON = sdl2::mouse::MouseButton::Middle as u32; + const RIGHT_BUTTON = sdl2::mouse::MouseButton::Right as u32; + const X1 = sdl2::mouse::MouseButton::X1 as u32; + const X2 = sdl2::mouse::MouseButton::X2 as u32; + } +} + +#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] +#[repr(u8)] +pub enum MouseButton { + Unknown = 0, + Left = sdl2::mouse::MouseButton::Left as u8, + Middle = sdl2::mouse::MouseButton::Middle as u8, + Right = sdl2::mouse::MouseButton::Right as u8, + X1 = sdl2::mouse::MouseButton::X1 as u8, + X2 = sdl2::mouse::MouseButton::X2 as u8, +} + +impl From for MouseButton { + fn from(value: sdl2::mouse::MouseButton) -> Self { + match value { + sdl2::mouse::MouseButton::Unknown => MouseButton::Unknown, + sdl2::mouse::MouseButton::Left => MouseButton::Left, + sdl2::mouse::MouseButton::Middle => MouseButton::Middle, + sdl2::mouse::MouseButton::Right => MouseButton::Right, + sdl2::mouse::MouseButton::X1 => MouseButton::X1, + sdl2::mouse::MouseButton::X2 => MouseButton::X2 + } + } +} \ No newline at end of file diff --git a/libretrogd/src/system/input_devices/mouse.rs b/libretrogd/src/system/input_devices/mouse/mod.rs similarity index 89% rename from libretrogd/src/system/input_devices/mouse.rs rename to libretrogd/src/system/input_devices/mouse/mod.rs index 081c605..5d7ca48 100644 --- a/libretrogd/src/system/input_devices/mouse.rs +++ b/libretrogd/src/system/input_devices/mouse/mod.rs @@ -1,10 +1,13 @@ -use sdl2::event::Event; - use crate::graphics::*; use crate::math::*; +use crate::system::MouseEvent; use super::*; +pub use self::buttons::*; + +pub mod buttons; + const MAX_BUTTONS: usize = 32; const DEFAULT_MOUSE_CURSOR_HOTSPOT_X: u32 = 0; @@ -187,7 +190,7 @@ impl Mouse { DEFAULT_MOUSE_CURSOR_WIDTH as u32, DEFAULT_MOUSE_CURSOR_HEIGHT as u32, ) - .unwrap(); + .unwrap(); cursor.pixels_mut().copy_from_slice(&DEFAULT_MOUSE_CURSOR); let cursor_background = Bitmap::new(cursor.width(), cursor.height()).unwrap(); @@ -290,29 +293,31 @@ impl InputDevice for Mouse { } } - fn handle_event(&mut self, event: &Event) { + fn handle_event(&mut self, event: &SystemEvent) { match event { - Event::MouseMotion { - mousestate, + SystemEvent::Mouse(MouseEvent::MouseMotion { x, y, - xrel, - yrel, - .. - } => { + x_delta, + y_delta, + buttons, + }) => { self.x = *x; self.y = *y; - self.x_delta = *xrel; - self.y_delta = *yrel; - for (button, is_pressed) in mousestate.mouse_buttons() { - self.update_button_state(button as u32, is_pressed); - } + self.x_delta = *x_delta; + self.y_delta = *y_delta; + + self.update_button_state(MouseButton::Left as u32, buttons.contains(MouseButtons::LEFT_BUTTON)); + self.update_button_state(MouseButton::Middle as u32, buttons.contains(MouseButtons::MIDDLE_BUTTON)); + self.update_button_state(MouseButton::Right as u32, buttons.contains(MouseButtons::RIGHT_BUTTON)); + self.update_button_state(MouseButton::X1 as u32, buttons.contains(MouseButtons::X1)); + self.update_button_state(MouseButton::X2 as u32, buttons.contains(MouseButtons::X2)); } - Event::MouseButtonDown { mouse_btn, .. } => { - self.update_button_state(*mouse_btn as u32, true); + SystemEvent::Mouse(MouseEvent::MouseButtonDown { button, .. }) => { + self.update_button_state(*button as u32, true); } - Event::MouseButtonUp { mouse_btn, .. } => { - self.update_button_state(*mouse_btn as u32, false); + SystemEvent::Mouse(MouseEvent::MouseButtonUp { button, .. }) => { + self.update_button_state(*button as u32, false); } _ => (), } diff --git a/libretrogd/src/system/mod.rs b/libretrogd/src/system/mod.rs index 6f8dcd3..b8b0b2b 100644 --- a/libretrogd/src/system/mod.rs +++ b/libretrogd/src/system/mod.rs @@ -3,7 +3,6 @@ use std::fmt::Formatter; use byte_slice_cast::AsByteSlice; use sdl2::{AudioSubsystem, EventPump, Sdl, TimerSubsystem, VideoSubsystem}; use sdl2::audio::AudioSpecDesired; -use sdl2::event::Event; use sdl2::pixels::PixelFormatEnum; use sdl2::render::{Texture, WindowCanvas}; use thiserror::Error; @@ -12,10 +11,12 @@ use crate::{DEFAULT_SCALE_FACTOR, SCREEN_HEIGHT, SCREEN_WIDTH}; use crate::audio::*; use crate::graphics::*; +pub use self::event::*; pub use self::input_devices::*; pub use self::input_devices::keyboard::*; pub use self::input_devices::mouse::*; +pub mod event; pub mod input_devices; #[derive(Error, Debug)] @@ -423,15 +424,17 @@ impl System { /// your application to also react to any events received. pub fn do_events_with(&mut self, mut f: F) where - F: FnMut(&Event), + F: FnMut(&SystemEvent), { self.keyboard.update(); self.mouse.update(); self.sdl_event_pump.pump_events(); for event in self.sdl_event_pump.poll_iter() { - self.keyboard.handle_event(&event); - self.mouse.handle_event(&event); - f(&event); + if let Ok(event) = event.try_into() { + self.keyboard.handle_event(&event); + self.mouse.handle_event(&event); + f(&event); + } } }