HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
KeyboardVirtualKey.hpp
1// Copyright 2020 Pokitec
2// All rights reserved.
3
4#pragma once
5
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>
11
12namespace tt {
13
14enum class KeyboardVirtualKey : uint8_t {
15 Nul,
16
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,
19
20 _0, _1, _2, _3, _4, _5, _6, _7, _8, _9,
21
22 Plus, Minus, Star, Slash, Percent,
23 Tilde, Ampersant, Pipe, Caret,
24 Less, Equal, Greater,
25 OpenParentheses, CloseParentheses, OpenBracket, CloseBracket, OpenBrace, CloseBrace,
26 Period, Comma, Colon, SemiColon, Bang, Question,
27 Space, Tab, Enter,
28 Backtick, Quote, DoubleQuote,
29 At, Hash, Dollar, Underscore, Backslash,
30
31 Left, Right, Up, Down, PageUp, PageDown, Home, End,
32 Backspace, Insert, Delete, Clear, Escape,
33
34 PrintScreen, PauseBreak,
35
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,
38
39 BrowserBack, BrowserForward, BrowserRefresh, BrowserStop,
40 BrowserSearch, BrowserFavorites, BrowserHome,
41 VolumeMute, VolumeUp, VolumeDown,
42 MediaNextTrack, MediaPrevTrack, MediaStop, MediaPlayPause,
43};
44
45inline ttlet string_to_KeyboardVirtualKey_table = std::unordered_map<std::string,KeyboardVirtualKey>{
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},
170};
171
172inline KeyboardVirtualKey to_KeyboardVirtualKey(std::string_view s)
173{
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()) {
177 return i->second;
178 }
179 TTAURI_THROW(parse_error("Could not find virtual key '{}'", s));
180}
181
182KeyboardVirtualKey to_KeyboardVirtualKey(int key_code, bool extended, KeyboardModifiers modifiers);
183
184
185constexpr char const *to_const_string(KeyboardVirtualKey key) noexcept
186{
187 switch (key) {
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;
313 }
314}
315
316inline std::string to_string(KeyboardVirtualKey key) noexcept
317{
318 return std::string{to_const_string(key)};
319}
320
321inline std::ostream &operator<<(std::ostream &lhs, KeyboardVirtualKey const &rhs) {
322 return lhs << to_string(rhs);
323}
324
325}
326
327namespace std {
328
329template<>
330struct hash<tt::KeyboardVirtualKey> {
331 [[nodiscard]] size_t operator() (tt::KeyboardVirtualKey rhs) const noexcept {
332 return std::hash<uint8_t>{}(static_cast<uint8_t>(rhs));
333 }
334};
335
336}
STL namespace.
T operator()(T... args)
T to_string(T... args)