Skip to content

Commit

Permalink
Merge pull request #114 from CHiPs44/chips44-scancode
Browse files Browse the repository at this point in the history
Add scancodes alongside keycodes
  • Loading branch information
lukexor authored Nov 7, 2023
2 parents 352ad60 + 6608a6b commit 898801f
Show file tree
Hide file tree
Showing 4 changed files with 390 additions and 5 deletions.
6 changes: 4 additions & 2 deletions src/engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1167,8 +1167,9 @@ impl Engine {
key: Some(key),
keymod,
repeat,
scan: Some(scan),
} => {
let evt = KeyEvent::new(key, keymod, repeat);
let evt = KeyEvent::new(key, keymod, repeat, scan);
if !app.on_key_pressed(state, evt)? {
state.ui.keys.press(key, keymod);
}
Expand All @@ -1177,8 +1178,9 @@ impl Engine {
key: Some(key),
keymod,
repeat,
scan: Some(scan),
} => {
let evt = KeyEvent::new(key, keymod, repeat);
let evt = KeyEvent::new(key, keymod, repeat, scan);
if !app.on_key_released(state, evt)? {
state.ui.keys.release(key, keymod);
}
Expand Down
126 changes: 125 additions & 1 deletion src/event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ pub enum Event {
keymod: KeyMod,
/// Whether this is a key-repeat event.
repeat: bool,
/// Scancode of key being pressed.
scan: Option<Scan>,
},
/// User key release event.
KeyUp {
Expand All @@ -41,6 +43,8 @@ pub enum Event {
keymod: KeyMod,
/// Whether this is a key-repeat event.
repeat: bool,
/// Scancode of key being pressed.
scan: Option<Scan>,
},
/// User text entry event.
TextInput {
Expand Down Expand Up @@ -260,14 +264,17 @@ pub struct KeyEvent {
pub keymod: KeyMod,
/// Whether this is a key-repeat event.
pub repeat: bool,
/// Specific scancode for this event.
pub scan: Scan,
}

impl KeyEvent {
pub(crate) const fn new(key: Key, keymod: KeyMod, repeat: bool) -> Self {
pub(crate) const fn new(key: Key, keymod: KeyMod, repeat: bool, scan: Scan) -> Self {
Self {
key,
keymod,
repeat,
scan,
}
}
}
Expand Down Expand Up @@ -380,6 +387,123 @@ impl Default for Key {
}
}

/// Keyboard scancode (sorted by SDL_SCANCODE value)
#[allow(missing_docs)]
#[non_exhaustive]
#[rustfmt::skip]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Scan {
// Default value
Unhandled /* 0 */,
// Letters
A /* 4 */, B /* 5 */, C /* 6 */, D /* 7 */, E /* 8 */, F /* 9 */, G /* 10 */,
H /* 11 */, I /* 12 */, J /* 13 */, K /* 14 */, L /* 15 */, M /* 16 */, N /* 17 */,
O /* 18 */, P /* 19 */, Q /* 20 */, R /* 21 */, S /* 22 */, T /* 23 */, U /* 24 */,
V /* 25 */, W /* 26 */, X /* 27 */, Y /* 28 */, Z /* 29 */,
// Digits (top row)
Num1 /* 30 */, Num2 /* 31 */, Num3 /* 32 */, Num4 /* 33 */, Num5 /* 34 */,
Num6 /* 35 */, Num7 /* 36 */, Num8 /* 37 */, Num9 /* 38 */, Num0 /* 39 */,
// Other standard keys
Return /* 40 */, Escape /* 41 */, Backspace /* 42 */, Tab /* 43 */,
Space /* 44 */, Minus /* 45 */, Equals /* 46 */,
LeftBracket /* 47 */, RightBracket /* 48 */, Backslash /* 49 */,
NonUsHash /* 50 */, Semicolon /* 51 */, Apostrophe /* 52 */, Grave /* 53 */,
Comma /* 54 */, Period /* 55 */, Slash /* 56 */, CapsLock /* 57 */,
// Function keys
F1 /* 58 */, F2 /* 59 */, F3 /* 60 */, F4 /* 61 */, F5 /* 62 */, F6 /* 63 */,
F7 /* 64 */, F8 /* 65 */, F9 /* 66 */, F10 /* 67 */, F11 /* 68 */, F12 /* 69 */,
// More standard keys
PrintScreen /* 70 */, ScrollLock /* 71 */, Pause /* 72 */, Insert /* 73 */,
Home /* 74 */, PageUp /* 75 */, Delete /* 76 */, End /* 77 */, PageDown /* 78 */,
Right /* 79 */, Left /* 80 */, Down /* 81 */, Up /* 82 */,
// Lock on PC, Clear on Mac
NumLockClear /* 83 */,
// Numeric keypad part 1
KpDivide /* 84 */, KpMultiply /* 85 */, KpMinus /* 86 */, KpPlus /* 87 */, KpEnter /* 88 */,
Kp1 /* 89 */, Kp2 /* 90 */, Kp3 /* 91 */, Kp4 /* 92 */, Kp5 /* 93 */,
Kp6 /* 94 */, Kp7 /* 95 */, Kp8 /* 96 */, Kp9 /* 97 */, Kp0 /* 98 */,
KpPeriod /* 99 */,
// Key between LShift and W for ISO layout
NonUsBackslash /* 100 */,
// ???
Application /* 101 */, Power /* 102 */,
// Numeric keypad part 2
KpEquals /* 103 */,
// More function keys
F13 /* 104 */, F14 /* 105 */, F15 /* 106 */, F16 /* 107 */, F17 /* 108 */, F18 /* 109 */,
F19 /* 110 */, F20 /* 111 */, F21 /* 112 */, F22 /* 113 */, F23 /* 114 */, F24 /* 115 */,
// More shortcut keys
Execute /* 116 */, Help /* 117 */, Menu /* 118 */, Select /* 119 */, Stop /* 120 */,
Again /* 121 */, Undo /* 122 */, Cut /* 123 */, Copy /* 124 */, Paste /* 125 */,
Find /* 126 */,
// Audio part 1
Mute /* 127 */, VolumeUp /* 128 */, VolumeDown /* 129 */,
// Numeric keypad part 3
KpComma /* 133 */, KpEqualsAS400 /* 134 */,
// International?
International1 /* 135 */, International2 /* 136 */, International3 /* 137 */,
International4 /* 138 */, International5 /* 139 */, International6 /* 140 */,
International7 /* 141 */, International8 /* 142 */, International9 /* 143 */,
// Language?
Lang1 /* 144 */, Lang2 /* 145 */, Lang3 /* 146 */,
Lang4 /* 147 */, Lang5 /* 148 */, Lang6 /* 149 */,
Lang7 /* 150 */, Lang8 /* 151 */, Lang9 /* 152 */,
// Even more shortcut keys
AltErase /* 153 */, SysReq /* 154 */, Cancel /* 155 */, Clear /* 156 */,
Prior /* 157 */, Return2 /* 158 */, Separator /* 159 */, Out /* 160 */,
Oper /* 161 */, ClearAgain /* 162 */, CrSel /* 163 */, ExSel /* 164 */,
// Numeric keypad part 4
Kp00 /* 176 */, Kp000 /* 177 */,
ThousandsSeparator /* 178 */, DecimalSeparator /* 179 */,
CurrencyUnit /* 180 */, CurrencySubUnit /* 181 */,
KpLeftParen /* 182 */, KpRightParen /* 183 */,
KpLeftBrace /* 184 */, KpRightBrace /* 185 */,
KpTab /* 186 */, KpBackspace /* 187 */,
KpA /* 188 */, KpB /* 189 */,
KpC /* 190 */, KpD /* 191 */,
KpE /* 192 */, KpF /* 193 */,
KpXor /* 194 */, KpPower /* 195 */,
KpPercent /* 196 */, KpLess /* 197 */,
KpGreater /* 198 */, KpAmpersand /* 199 */,
KpDblAmpersand /* 200 */, KpVerticalBar /* 201 */,
KpDblVerticalBar /* 202 */, KpColon /* 203 */,
KpHash /* 204 */, KpSpace /* 205 */,
KpAt /* 206 */, KpExclam /* 207 */,
KpMemStore /* 208 */, KpMemRecall /* 209 */,
KpMemClear /* 210 */, KpMemAdd /* 211 */,
KpMemSubtract /* 212 */, KpMemMultiply /* 213 */,
KpMemDivide /* 214 */, KpPlusMinus /* 215 */,
KpClear /* 216 */, KpClearEntry /* 217 */,
KpBinary /* 218 */, KpOctal /* 219 */,
KpDecimal /* 220 */, KpHexadecimal /* 221 */,
// Modifier keys
LCtrl /* 224 */, LShift /* 225 */, LAlt /* 226 */, LGui /* 227 */,
RCtrl /* 228 */, RShift /* 229 */, RAlt /* 230 */, RGui /* 231 */,
// ???
Mode /* 257 */,
// Audio part 2
AudioNext /* 258 */, AudioPrev /* 259 */, AudioStop /* 260 */,
AudioPlay /* 261 */, AudioMute /* 262 */, MediaSelect /* 263 */,
// Multimedia keys
Www /* 264 */, Mail /* 265 */, Calculator /* 266 */,
Computer /* 267 */, AcSearch /* 268 */, AcHome /* 269 */,
AcBack /* 270 */, AcForward /* 271 */, AcStop /* 272 */,
AcRefresh /* 273 */, AcBookmarks /* 274 */, BrightnessDown /* 275 */,
BrightnessUp /* 276 */, DisplaySwitch /* 277 */, KbdIllumToggle /* 278 */,
KbdIllumDown /* 279 */, KbdIllumUp /* 280 */, Eject /* 281 */,
Sleep /* 282 */, App1 /* 283 */, App2 /* 284 */,
// Audio part 3
AudioRewind /* 285 */, AudioFastForward /* 286 */,
// This is the end.
}

impl Default for Scan {
fn default() -> Self {
Self::Unhandled
}
}

/// A Joystick axis.
#[non_exhaustive]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
Expand Down
2 changes: 1 addition & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ pub mod prelude {
pub use super::error::{Error as PixError, Result as PixResult};
pub use super::event::{
Axis, ControllerButton, ControllerEvent, ControllerId, ControllerUpdate, Event, HatState,
Key, KeyEvent, KeyMod, Mouse, WindowEvent,
Key, KeyEvent, KeyMod, Scan, Mouse, WindowEvent,
};
pub use super::gui::theme::{self, ColorType, Font, Theme};
pub use super::image::{Image, PixelFormat};
Expand Down
Loading

0 comments on commit 898801f

Please sign in to comment.