Skip to main content

openloaf_rdev/keycodes/
macos.rs

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        //TODO: make const when rust lang issue #49146 is fixed
11        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        //TODO: make const when rust lang issue #49146 is fixed
22        #[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    // PrintScreen, kVK_F13,
137    F13, kVK_F13,
138    F16, kVK_F16,
139    // ScrollLock, kVK_F14,
140    F14, kVK_F14,
141    F10, kVK_F10,
142    F12, kVK_F12,
143    // Pause, kVK_F15,
144    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    // KanaMode, kVK_Unknown,
160    // Lang3, kVK_Unknown,
161    // Lang4, kVK_Unknown,
162    // Lang5, kVK_Unknown
163);
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}