miniquad/native/linux_wayland/
keycodes.rs

1//! There are quite a few different notions for keycodes. And most of them are `u32` so it does get
2//! very confusing...
3//! Basically
4//!   - Wayland server sends a scancode `key` of type `c_uint`
5//!   - `key + 8` becomes a `xkb` scancode of type `xkb_keycode_t`
6//!   - We feed this to `xkb` to get a `keysym` of type `xkb_keysym_t`
7//!     - The `keysym` can be modifier-dependent: `Shift + Key1` can be translated to either `Key1`
8//!       (without modifier) or `Exclam` (with modifier)
9//!   - We then feed the `keysym` to `translate_keysym` to get a Miniquad `Keycode`
10//!
11//! Note that the default Miniquad behavior is without modifier; there is not even a Keycode for
12//! `Exclam`. So we must provide the unmodified `keysym` or we will get a `Keycode::Unknown`.
13//!
14//! On the other hand, the modified `keysym` is useful when we want to translate it into the
15//! underlying character.
16use crate::event::KeyCode;
17use crate::native::linux_wayland::libxkbcommon::xkb_keysym_t;
18
19pub fn translate_keysym(keysym: xkb_keysym_t) -> KeyCode {
20    // See xkbcommon/xkbcommon-keysyms.h
21    match keysym {
22        65307 => KeyCode::Escape,
23        65056 => KeyCode::Tab, // LeftTab
24        65289 => KeyCode::Tab,
25        65505 => KeyCode::LeftShift,
26        65506 => KeyCode::RightShift,
27        65507 => KeyCode::LeftControl,
28        65508 => KeyCode::RightControl,
29        65511 | 65513 => KeyCode::LeftAlt,
30        65406 | 65027 | 65512 | 65514 => KeyCode::RightAlt,
31        65515 => KeyCode::LeftSuper,
32        65516 => KeyCode::RightSuper,
33        65383 => KeyCode::Menu,
34        65407 => KeyCode::NumLock,
35        65509 => KeyCode::CapsLock,
36        65377 => KeyCode::PrintScreen,
37        65300 => KeyCode::ScrollLock,
38        65299 => KeyCode::Pause,
39        65535 => KeyCode::Delete,
40        65288 => KeyCode::Backspace,
41        65293 => KeyCode::Enter,
42        65360 => KeyCode::Home,
43        65367 => KeyCode::End,
44        65365 => KeyCode::PageUp,
45        65366 => KeyCode::PageDown,
46        65379 => KeyCode::Insert,
47        65361 => KeyCode::Left,
48        65363 => KeyCode::Right,
49        65364 => KeyCode::Down,
50        65362 => KeyCode::Up,
51        65470 => KeyCode::F1,
52        65471 => KeyCode::F2,
53        65472 => KeyCode::F3,
54        65473 => KeyCode::F4,
55        65474 => KeyCode::F5,
56        65475 => KeyCode::F6,
57        65476 => KeyCode::F7,
58        65477 => KeyCode::F8,
59        65478 => KeyCode::F9,
60        65479 => KeyCode::F10,
61        65480 => KeyCode::F11,
62        65481 => KeyCode::F12,
63        65482 => KeyCode::F13,
64        65483 => KeyCode::F14,
65        65484 => KeyCode::F15,
66        65485 => KeyCode::F16,
67        65486 => KeyCode::F17,
68        65487 => KeyCode::F18,
69        65488 => KeyCode::F19,
70        65489 => KeyCode::F20,
71        65490 => KeyCode::F21,
72        65491 => KeyCode::F22,
73        65492 => KeyCode::F23,
74        65493 => KeyCode::F24,
75        65494 => KeyCode::F25,
76        65455 => KeyCode::KpDivide,
77        65450 => KeyCode::KpMultiply,
78        65453 => KeyCode::KpSubtract,
79        65451 => KeyCode::KpAdd,
80        65438 => KeyCode::Kp0,
81        65436 => KeyCode::Kp1,
82        65433 => KeyCode::Kp2,
83        65435 => KeyCode::Kp3,
84        65430 => KeyCode::Kp4,
85        65437 => KeyCode::Kp5,
86        65432 => KeyCode::Kp6,
87        65429 => KeyCode::Kp7,
88        65431 => KeyCode::Kp8,
89        65434 => KeyCode::Kp9,
90        65439 => KeyCode::KpDecimal,
91        65469 => KeyCode::KpEqual,
92        65421 => KeyCode::KpEnter,
93        65 | 97 => KeyCode::A,
94        66 | 98 => KeyCode::B,
95        67 | 99 => KeyCode::C,
96        68 | 100 => KeyCode::D,
97        69 | 101 => KeyCode::E,
98        70 | 102 => KeyCode::F,
99        71 | 103 => KeyCode::G,
100        72 | 104 => KeyCode::H,
101        73 | 105 => KeyCode::I,
102        74 | 106 => KeyCode::J,
103        75 | 107 => KeyCode::K,
104        76 | 108 => KeyCode::L,
105        77 | 109 => KeyCode::M,
106        78 | 110 => KeyCode::N,
107        79 | 111 => KeyCode::O,
108        80 | 112 => KeyCode::P,
109        81 | 113 => KeyCode::Q,
110        82 | 114 => KeyCode::R,
111        83 | 115 => KeyCode::S,
112        84 | 116 => KeyCode::T,
113        85 | 117 => KeyCode::U,
114        86 | 118 => KeyCode::V,
115        87 | 119 => KeyCode::W,
116        88 | 120 => KeyCode::X,
117        89 | 121 => KeyCode::Y,
118        90 | 122 => KeyCode::Z,
119        49 => KeyCode::Key1,
120        50 => KeyCode::Key2,
121        51 => KeyCode::Key3,
122        52 => KeyCode::Key4,
123        53 => KeyCode::Key5,
124        54 => KeyCode::Key6,
125        55 => KeyCode::Key7,
126        56 => KeyCode::Key8,
127        57 => KeyCode::Key9,
128        48 => KeyCode::Key0,
129        32 => KeyCode::Space,
130        45 => KeyCode::Minus,
131        61 => KeyCode::Equal,
132        91 => KeyCode::LeftBracket,
133        93 => KeyCode::RightBracket,
134        92 => KeyCode::Backslash,
135        59 => KeyCode::Semicolon,
136        39 => KeyCode::Apostrophe,
137        96 => KeyCode::GraveAccent,
138        44 => KeyCode::Comma,
139        46 => KeyCode::Period,
140        47 => KeyCode::Slash,
141        60 => KeyCode::World1,
142        _ => KeyCode::Unknown,
143    }
144}