MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Cocoa/KeyMapping.cpp
Go to the documentation of this file.
1#include "KeyMapping.hpp"
2
3#ifdef MAYAFLUX_PLATFORM_MACOS
4
5#include <Carbon/Carbon.h>
6
7#include <array>
8
9namespace MayaFlux::Core {
10
11namespace {
12
13constexpr auto key_map = [] {
14 std::array<IO::Keys, 128> keys;
15 keys.fill(IO::Keys::Unknown);
16
17 keys[kVK_ANSI_0] = IO::Keys::N0;
18 keys[kVK_ANSI_1] = IO::Keys::N1;
19 keys[kVK_ANSI_2] = IO::Keys::N2;
20 keys[kVK_ANSI_3] = IO::Keys::N3;
21 keys[kVK_ANSI_4] = IO::Keys::N4;
22 keys[kVK_ANSI_5] = IO::Keys::N5;
23 keys[kVK_ANSI_6] = IO::Keys::N6;
24 keys[kVK_ANSI_7] = IO::Keys::N7;
25 keys[kVK_ANSI_8] = IO::Keys::N8;
26 keys[kVK_ANSI_9] = IO::Keys::N9;
27
28 keys[kVK_ANSI_A] = IO::Keys::A;
29 keys[kVK_ANSI_B] = IO::Keys::B;
30 keys[kVK_ANSI_C] = IO::Keys::C;
31 keys[kVK_ANSI_D] = IO::Keys::D;
32 keys[kVK_ANSI_E] = IO::Keys::E;
33 keys[kVK_ANSI_F] = IO::Keys::F;
34 keys[kVK_ANSI_G] = IO::Keys::G;
35 keys[kVK_ANSI_H] = IO::Keys::H;
36 keys[kVK_ANSI_I] = IO::Keys::I;
37 keys[kVK_ANSI_J] = IO::Keys::J;
38 keys[kVK_ANSI_K] = IO::Keys::K;
39 keys[kVK_ANSI_L] = IO::Keys::L;
40 keys[kVK_ANSI_M] = IO::Keys::M;
41 keys[kVK_ANSI_N] = IO::Keys::N;
42 keys[kVK_ANSI_O] = IO::Keys::O;
43 keys[kVK_ANSI_P] = IO::Keys::P;
44 keys[kVK_ANSI_Q] = IO::Keys::Q;
45 keys[kVK_ANSI_R] = IO::Keys::R;
46 keys[kVK_ANSI_S] = IO::Keys::S;
47 keys[kVK_ANSI_T] = IO::Keys::T;
48 keys[kVK_ANSI_U] = IO::Keys::U;
49 keys[kVK_ANSI_V] = IO::Keys::V;
50 keys[kVK_ANSI_W] = IO::Keys::W;
51 keys[kVK_ANSI_X] = IO::Keys::X;
52 keys[kVK_ANSI_Y] = IO::Keys::Y;
53 keys[kVK_ANSI_Z] = IO::Keys::Z;
54
55 keys[kVK_ANSI_Quote] = IO::Keys::Apostrophe;
56 keys[kVK_ANSI_Comma] = IO::Keys::Comma;
57 keys[kVK_ANSI_Minus] = IO::Keys::Minus;
58 keys[kVK_ANSI_Period] = IO::Keys::Period;
59 keys[kVK_ANSI_Slash] = IO::Keys::Slash;
60 keys[kVK_ANSI_Semicolon] = IO::Keys::Semicolon;
61 keys[kVK_ANSI_Equal] = IO::Keys::Equal;
62 keys[kVK_ANSI_LeftBracket] = IO::Keys::LeftBracket;
63 keys[kVK_ANSI_Backslash] = IO::Keys::Backslash;
64 keys[kVK_ANSI_RightBracket] = IO::Keys::RightBracket;
65 keys[kVK_ANSI_Grave] = IO::Keys::GraveAccent;
66 keys[kVK_Space] = IO::Keys::Space;
67
68 keys[kVK_Escape] = IO::Keys::Escape;
69 keys[kVK_Return] = IO::Keys::Enter;
70 keys[kVK_Tab] = IO::Keys::Tab;
71 keys[kVK_Delete] = IO::Keys::Backspace;
72 keys[kVK_Help] = IO::Keys::Insert;
73 keys[kVK_ForwardDelete] = IO::Keys::Delete;
74 keys[kVK_RightArrow] = IO::Keys::Right;
75 keys[kVK_LeftArrow] = IO::Keys::Left;
76 keys[kVK_DownArrow] = IO::Keys::Down;
77 keys[kVK_UpArrow] = IO::Keys::Up;
78 keys[kVK_PageUp] = IO::Keys::PageUp;
79 keys[kVK_PageDown] = IO::Keys::PageDown;
80 keys[kVK_Home] = IO::Keys::Home;
81 keys[kVK_End] = IO::Keys::End;
82 keys[kVK_CapsLock] = IO::Keys::CapsLock;
83 keys[kVK_ANSI_KeypadClear] = IO::Keys::NumLock;
84
85 keys[kVK_F1] = IO::Keys::F1;
86 keys[kVK_F2] = IO::Keys::F2;
87 keys[kVK_F3] = IO::Keys::F3;
88 keys[kVK_F4] = IO::Keys::F4;
89 keys[kVK_F5] = IO::Keys::F5;
90 keys[kVK_F6] = IO::Keys::F6;
91 keys[kVK_F7] = IO::Keys::F7;
92 keys[kVK_F8] = IO::Keys::F8;
93 keys[kVK_F9] = IO::Keys::F9;
94 keys[kVK_F10] = IO::Keys::F10;
95 keys[kVK_F11] = IO::Keys::F11;
96 keys[kVK_F12] = IO::Keys::F12;
97 keys[kVK_F13] = IO::Keys::F13;
98 keys[kVK_F14] = IO::Keys::F14;
99 keys[kVK_F15] = IO::Keys::F15;
100 keys[kVK_F16] = IO::Keys::F16;
101 keys[kVK_F17] = IO::Keys::F17;
102 keys[kVK_F18] = IO::Keys::F18;
103 keys[kVK_F19] = IO::Keys::F19;
104 keys[kVK_F20] = IO::Keys::F20;
105
106 keys[kVK_ANSI_Keypad0] = IO::Keys::KP0;
107 keys[kVK_ANSI_Keypad1] = IO::Keys::KP1;
108 keys[kVK_ANSI_Keypad2] = IO::Keys::KP2;
109 keys[kVK_ANSI_Keypad3] = IO::Keys::KP3;
110 keys[kVK_ANSI_Keypad4] = IO::Keys::KP4;
111 keys[kVK_ANSI_Keypad5] = IO::Keys::KP5;
112 keys[kVK_ANSI_Keypad6] = IO::Keys::KP6;
113 keys[kVK_ANSI_Keypad7] = IO::Keys::KP7;
114 keys[kVK_ANSI_Keypad8] = IO::Keys::KP8;
115 keys[kVK_ANSI_Keypad9] = IO::Keys::KP9;
116 keys[kVK_ANSI_KeypadDecimal] = IO::Keys::KPDecimal;
117 keys[kVK_ANSI_KeypadDivide] = IO::Keys::KPDivide;
118 keys[kVK_ANSI_KeypadMultiply] = IO::Keys::KPMultiply;
119 keys[kVK_ANSI_KeypadMinus] = IO::Keys::KPSubtract;
120 keys[kVK_ANSI_KeypadPlus] = IO::Keys::KPAdd;
121 keys[kVK_ANSI_KeypadEnter] = IO::Keys::KPEnter;
122 keys[kVK_ANSI_KeypadEquals] = IO::Keys::KPEqual;
123
124 keys[kVK_Shift] = IO::Keys::LShift;
125 keys[kVK_Control] = IO::Keys::LCtrl;
126 keys[kVK_Option] = IO::Keys::LAlt;
127 keys[kVK_Command] = IO::Keys::LSuper;
128 keys[kVK_RightShift] = IO::Keys::RShift;
129 keys[kVK_RightControl] = IO::Keys::RCtrl;
130 keys[kVK_RightOption] = IO::Keys::RAlt;
131 keys[kVK_RightCommand] = IO::Keys::RSuper;
132
133 keys[kVK_ContextualMenu] = IO::Keys::Menu;
134
135 return keys;
136}();
137
138}
139
140IO::Keys from_cocoa_key(uint16_t key_code) noexcept
141{
142 return key_code < key_map.size() ? key_map[key_code] : IO::Keys::Unknown;
143}
144
145int to_cocoa_key(IO::Keys key) noexcept
146{
147 if (key == IO::Keys::Unknown)
148 return -1;
149
150 for (std::size_t key_code = 0; key_code < key_map.size(); ++key_code) {
151 if (key_map[key_code] == key)
152 return static_cast<int>(key_code);
153 }
154
155 return -1;
156}
157
158bool is_valid_cocoa_key(uint16_t key_code) noexcept
159{
160 return from_cocoa_key(key_code) != IO::Keys::Unknown;
161}
162
163}
164
165#endif