6#include "TTauri/Foundation/required.hpp"
7#include "TTauri/Foundation/exceptions.hpp"
8#include "TTauri/Foundation/strings.hpp"
9#include "TTauri/GUI/KeyboardModifiers.hpp"
10#include <unordered_map>
14enum class KeyboardVirtualKey : uint8_t {
17 A, B, C, D, E, F, G, H, I, J, K, L, M,
18 N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
20 _0, _1, _2, _3, _4, _5, _6, _7, _8, _9,
22 Plus, Minus, Star, Slash, Percent,
23 Tilde, Ampersant, Pipe, Caret,
25 OpenParentheses, CloseParentheses, OpenBracket, CloseBracket, OpenBrace, CloseBrace,
26 Period, Comma, Colon, SemiColon, Bang, Question,
28 Backtick, Quote, DoubleQuote,
29 At, Hash, Dollar, Underscore, Backslash,
31 Left, Right, Up, Down, PageUp, PageDown, Home, End,
32 Backspace, Insert, Delete, Clear, Escape,
34 PrintScreen, PauseBreak,
36 F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12,
37 F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24,
39 BrowserBack, BrowserForward, BrowserRefresh, BrowserStop,
40 BrowserSearch, BrowserFavorites, BrowserHome,
41 VolumeMute, VolumeUp, VolumeDown,
42 MediaNextTrack, MediaPrevTrack, MediaStop, MediaPlayPause,
46 {
"0", KeyboardVirtualKey::_0},
47 {
"1", KeyboardVirtualKey::_1},
48 {
"2", KeyboardVirtualKey::_2},
49 {
"3", KeyboardVirtualKey::_3},
50 {
"4", KeyboardVirtualKey::_4},
51 {
"5", KeyboardVirtualKey::_5},
52 {
"6", KeyboardVirtualKey::_6},
53 {
"7", KeyboardVirtualKey::_7},
54 {
"8", KeyboardVirtualKey::_8},
55 {
"9", KeyboardVirtualKey::_9},
56 {
"a", KeyboardVirtualKey::A},
57 {
"b", KeyboardVirtualKey::B},
58 {
"c", KeyboardVirtualKey::C},
59 {
"d", KeyboardVirtualKey::D},
60 {
"e", KeyboardVirtualKey::E},
61 {
"f", KeyboardVirtualKey::F},
62 {
"g", KeyboardVirtualKey::G},
63 {
"h", KeyboardVirtualKey::H},
64 {
"i", KeyboardVirtualKey::I},
65 {
"j", KeyboardVirtualKey::J},
66 {
"k", KeyboardVirtualKey::K},
67 {
"l", KeyboardVirtualKey::L},
68 {
"m", KeyboardVirtualKey::M},
69 {
"n", KeyboardVirtualKey::N},
70 {
"o", KeyboardVirtualKey::O},
71 {
"p", KeyboardVirtualKey::P},
72 {
"q", KeyboardVirtualKey::Q},
73 {
"r", KeyboardVirtualKey::R},
74 {
"s", KeyboardVirtualKey::S},
75 {
"t", KeyboardVirtualKey::T},
76 {
"u", KeyboardVirtualKey::U},
77 {
"v", KeyboardVirtualKey::V},
78 {
"w", KeyboardVirtualKey::W},
79 {
"x", KeyboardVirtualKey::X},
80 {
"y", KeyboardVirtualKey::Y},
81 {
"z", KeyboardVirtualKey::Z},
82 {
"plus", KeyboardVirtualKey::Plus},
83 {
"-", KeyboardVirtualKey::Minus},
84 {
"*", KeyboardVirtualKey::Star},
85 {
"/", KeyboardVirtualKey::Slash},
86 {
"%", KeyboardVirtualKey::Percent},
87 {
"~", KeyboardVirtualKey::Tilde},
88 {
"&", KeyboardVirtualKey::Ampersant},
89 {
"|", KeyboardVirtualKey::Pipe},
90 {
"^", KeyboardVirtualKey::Caret},
91 {
"<", KeyboardVirtualKey::Less},
92 {
"=", KeyboardVirtualKey::Equal},
93 {
">", KeyboardVirtualKey::Greater},
94 {
"(", KeyboardVirtualKey::OpenParentheses},
95 {
")", KeyboardVirtualKey::CloseParentheses},
96 {
"[", KeyboardVirtualKey::OpenBracket},
97 {
"]", KeyboardVirtualKey::CloseBracket},
98 {
"{", KeyboardVirtualKey::OpenBrace},
99 {
"}", KeyboardVirtualKey::CloseBrace},
100 {
"backslash", KeyboardVirtualKey::Backslash},
101 {
".", KeyboardVirtualKey::Period},
102 {
",", KeyboardVirtualKey::Comma},
103 {
":", KeyboardVirtualKey::Colon},
104 {
";", KeyboardVirtualKey::SemiColon},
105 {
"!", KeyboardVirtualKey::Bang},
106 {
"?", KeyboardVirtualKey::Question},
107 {
"space", KeyboardVirtualKey::Space},
108 {
"tab", KeyboardVirtualKey::Tab},
109 {
"enter", KeyboardVirtualKey::Enter},
110 {
"`", KeyboardVirtualKey::Backtick},
111 {
"quote", KeyboardVirtualKey::Quote},
112 {
"dquote", KeyboardVirtualKey::DoubleQuote},
113 {
"@", KeyboardVirtualKey::At},
114 {
"#", KeyboardVirtualKey::Hash},
115 {
"$", KeyboardVirtualKey::Dollar},
116 {
"_", KeyboardVirtualKey::Underscore},
117 {
"left", KeyboardVirtualKey::Left},
118 {
"right", KeyboardVirtualKey::Right},
119 {
"up", KeyboardVirtualKey::Up},
120 {
"down", KeyboardVirtualKey::Down},
121 {
"pageup", KeyboardVirtualKey::PageUp},
122 {
"pagedown", KeyboardVirtualKey::PageDown},
123 {
"home", KeyboardVirtualKey::Home},
124 {
"end", KeyboardVirtualKey::End},
125 {
"backspace", KeyboardVirtualKey::Backspace},
126 {
"insert", KeyboardVirtualKey::Insert},
127 {
"delete", KeyboardVirtualKey::Delete},
128 {
"clear", KeyboardVirtualKey::Clear},
129 {
"escape", KeyboardVirtualKey::Escape},
130 {
"print", KeyboardVirtualKey::PrintScreen},
131 {
"pause", KeyboardVirtualKey::PauseBreak},
132 {
"f1", KeyboardVirtualKey::F1},
133 {
"f2", KeyboardVirtualKey::F2},
134 {
"f3", KeyboardVirtualKey::F3},
135 {
"f4", KeyboardVirtualKey::F4},
136 {
"f5", KeyboardVirtualKey::F5},
137 {
"f6", KeyboardVirtualKey::F6},
138 {
"f7", KeyboardVirtualKey::F7},
139 {
"f8", KeyboardVirtualKey::F8},
140 {
"f9", KeyboardVirtualKey::F9},
141 {
"f10", KeyboardVirtualKey::F10},
142 {
"f11", KeyboardVirtualKey::F11},
143 {
"f12", KeyboardVirtualKey::F12},
144 {
"f13", KeyboardVirtualKey::F13},
145 {
"f14", KeyboardVirtualKey::F14},
146 {
"f15", KeyboardVirtualKey::F15},
147 {
"f16", KeyboardVirtualKey::F16},
148 {
"f17", KeyboardVirtualKey::F17},
149 {
"f18", KeyboardVirtualKey::F18},
150 {
"f19", KeyboardVirtualKey::F19},
151 {
"f20", KeyboardVirtualKey::F20},
152 {
"f21", KeyboardVirtualKey::F21},
153 {
"f22", KeyboardVirtualKey::F22},
154 {
"f23", KeyboardVirtualKey::F23},
155 {
"f24", KeyboardVirtualKey::F24},
156 {
"media-next", KeyboardVirtualKey::MediaNextTrack},
157 {
"media-prev", KeyboardVirtualKey::MediaPrevTrack},
158 {
"media-stop", KeyboardVirtualKey::MediaStop},
159 {
"media-play", KeyboardVirtualKey::MediaPlayPause},
160 {
"browser-back", KeyboardVirtualKey::BrowserBack},
161 {
"browser-forward", KeyboardVirtualKey::BrowserForward},
162 {
"browser-refresh", KeyboardVirtualKey::BrowserRefresh},
163 {
"browser-stop", KeyboardVirtualKey::BrowserStop},
164 {
"browser-search", KeyboardVirtualKey::BrowserSearch},
165 {
"browser-favorites", KeyboardVirtualKey::BrowserFavorites},
166 {
"browser-home", KeyboardVirtualKey::BrowserHome},
167 {
"volume-mute", KeyboardVirtualKey::VolumeMute},
168 {
"volume-up", KeyboardVirtualKey::VolumeUp},
169 {
"volume-down", KeyboardVirtualKey::VolumeDown},
172inline KeyboardVirtualKey to_KeyboardVirtualKey(std::string_view s)
174 ttlet lower_s = to_lower(s);
175 ttlet i = string_to_KeyboardVirtualKey_table.find(lower_s);
176 if (i != string_to_KeyboardVirtualKey_table.cend()) {
179 TTAURI_THROW(parse_error(
"Could not find virtual key '{}'", s));
182KeyboardVirtualKey to_KeyboardVirtualKey(
int key_code,
bool extended, KeyboardModifiers modifiers);
185constexpr char const *to_const_string(KeyboardVirtualKey key)
noexcept
188 case KeyboardVirtualKey::_0:
return "0";
189 case KeyboardVirtualKey::_1:
return "1";
190 case KeyboardVirtualKey::_2:
return "2";
191 case KeyboardVirtualKey::_3:
return "3";
192 case KeyboardVirtualKey::_4:
return "4";
193 case KeyboardVirtualKey::_5:
return "5";
194 case KeyboardVirtualKey::_6:
return "6";
195 case KeyboardVirtualKey::_7:
return "7";
196 case KeyboardVirtualKey::_8:
return "8";
197 case KeyboardVirtualKey::_9:
return "9";
198 case KeyboardVirtualKey::A:
return "a";
199 case KeyboardVirtualKey::B:
return "b";
200 case KeyboardVirtualKey::C:
return "c";
201 case KeyboardVirtualKey::D:
return "d";
202 case KeyboardVirtualKey::E:
return "e";
203 case KeyboardVirtualKey::F:
return "f";
204 case KeyboardVirtualKey::G:
return "g";
205 case KeyboardVirtualKey::H:
return "h";
206 case KeyboardVirtualKey::I:
return "i";
207 case KeyboardVirtualKey::J:
return "j";
208 case KeyboardVirtualKey::K:
return "k";
209 case KeyboardVirtualKey::L:
return "l";
210 case KeyboardVirtualKey::M:
return "m";
211 case KeyboardVirtualKey::N:
return "n";
212 case KeyboardVirtualKey::O:
return "o";
213 case KeyboardVirtualKey::P:
return "p";
214 case KeyboardVirtualKey::Q:
return "q";
215 case KeyboardVirtualKey::R:
return "r";
216 case KeyboardVirtualKey::S:
return "s";
217 case KeyboardVirtualKey::T:
return "t";
218 case KeyboardVirtualKey::U:
return "u";
219 case KeyboardVirtualKey::V:
return "v";
220 case KeyboardVirtualKey::W:
return "w";
221 case KeyboardVirtualKey::X:
return "x";
222 case KeyboardVirtualKey::Y:
return "y";
223 case KeyboardVirtualKey::Z:
return "z";
224 case KeyboardVirtualKey::Plus:
return "plus";
225 case KeyboardVirtualKey::Minus:
return "-";
226 case KeyboardVirtualKey::Star:
return "*";
227 case KeyboardVirtualKey::Slash:
return "/";
228 case KeyboardVirtualKey::Percent:
return "%";
229 case KeyboardVirtualKey::Tilde:
return "~";
230 case KeyboardVirtualKey::Ampersant:
return "&";
231 case KeyboardVirtualKey::Pipe:
return "|";
232 case KeyboardVirtualKey::Caret:
return "^";
233 case KeyboardVirtualKey::Less:
return "<";
234 case KeyboardVirtualKey::Equal:
return "=";
235 case KeyboardVirtualKey::Greater:
return ">";
236 case KeyboardVirtualKey::OpenParentheses:
return "(";
237 case KeyboardVirtualKey::CloseParentheses:
return ")";
238 case KeyboardVirtualKey::OpenBracket:
return "[";
239 case KeyboardVirtualKey::CloseBracket:
return "]";
240 case KeyboardVirtualKey::OpenBrace:
return "{";
241 case KeyboardVirtualKey::CloseBrace:
return "}";
242 case KeyboardVirtualKey::Backslash:
return "backslash";
243 case KeyboardVirtualKey::Period:
return ".";
244 case KeyboardVirtualKey::Comma:
return ",";
245 case KeyboardVirtualKey::Colon:
return ":";
246 case KeyboardVirtualKey::SemiColon:
return ";";
247 case KeyboardVirtualKey::Bang:
return "!";
248 case KeyboardVirtualKey::Question:
return "?";
249 case KeyboardVirtualKey::Space:
return "space";
250 case KeyboardVirtualKey::Tab:
return "tab";
251 case KeyboardVirtualKey::Enter:
return "enter";
252 case KeyboardVirtualKey::Backtick:
return "`";
253 case KeyboardVirtualKey::Quote:
return "quote";
254 case KeyboardVirtualKey::DoubleQuote:
return "dquote";
255 case KeyboardVirtualKey::At:
return "@";
256 case KeyboardVirtualKey::Hash:
return "#";
257 case KeyboardVirtualKey::Dollar:
return "$";
258 case KeyboardVirtualKey::Underscore:
return "_";
259 case KeyboardVirtualKey::Left:
return "left";
260 case KeyboardVirtualKey::Right:
return "right";
261 case KeyboardVirtualKey::Up:
return "up";
262 case KeyboardVirtualKey::Down:
return "down";
263 case KeyboardVirtualKey::PageUp:
return "pageup";
264 case KeyboardVirtualKey::PageDown:
return "pagedown";
265 case KeyboardVirtualKey::Home:
return "home";
266 case KeyboardVirtualKey::End:
return "end";
267 case KeyboardVirtualKey::Backspace:
return "backspace";
268 case KeyboardVirtualKey::Insert:
return "insert";
269 case KeyboardVirtualKey::Delete:
return "delete";
270 case KeyboardVirtualKey::Clear:
return "clear";
271 case KeyboardVirtualKey::Escape:
return "escape";
272 case KeyboardVirtualKey::PrintScreen:
return "print";
273 case KeyboardVirtualKey::PauseBreak:
return "pause";
274 case KeyboardVirtualKey::F1:
return "f1";
275 case KeyboardVirtualKey::F2:
return "f2";
276 case KeyboardVirtualKey::F3:
return "f3";
277 case KeyboardVirtualKey::F4:
return "f4";
278 case KeyboardVirtualKey::F5:
return "f5";
279 case KeyboardVirtualKey::F6:
return "f6";
280 case KeyboardVirtualKey::F7:
return "f7";
281 case KeyboardVirtualKey::F8:
return "f8";
282 case KeyboardVirtualKey::F9:
return "f9";
283 case KeyboardVirtualKey::F10:
return "f10";
284 case KeyboardVirtualKey::F11:
return "f11";
285 case KeyboardVirtualKey::F12:
return "f12";
286 case KeyboardVirtualKey::F13:
return "f13";
287 case KeyboardVirtualKey::F14:
return "f14";
288 case KeyboardVirtualKey::F15:
return "f15";
289 case KeyboardVirtualKey::F16:
return "f16";
290 case KeyboardVirtualKey::F17:
return "f17";
291 case KeyboardVirtualKey::F18:
return "f18";
292 case KeyboardVirtualKey::F19:
return "f19";
293 case KeyboardVirtualKey::F20:
return "f20";
294 case KeyboardVirtualKey::F21:
return "f21";
295 case KeyboardVirtualKey::F22:
return "f22";
296 case KeyboardVirtualKey::F23:
return "f23";
297 case KeyboardVirtualKey::F24:
return "f24";
298 case KeyboardVirtualKey::MediaNextTrack:
return "media-next";
299 case KeyboardVirtualKey::MediaPrevTrack:
return "media-prev";
300 case KeyboardVirtualKey::MediaStop:
return "media-stop";
301 case KeyboardVirtualKey::MediaPlayPause:
return "media-play";
302 case KeyboardVirtualKey::BrowserBack:
return "browser-back";
303 case KeyboardVirtualKey::BrowserForward:
return "browser-forward";
304 case KeyboardVirtualKey::BrowserRefresh:
return "browser-refresh";
305 case KeyboardVirtualKey::BrowserStop:
return "browser-stop";
306 case KeyboardVirtualKey::BrowserSearch:
return "browser-search";
307 case KeyboardVirtualKey::BrowserFavorites:
return "browser-favourite";
308 case KeyboardVirtualKey::BrowserHome:
return "browser-home";
309 case KeyboardVirtualKey::VolumeMute:
return "volume-mute";
310 case KeyboardVirtualKey::VolumeUp:
return "volume-up";
311 case KeyboardVirtualKey::VolumeDown:
return "volume-down";
312 default: tt_no_default;
330struct hash<tt::KeyboardVirtualKey> {
331 [[nodiscard]]
size_t operator() (tt::KeyboardVirtualKey rhs)
const noexcept {