1#![allow(non_upper_case_globals)]
2
3use super::macos_virtual_keycodes::*;
4use crate::rdev::Key;
5
6pub use super::macos_virtual_keycodes as virtual_keycodes;
7
8macro_rules! decl_keycodes {
9 ($($key:ident, $code:ident),*) => {
10 pub fn code_from_key(key: Key) -> Option<CGKeyCode> {
12 match key {
13 $(
14 Key::$key => Some($code),
15 )*
16 Key::Unknown(code) => Some(code as _),
17 _ => None,
18 }
19 }
20
21 #[allow(dead_code)]
23 pub fn key_from_code(code: CGKeyCode) -> Key {
24 match code {
25 $(
26 $code => Key::$key,
27 )*
28 _ => Key::Unknown(code as _)
29 }
30 }
31 };
32}
33
34#[rustfmt::skip]
35decl_keycodes!(
36 KeyA, kVK_ANSI_A,
37 KeyS, kVK_ANSI_S,
38 KeyD, kVK_ANSI_D,
39 KeyF, kVK_ANSI_F,
40 KeyH, kVK_ANSI_H,
41 KeyG, kVK_ANSI_G,
42 KeyZ, kVK_ANSI_Z,
43 KeyX, kVK_ANSI_X,
44 KeyC, kVK_ANSI_C,
45 KeyV, kVK_ANSI_V,
46 IntlBackslash, kVK_ISO_Section,
47 KeyB, kVK_ANSI_B,
48 KeyQ, kVK_ANSI_Q,
49 KeyW, kVK_ANSI_W,
50 KeyE, kVK_ANSI_E,
51 KeyR, kVK_ANSI_R,
52 KeyY, kVK_ANSI_Y,
53 KeyT, kVK_ANSI_T,
54 Num1, kVK_ANSI_1,
55 Num2, kVK_ANSI_2,
56 Num3, kVK_ANSI_3,
57 Num4, kVK_ANSI_4,
58 Num6, kVK_ANSI_6,
59 Num5, kVK_ANSI_5,
60 Equal, kVK_ANSI_Equal,
61 Num9, kVK_ANSI_9,
62 Num7, kVK_ANSI_7,
63 Minus, kVK_ANSI_Minus,
64 Num8, kVK_ANSI_8,
65 Num0, kVK_ANSI_0,
66 RightBracket, kVK_ANSI_RightBracket,
67 KeyO, kVK_ANSI_O,
68 KeyU, kVK_ANSI_U,
69 LeftBracket, kVK_ANSI_LeftBracket,
70 KeyI, kVK_ANSI_I,
71 KeyP, kVK_ANSI_P,
72 Return, kVK_Return,
73 KeyL, kVK_ANSI_L,
74 KeyJ, kVK_ANSI_J,
75 Quote, kVK_ANSI_Quote,
76 KeyK, kVK_ANSI_K,
77 SemiColon, kVK_ANSI_Semicolon,
78 BackSlash, kVK_ANSI_Backslash,
79 Comma, kVK_ANSI_Comma,
80 Slash, kVK_ANSI_Slash,
81 KeyN, kVK_ANSI_N,
82 KeyM, kVK_ANSI_M,
83 Dot, kVK_ANSI_Period,
84 Tab, kVK_Tab,
85 Space, kVK_Space,
86 BackQuote, kVK_ANSI_Grave,
87 Backspace, kVK_Delete,
88 Escape, kVK_Escape,
89 MetaRight, kVK_RightCommand,
90 MetaLeft, kVK_Command,
91 ShiftLeft, kVK_Shift,
92 CapsLock, kVK_CapsLock,
93 Alt, kVK_Option,
94 ControlLeft, kVK_Control,
95 ShiftRight, kVK_RightShift,
96 AltGr, kVK_RightOption,
97 ControlRight, kVK_RightControl,
98 Function, kVK_Function,
99 F17, kVK_F17,
100 KpDecimal, kVK_ANSI_KeypadDecimal,
101 KpMultiply, kVK_ANSI_KeypadMultiply,
102 KpPlus, kVK_ANSI_KeypadPlus,
103 NumLock, kVK_ANSI_KeypadClear,
104 VolumeUp, kVK_VolumeUp,
105 VolumeDown, kVK_VolumeDown,
106 VolumeMute, kVK_Mute,
107 KpDivide, kVK_ANSI_KeypadDivide,
108 KpReturn, kVK_ANSI_KeypadEnter,
109 KpMinus, kVK_ANSI_KeypadMinus,
110 F18, kVK_F18,
111 F19, kVK_F19,
112 KpEqual, kVK_ANSI_KeypadEquals,
113 Kp0, kVK_ANSI_Keypad0,
114 Kp1, kVK_ANSI_Keypad1,
115 Kp2, kVK_ANSI_Keypad2,
116 Kp3, kVK_ANSI_Keypad3,
117 Kp4, kVK_ANSI_Keypad4,
118 Kp5, kVK_ANSI_Keypad5,
119 Kp6, kVK_ANSI_Keypad6,
120 Kp7, kVK_ANSI_Keypad7,
121 F20, kVK_F20,
122 Kp8, kVK_ANSI_Keypad8,
123 Kp9, kVK_ANSI_Keypad9,
124 IntlYen, kVK_JIS_Yen,
125 IntlRo, kVK_JIS_Underscore,
126 KpComma, kVK_JIS_KeypadComma,
127 F5, kVK_F5,
128 F6, kVK_F6,
129 F7, kVK_F7,
130 F3, kVK_F3,
131 F8, kVK_F8,
132 F9, kVK_F9,
133 Lang2, kVK_JIS_Eisu,
134 F11, kVK_F11,
135 Lang1, kVK_JIS_Kana,
136 F13, kVK_F13,
138 F16, kVK_F16,
139 F14, kVK_F14,
141 F10, kVK_F10,
142 F12, kVK_F12,
143 F15, kVK_F15,
145 Insert, kVK_Help,
146 Home, kVK_Home,
147 PageUp, kVK_PageUp,
148 Delete, kVK_ForwardDelete,
149 F4, kVK_F4,
150 End, kVK_End,
151 F2, kVK_F2,
152 PageDown, kVK_PageDown,
153 F1, kVK_F1,
154 LeftArrow, kVK_LeftArrow,
155 RightArrow, kVK_RightArrow,
156 DownArrow, kVK_DownArrow,
157 UpArrow, kVK_UpArrow,
158 Apps, kVK_Context_Menu
159 );
164
165#[cfg(test)]
166mod test {
167 use super::{code_from_key, key_from_code};
168 #[test]
169 fn test_reversible() {
170 for code in 0..=65535 {
171 let key = key_from_code(code);
172 match code_from_key(key) {
173 Some(code2) => assert_eq!(code, code2),
174 None => panic!("Could not convert back code: {:?}", code),
175 }
176 }
177 }
178}