Skip to main content

pebble/wgpu/
keycode.rs

1//! Mirrors `winit::keyboard::KeyCode` (physical key codes) and
2//! `winit::event::MouseButton` exactly, so [`Input`](super::window::Input)'s
3//! methods never need a raw `winit` type. Convert into winit via `.into()`.
4
5/// Code representing the location of a physical key on the keyboard —
6/// mirrors `winit::keyboard::KeyCode` exactly (same variants, same names).
7/// Physical, not logical: `KeyW` is the same key regardless of the active
8/// keyboard layout, which is what makes this suitable for game controls
9/// (movement bindings, etc.) rather than text entry.
10#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
11pub enum KeyCode {
12    Backquote,
13    Backslash,
14    BracketLeft,
15    BracketRight,
16    Comma,
17    Digit0,
18    Digit1,
19    Digit2,
20    Digit3,
21    Digit4,
22    Digit5,
23    Digit6,
24    Digit7,
25    Digit8,
26    Digit9,
27    Equal,
28    IntlBackslash,
29    IntlRo,
30    IntlYen,
31    KeyA,
32    KeyB,
33    KeyC,
34    KeyD,
35    KeyE,
36    KeyF,
37    KeyG,
38    KeyH,
39    KeyI,
40    KeyJ,
41    KeyK,
42    KeyL,
43    KeyM,
44    KeyN,
45    KeyO,
46    KeyP,
47    KeyQ,
48    KeyR,
49    KeyS,
50    KeyT,
51    KeyU,
52    KeyV,
53    KeyW,
54    KeyX,
55    KeyY,
56    KeyZ,
57    Minus,
58    Period,
59    Quote,
60    Semicolon,
61    Slash,
62    AltLeft,
63    AltRight,
64    Backspace,
65    CapsLock,
66    ContextMenu,
67    ControlLeft,
68    ControlRight,
69    Enter,
70    SuperLeft,
71    SuperRight,
72    ShiftLeft,
73    ShiftRight,
74    Space,
75    Tab,
76    Convert,
77    KanaMode,
78    Lang1,
79    Lang2,
80    Lang3,
81    Lang4,
82    Lang5,
83    NonConvert,
84    Delete,
85    End,
86    Help,
87    Home,
88    Insert,
89    PageDown,
90    PageUp,
91    ArrowDown,
92    ArrowLeft,
93    ArrowRight,
94    ArrowUp,
95    NumLock,
96    Numpad0,
97    Numpad1,
98    Numpad2,
99    Numpad3,
100    Numpad4,
101    Numpad5,
102    Numpad6,
103    Numpad7,
104    Numpad8,
105    Numpad9,
106    NumpadAdd,
107    NumpadBackspace,
108    NumpadClear,
109    NumpadClearEntry,
110    NumpadComma,
111    NumpadDecimal,
112    NumpadDivide,
113    NumpadEnter,
114    NumpadEqual,
115    NumpadHash,
116    NumpadMemoryAdd,
117    NumpadMemoryClear,
118    NumpadMemoryRecall,
119    NumpadMemoryStore,
120    NumpadMemorySubtract,
121    NumpadMultiply,
122    NumpadParenLeft,
123    NumpadParenRight,
124    NumpadStar,
125    NumpadSubtract,
126    Escape,
127    Fn,
128    FnLock,
129    PrintScreen,
130    ScrollLock,
131    Pause,
132    BrowserBack,
133    BrowserFavorites,
134    BrowserForward,
135    BrowserHome,
136    BrowserRefresh,
137    BrowserSearch,
138    BrowserStop,
139    Eject,
140    LaunchApp1,
141    LaunchApp2,
142    LaunchMail,
143    MediaPlayPause,
144    MediaSelect,
145    MediaStop,
146    MediaTrackNext,
147    MediaTrackPrevious,
148    Power,
149    Sleep,
150    AudioVolumeDown,
151    AudioVolumeMute,
152    AudioVolumeUp,
153    WakeUp,
154    Meta,
155    Hyper,
156    Turbo,
157    Abort,
158    Resume,
159    Suspend,
160    Again,
161    Copy,
162    Cut,
163    Find,
164    Open,
165    Paste,
166    Props,
167    Select,
168    Undo,
169    Hiragana,
170    Katakana,
171    F1,
172    F2,
173    F3,
174    F4,
175    F5,
176    F6,
177    F7,
178    F8,
179    F9,
180    F10,
181    F11,
182    F12,
183    F13,
184    F14,
185    F15,
186    F16,
187    F17,
188    F18,
189    F19,
190    F20,
191    F21,
192    F22,
193    F23,
194    F24,
195    F25,
196    F26,
197    F27,
198    F28,
199    F29,
200    F30,
201    F31,
202    F32,
203    F33,
204    F34,
205    F35,
206}
207
208impl From<KeyCode> for winit::keyboard::KeyCode {
209    fn from(value: KeyCode) -> Self {
210        match value {
211            KeyCode::Backquote => Self::Backquote,
212            KeyCode::Backslash => Self::Backslash,
213            KeyCode::BracketLeft => Self::BracketLeft,
214            KeyCode::BracketRight => Self::BracketRight,
215            KeyCode::Comma => Self::Comma,
216            KeyCode::Digit0 => Self::Digit0,
217            KeyCode::Digit1 => Self::Digit1,
218            KeyCode::Digit2 => Self::Digit2,
219            KeyCode::Digit3 => Self::Digit3,
220            KeyCode::Digit4 => Self::Digit4,
221            KeyCode::Digit5 => Self::Digit5,
222            KeyCode::Digit6 => Self::Digit6,
223            KeyCode::Digit7 => Self::Digit7,
224            KeyCode::Digit8 => Self::Digit8,
225            KeyCode::Digit9 => Self::Digit9,
226            KeyCode::Equal => Self::Equal,
227            KeyCode::IntlBackslash => Self::IntlBackslash,
228            KeyCode::IntlRo => Self::IntlRo,
229            KeyCode::IntlYen => Self::IntlYen,
230            KeyCode::KeyA => Self::KeyA,
231            KeyCode::KeyB => Self::KeyB,
232            KeyCode::KeyC => Self::KeyC,
233            KeyCode::KeyD => Self::KeyD,
234            KeyCode::KeyE => Self::KeyE,
235            KeyCode::KeyF => Self::KeyF,
236            KeyCode::KeyG => Self::KeyG,
237            KeyCode::KeyH => Self::KeyH,
238            KeyCode::KeyI => Self::KeyI,
239            KeyCode::KeyJ => Self::KeyJ,
240            KeyCode::KeyK => Self::KeyK,
241            KeyCode::KeyL => Self::KeyL,
242            KeyCode::KeyM => Self::KeyM,
243            KeyCode::KeyN => Self::KeyN,
244            KeyCode::KeyO => Self::KeyO,
245            KeyCode::KeyP => Self::KeyP,
246            KeyCode::KeyQ => Self::KeyQ,
247            KeyCode::KeyR => Self::KeyR,
248            KeyCode::KeyS => Self::KeyS,
249            KeyCode::KeyT => Self::KeyT,
250            KeyCode::KeyU => Self::KeyU,
251            KeyCode::KeyV => Self::KeyV,
252            KeyCode::KeyW => Self::KeyW,
253            KeyCode::KeyX => Self::KeyX,
254            KeyCode::KeyY => Self::KeyY,
255            KeyCode::KeyZ => Self::KeyZ,
256            KeyCode::Minus => Self::Minus,
257            KeyCode::Period => Self::Period,
258            KeyCode::Quote => Self::Quote,
259            KeyCode::Semicolon => Self::Semicolon,
260            KeyCode::Slash => Self::Slash,
261            KeyCode::AltLeft => Self::AltLeft,
262            KeyCode::AltRight => Self::AltRight,
263            KeyCode::Backspace => Self::Backspace,
264            KeyCode::CapsLock => Self::CapsLock,
265            KeyCode::ContextMenu => Self::ContextMenu,
266            KeyCode::ControlLeft => Self::ControlLeft,
267            KeyCode::ControlRight => Self::ControlRight,
268            KeyCode::Enter => Self::Enter,
269            KeyCode::SuperLeft => Self::SuperLeft,
270            KeyCode::SuperRight => Self::SuperRight,
271            KeyCode::ShiftLeft => Self::ShiftLeft,
272            KeyCode::ShiftRight => Self::ShiftRight,
273            KeyCode::Space => Self::Space,
274            KeyCode::Tab => Self::Tab,
275            KeyCode::Convert => Self::Convert,
276            KeyCode::KanaMode => Self::KanaMode,
277            KeyCode::Lang1 => Self::Lang1,
278            KeyCode::Lang2 => Self::Lang2,
279            KeyCode::Lang3 => Self::Lang3,
280            KeyCode::Lang4 => Self::Lang4,
281            KeyCode::Lang5 => Self::Lang5,
282            KeyCode::NonConvert => Self::NonConvert,
283            KeyCode::Delete => Self::Delete,
284            KeyCode::End => Self::End,
285            KeyCode::Help => Self::Help,
286            KeyCode::Home => Self::Home,
287            KeyCode::Insert => Self::Insert,
288            KeyCode::PageDown => Self::PageDown,
289            KeyCode::PageUp => Self::PageUp,
290            KeyCode::ArrowDown => Self::ArrowDown,
291            KeyCode::ArrowLeft => Self::ArrowLeft,
292            KeyCode::ArrowRight => Self::ArrowRight,
293            KeyCode::ArrowUp => Self::ArrowUp,
294            KeyCode::NumLock => Self::NumLock,
295            KeyCode::Numpad0 => Self::Numpad0,
296            KeyCode::Numpad1 => Self::Numpad1,
297            KeyCode::Numpad2 => Self::Numpad2,
298            KeyCode::Numpad3 => Self::Numpad3,
299            KeyCode::Numpad4 => Self::Numpad4,
300            KeyCode::Numpad5 => Self::Numpad5,
301            KeyCode::Numpad6 => Self::Numpad6,
302            KeyCode::Numpad7 => Self::Numpad7,
303            KeyCode::Numpad8 => Self::Numpad8,
304            KeyCode::Numpad9 => Self::Numpad9,
305            KeyCode::NumpadAdd => Self::NumpadAdd,
306            KeyCode::NumpadBackspace => Self::NumpadBackspace,
307            KeyCode::NumpadClear => Self::NumpadClear,
308            KeyCode::NumpadClearEntry => Self::NumpadClearEntry,
309            KeyCode::NumpadComma => Self::NumpadComma,
310            KeyCode::NumpadDecimal => Self::NumpadDecimal,
311            KeyCode::NumpadDivide => Self::NumpadDivide,
312            KeyCode::NumpadEnter => Self::NumpadEnter,
313            KeyCode::NumpadEqual => Self::NumpadEqual,
314            KeyCode::NumpadHash => Self::NumpadHash,
315            KeyCode::NumpadMemoryAdd => Self::NumpadMemoryAdd,
316            KeyCode::NumpadMemoryClear => Self::NumpadMemoryClear,
317            KeyCode::NumpadMemoryRecall => Self::NumpadMemoryRecall,
318            KeyCode::NumpadMemoryStore => Self::NumpadMemoryStore,
319            KeyCode::NumpadMemorySubtract => Self::NumpadMemorySubtract,
320            KeyCode::NumpadMultiply => Self::NumpadMultiply,
321            KeyCode::NumpadParenLeft => Self::NumpadParenLeft,
322            KeyCode::NumpadParenRight => Self::NumpadParenRight,
323            KeyCode::NumpadStar => Self::NumpadStar,
324            KeyCode::NumpadSubtract => Self::NumpadSubtract,
325            KeyCode::Escape => Self::Escape,
326            KeyCode::Fn => Self::Fn,
327            KeyCode::FnLock => Self::FnLock,
328            KeyCode::PrintScreen => Self::PrintScreen,
329            KeyCode::ScrollLock => Self::ScrollLock,
330            KeyCode::Pause => Self::Pause,
331            KeyCode::BrowserBack => Self::BrowserBack,
332            KeyCode::BrowserFavorites => Self::BrowserFavorites,
333            KeyCode::BrowserForward => Self::BrowserForward,
334            KeyCode::BrowserHome => Self::BrowserHome,
335            KeyCode::BrowserRefresh => Self::BrowserRefresh,
336            KeyCode::BrowserSearch => Self::BrowserSearch,
337            KeyCode::BrowserStop => Self::BrowserStop,
338            KeyCode::Eject => Self::Eject,
339            KeyCode::LaunchApp1 => Self::LaunchApp1,
340            KeyCode::LaunchApp2 => Self::LaunchApp2,
341            KeyCode::LaunchMail => Self::LaunchMail,
342            KeyCode::MediaPlayPause => Self::MediaPlayPause,
343            KeyCode::MediaSelect => Self::MediaSelect,
344            KeyCode::MediaStop => Self::MediaStop,
345            KeyCode::MediaTrackNext => Self::MediaTrackNext,
346            KeyCode::MediaTrackPrevious => Self::MediaTrackPrevious,
347            KeyCode::Power => Self::Power,
348            KeyCode::Sleep => Self::Sleep,
349            KeyCode::AudioVolumeDown => Self::AudioVolumeDown,
350            KeyCode::AudioVolumeMute => Self::AudioVolumeMute,
351            KeyCode::AudioVolumeUp => Self::AudioVolumeUp,
352            KeyCode::WakeUp => Self::WakeUp,
353            KeyCode::Meta => Self::Meta,
354            KeyCode::Hyper => Self::Hyper,
355            KeyCode::Turbo => Self::Turbo,
356            KeyCode::Abort => Self::Abort,
357            KeyCode::Resume => Self::Resume,
358            KeyCode::Suspend => Self::Suspend,
359            KeyCode::Again => Self::Again,
360            KeyCode::Copy => Self::Copy,
361            KeyCode::Cut => Self::Cut,
362            KeyCode::Find => Self::Find,
363            KeyCode::Open => Self::Open,
364            KeyCode::Paste => Self::Paste,
365            KeyCode::Props => Self::Props,
366            KeyCode::Select => Self::Select,
367            KeyCode::Undo => Self::Undo,
368            KeyCode::Hiragana => Self::Hiragana,
369            KeyCode::Katakana => Self::Katakana,
370            KeyCode::F1 => Self::F1,
371            KeyCode::F2 => Self::F2,
372            KeyCode::F3 => Self::F3,
373            KeyCode::F4 => Self::F4,
374            KeyCode::F5 => Self::F5,
375            KeyCode::F6 => Self::F6,
376            KeyCode::F7 => Self::F7,
377            KeyCode::F8 => Self::F8,
378            KeyCode::F9 => Self::F9,
379            KeyCode::F10 => Self::F10,
380            KeyCode::F11 => Self::F11,
381            KeyCode::F12 => Self::F12,
382            KeyCode::F13 => Self::F13,
383            KeyCode::F14 => Self::F14,
384            KeyCode::F15 => Self::F15,
385            KeyCode::F16 => Self::F16,
386            KeyCode::F17 => Self::F17,
387            KeyCode::F18 => Self::F18,
388            KeyCode::F19 => Self::F19,
389            KeyCode::F20 => Self::F20,
390            KeyCode::F21 => Self::F21,
391            KeyCode::F22 => Self::F22,
392            KeyCode::F23 => Self::F23,
393            KeyCode::F24 => Self::F24,
394            KeyCode::F25 => Self::F25,
395            KeyCode::F26 => Self::F26,
396            KeyCode::F27 => Self::F27,
397            KeyCode::F28 => Self::F28,
398            KeyCode::F29 => Self::F29,
399            KeyCode::F30 => Self::F30,
400            KeyCode::F31 => Self::F31,
401            KeyCode::F32 => Self::F32,
402            KeyCode::F33 => Self::F33,
403            KeyCode::F34 => Self::F34,
404            KeyCode::F35 => Self::F35,
405        }
406    }
407}
408
409/// A mouse button — mirrors `winit::event::MouseButton` exactly.
410#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
411pub enum MouseButton {
412    Left,
413    Right,
414    Middle,
415    Back,
416    Forward,
417    /// A platform- and device-specific button code, for buttons beyond the
418    /// five above (extra thumb buttons, etc).
419    Other(u16),
420}
421
422impl From<MouseButton> for winit::event::MouseButton {
423    fn from(value: MouseButton) -> Self {
424        match value {
425            MouseButton::Left => Self::Left,
426            MouseButton::Right => Self::Right,
427            MouseButton::Middle => Self::Middle,
428            MouseButton::Back => Self::Back,
429            MouseButton::Forward => Self::Forward,
430            MouseButton::Other(code) => Self::Other(code),
431        }
432    }
433}
434
435#[cfg(test)]
436mod tests {
437    use super::*;
438
439    #[test]
440    fn key_code_conversion_is_positional_not_coincidental() {
441        // Spot-check first, last, and a few variants from the middle of the
442        // 194-variant match — enough to catch a shifted/misaligned arm
443        // without re-listing every variant.
444        assert_eq!(winit::keyboard::KeyCode::from(KeyCode::Backquote), winit::keyboard::KeyCode::Backquote);
445        assert_eq!(winit::keyboard::KeyCode::from(KeyCode::KeyW), winit::keyboard::KeyCode::KeyW);
446        assert_eq!(winit::keyboard::KeyCode::from(KeyCode::ArrowUp), winit::keyboard::KeyCode::ArrowUp);
447        assert_eq!(winit::keyboard::KeyCode::from(KeyCode::ShiftLeft), winit::keyboard::KeyCode::ShiftLeft);
448        assert_eq!(winit::keyboard::KeyCode::from(KeyCode::F35), winit::keyboard::KeyCode::F35);
449    }
450
451    #[test]
452    fn mouse_button_conversion_preserves_the_other_code() {
453        assert_eq!(winit::event::MouseButton::from(MouseButton::Left), winit::event::MouseButton::Left);
454        assert_eq!(winit::event::MouseButton::from(MouseButton::Other(7)), winit::event::MouseButton::Other(7));
455    }
456}