HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
keyboard_virtual_key.hpp
1// Copyright Take Vos 2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "keyboard_modifiers.hpp"
8#include "../required.hpp"
9#include "../exception.hpp"
10#include "../strings.hpp"
11#include <unordered_map>
12
13namespace hi::inline v1 {
14
15enum class keyboard_virtual_key : uint8_t {
16 Nul,
17
18 A,
19 B,
20 C,
21 D,
22 E,
23 F,
24 G,
25 H,
26 I,
27 J,
28 K,
29 L,
30 M,
31 N,
32 O,
33 P,
34 Q,
35 R,
36 S,
37 T,
38 U,
39 V,
40 W,
41 X,
42 Y,
43 Z,
44
45 _0,
46 _1,
47 _2,
48 _3,
49 _4,
50 _5,
51 _6,
52 _7,
53 _8,
54 _9,
55
56 Plus,
57 Minus,
58 Star,
59 Slash,
60 Percent,
61 Tilde,
62 Ampersant,
63 Pipe,
64 Caret,
65 Less,
66 Equal,
67 Greater,
68 OpenParentheses,
69 CloseParentheses,
70 OpenBracket,
71 CloseBracket,
72 OpenBrace,
73 CloseBrace,
74 Period,
75 Comma,
76 Colon,
77 SemiColon,
78 Bang,
79 Question,
80 Space,
81 Tab,
82 Enter,
83 Backtick,
84 Quote,
85 DoubleQuote,
86 At,
87 Hash,
88 Dollar,
89 Underscore,
90 Backslash,
91
92 Left,
93 Right,
94 Up,
95 Down,
96 PageUp,
97 PageDown,
98 Home,
99 End,
100 Backspace,
101 Insert,
102 Delete,
103 Clear,
104 Escape,
105
106 PrintScreen,
107 PauseBreak,
108 Menu,
109
110 F1,
111 F2,
112 F3,
113 F4,
114 F5,
115 F6,
116 F7,
117 F8,
118 F9,
119 F10,
120 F11,
121 F12,
122 F13,
123 F14,
124 F15,
125 F16,
126 F17,
127 F18,
128 F19,
129 F20,
130 F21,
131 F22,
132 F23,
133 F24,
134
135 BrowserBack,
136 BrowserForward,
137 BrowserRefresh,
138 BrowserStop,
139 BrowserSearch,
140 BrowserFavorites,
141 BrowserHome,
142 VolumeMute,
143 VolumeUp,
144 VolumeDown,
145 MediaNextTrack,
146 MediaPrevTrack,
147 MediaStop,
148 MediaPlayPause,
149};
150
151inline hilet string_to_keyboard_virtual_key_table = std::unordered_map<std::string, keyboard_virtual_key>{
152 {"0", keyboard_virtual_key::_0},
153 {"1", keyboard_virtual_key::_1},
154 {"2", keyboard_virtual_key::_2},
155 {"3", keyboard_virtual_key::_3},
156 {"4", keyboard_virtual_key::_4},
157 {"5", keyboard_virtual_key::_5},
158 {"6", keyboard_virtual_key::_6},
159 {"7", keyboard_virtual_key::_7},
160 {"8", keyboard_virtual_key::_8},
161 {"9", keyboard_virtual_key::_9},
162 {"a", keyboard_virtual_key::A},
163 {"b", keyboard_virtual_key::B},
164 {"c", keyboard_virtual_key::C},
165 {"d", keyboard_virtual_key::D},
166 {"e", keyboard_virtual_key::E},
167 {"f", keyboard_virtual_key::F},
168 {"g", keyboard_virtual_key::G},
169 {"h", keyboard_virtual_key::H},
170 {"i", keyboard_virtual_key::I},
171 {"j", keyboard_virtual_key::J},
172 {"k", keyboard_virtual_key::K},
173 {"l", keyboard_virtual_key::L},
174 {"m", keyboard_virtual_key::M},
175 {"n", keyboard_virtual_key::N},
176 {"o", keyboard_virtual_key::O},
177 {"p", keyboard_virtual_key::P},
178 {"q", keyboard_virtual_key::Q},
179 {"r", keyboard_virtual_key::R},
180 {"s", keyboard_virtual_key::S},
181 {"t", keyboard_virtual_key::T},
182 {"u", keyboard_virtual_key::U},
183 {"v", keyboard_virtual_key::V},
184 {"w", keyboard_virtual_key::W},
185 {"x", keyboard_virtual_key::X},
186 {"y", keyboard_virtual_key::Y},
187 {"z", keyboard_virtual_key::Z},
188 {"plus", keyboard_virtual_key::Plus},
189 {"-", keyboard_virtual_key::Minus},
190 {"*", keyboard_virtual_key::Star},
191 {"/", keyboard_virtual_key::Slash},
192 {"%", keyboard_virtual_key::Percent},
193 {"~", keyboard_virtual_key::Tilde},
194 {"&", keyboard_virtual_key::Ampersant},
195 {"|", keyboard_virtual_key::Pipe},
196 {"^", keyboard_virtual_key::Caret},
197 {"<", keyboard_virtual_key::Less},
198 {"=", keyboard_virtual_key::Equal},
199 {">", keyboard_virtual_key::Greater},
200 {"(", keyboard_virtual_key::OpenParentheses},
201 {")", keyboard_virtual_key::CloseParentheses},
202 {"[", keyboard_virtual_key::OpenBracket},
203 {"]", keyboard_virtual_key::CloseBracket},
204 {"{", keyboard_virtual_key::OpenBrace},
205 {"}", keyboard_virtual_key::CloseBrace},
206 {"backslash", keyboard_virtual_key::Backslash},
207 {".", keyboard_virtual_key::Period},
208 {",", keyboard_virtual_key::Comma},
209 {":", keyboard_virtual_key::Colon},
210 {";", keyboard_virtual_key::SemiColon},
211 {"!", keyboard_virtual_key::Bang},
212 {"?", keyboard_virtual_key::Question},
213 {"space", keyboard_virtual_key::Space},
214 {"tab", keyboard_virtual_key::Tab},
215 {"enter", keyboard_virtual_key::Enter},
216 {"`", keyboard_virtual_key::Backtick},
217 {"quote", keyboard_virtual_key::Quote},
218 {"dquote", keyboard_virtual_key::DoubleQuote},
219 {"@", keyboard_virtual_key::At},
220 {"#", keyboard_virtual_key::Hash},
221 {"$", keyboard_virtual_key::Dollar},
222 {"_", keyboard_virtual_key::Underscore},
223 {"left", keyboard_virtual_key::Left},
224 {"right", keyboard_virtual_key::Right},
225 {"up", keyboard_virtual_key::Up},
226 {"down", keyboard_virtual_key::Down},
227 {"pageup", keyboard_virtual_key::PageUp},
228 {"pagedown", keyboard_virtual_key::PageDown},
229 {"home", keyboard_virtual_key::Home},
230 {"end", keyboard_virtual_key::End},
231 {"backspace", keyboard_virtual_key::Backspace},
232 {"insert", keyboard_virtual_key::Insert},
233 {"delete", keyboard_virtual_key::Delete},
234 {"clear", keyboard_virtual_key::Clear},
235 {"escape", keyboard_virtual_key::Escape},
236 {"print", keyboard_virtual_key::PrintScreen},
237 {"pause", keyboard_virtual_key::PauseBreak},
238 {"menu", keyboard_virtual_key::Menu},
239 {"f1", keyboard_virtual_key::F1},
240 {"f2", keyboard_virtual_key::F2},
241 {"f3", keyboard_virtual_key::F3},
242 {"f4", keyboard_virtual_key::F4},
243 {"f5", keyboard_virtual_key::F5},
244 {"f6", keyboard_virtual_key::F6},
245 {"f7", keyboard_virtual_key::F7},
246 {"f8", keyboard_virtual_key::F8},
247 {"f9", keyboard_virtual_key::F9},
248 {"f10", keyboard_virtual_key::F10},
249 {"f11", keyboard_virtual_key::F11},
250 {"f12", keyboard_virtual_key::F12},
251 {"f13", keyboard_virtual_key::F13},
252 {"f14", keyboard_virtual_key::F14},
253 {"f15", keyboard_virtual_key::F15},
254 {"f16", keyboard_virtual_key::F16},
255 {"f17", keyboard_virtual_key::F17},
256 {"f18", keyboard_virtual_key::F18},
257 {"f19", keyboard_virtual_key::F19},
258 {"f20", keyboard_virtual_key::F20},
259 {"f21", keyboard_virtual_key::F21},
260 {"f22", keyboard_virtual_key::F22},
261 {"f23", keyboard_virtual_key::F23},
262 {"f24", keyboard_virtual_key::F24},
263 {"media-next", keyboard_virtual_key::MediaNextTrack},
264 {"media-prev", keyboard_virtual_key::MediaPrevTrack},
265 {"media-stop", keyboard_virtual_key::MediaStop},
266 {"media-play", keyboard_virtual_key::MediaPlayPause},
267 {"browser-back", keyboard_virtual_key::BrowserBack},
268 {"browser-forward", keyboard_virtual_key::BrowserForward},
269 {"browser-refresh", keyboard_virtual_key::BrowserRefresh},
270 {"browser-stop", keyboard_virtual_key::BrowserStop},
271 {"browser-search", keyboard_virtual_key::BrowserSearch},
272 {"browser-favorites", keyboard_virtual_key::BrowserFavorites},
273 {"browser-home", keyboard_virtual_key::BrowserHome},
274 {"volume-mute", keyboard_virtual_key::VolumeMute},
275 {"volume-up", keyboard_virtual_key::VolumeUp},
276 {"volume-down", keyboard_virtual_key::VolumeDown},
277};
278
279inline keyboard_virtual_key to_keyboard_virtual_key(std::string_view s)
280{
281 hilet lower_s = to_lower(s);
282 hilet i = string_to_keyboard_virtual_key_table.find(lower_s);
283 if (i != string_to_keyboard_virtual_key_table.cend()) {
284 return i->second;
285 }
286 throw parse_error(std::format("Could not find virtual key '{}'", s));
287}
288
289keyboard_virtual_key to_keyboard_virtual_key(int key_code, bool extended, keyboard_modifiers modifiers);
290
291constexpr char const *to_const_string(keyboard_virtual_key key) noexcept
292{
293 switch (key) {
294 case keyboard_virtual_key::_0: return "0";
295 case keyboard_virtual_key::_1: return "1";
296 case keyboard_virtual_key::_2: return "2";
297 case keyboard_virtual_key::_3: return "3";
298 case keyboard_virtual_key::_4: return "4";
299 case keyboard_virtual_key::_5: return "5";
300 case keyboard_virtual_key::_6: return "6";
301 case keyboard_virtual_key::_7: return "7";
302 case keyboard_virtual_key::_8: return "8";
303 case keyboard_virtual_key::_9: return "9";
304 case keyboard_virtual_key::A: return "a";
305 case keyboard_virtual_key::B: return "b";
306 case keyboard_virtual_key::C: return "c";
307 case keyboard_virtual_key::D: return "d";
308 case keyboard_virtual_key::E: return "e";
309 case keyboard_virtual_key::F: return "f";
310 case keyboard_virtual_key::G: return "g";
311 case keyboard_virtual_key::H: return "h";
312 case keyboard_virtual_key::I: return "i";
313 case keyboard_virtual_key::J: return "j";
314 case keyboard_virtual_key::K: return "k";
315 case keyboard_virtual_key::L: return "l";
316 case keyboard_virtual_key::M: return "m";
317 case keyboard_virtual_key::N: return "n";
318 case keyboard_virtual_key::O: return "o";
319 case keyboard_virtual_key::P: return "p";
320 case keyboard_virtual_key::Q: return "q";
321 case keyboard_virtual_key::R: return "r";
322 case keyboard_virtual_key::S: return "s";
323 case keyboard_virtual_key::T: return "t";
324 case keyboard_virtual_key::U: return "u";
325 case keyboard_virtual_key::V: return "v";
326 case keyboard_virtual_key::W: return "w";
327 case keyboard_virtual_key::X: return "x";
328 case keyboard_virtual_key::Y: return "y";
329 case keyboard_virtual_key::Z: return "z";
330 case keyboard_virtual_key::Plus: return "plus";
331 case keyboard_virtual_key::Minus: return "-";
332 case keyboard_virtual_key::Star: return "*";
333 case keyboard_virtual_key::Slash: return "/";
334 case keyboard_virtual_key::Percent: return "%";
335 case keyboard_virtual_key::Tilde: return "~";
336 case keyboard_virtual_key::Ampersant: return "&";
337 case keyboard_virtual_key::Pipe: return "|";
338 case keyboard_virtual_key::Caret: return "^";
339 case keyboard_virtual_key::Less: return "<";
340 case keyboard_virtual_key::Equal: return "=";
341 case keyboard_virtual_key::Greater: return ">";
342 case keyboard_virtual_key::OpenParentheses: return "(";
343 case keyboard_virtual_key::CloseParentheses: return ")";
344 case keyboard_virtual_key::OpenBracket: return "[";
345 case keyboard_virtual_key::CloseBracket: return "]";
346 case keyboard_virtual_key::OpenBrace: return "{";
347 case keyboard_virtual_key::CloseBrace: return "}";
348 case keyboard_virtual_key::Backslash: return "backslash";
349 case keyboard_virtual_key::Period: return ".";
350 case keyboard_virtual_key::Comma: return ",";
351 case keyboard_virtual_key::Colon: return ":";
352 case keyboard_virtual_key::SemiColon: return ";";
353 case keyboard_virtual_key::Bang: return "!";
354 case keyboard_virtual_key::Question: return "?";
355 case keyboard_virtual_key::Space: return "space";
356 case keyboard_virtual_key::Tab: return "tab";
357 case keyboard_virtual_key::Enter: return "enter";
358 case keyboard_virtual_key::Backtick: return "`";
359 case keyboard_virtual_key::Quote: return "quote";
360 case keyboard_virtual_key::DoubleQuote: return "dquote";
361 case keyboard_virtual_key::At: return "@";
362 case keyboard_virtual_key::Hash: return "#";
363 case keyboard_virtual_key::Dollar: return "$";
364 case keyboard_virtual_key::Underscore: return "_";
365 case keyboard_virtual_key::Left: return "left";
366 case keyboard_virtual_key::Right: return "right";
367 case keyboard_virtual_key::Up: return "up";
368 case keyboard_virtual_key::Down: return "down";
369 case keyboard_virtual_key::PageUp: return "pageup";
370 case keyboard_virtual_key::PageDown: return "pagedown";
371 case keyboard_virtual_key::Home: return "home";
372 case keyboard_virtual_key::End: return "end";
373 case keyboard_virtual_key::Backspace: return "backspace";
374 case keyboard_virtual_key::Insert: return "insert";
375 case keyboard_virtual_key::Delete: return "delete";
376 case keyboard_virtual_key::Clear: return "clear";
377 case keyboard_virtual_key::Escape: return "escape";
378 case keyboard_virtual_key::PrintScreen: return "print";
379 case keyboard_virtual_key::PauseBreak: return "pause";
380 case keyboard_virtual_key::Menu: return "menu";
381 case keyboard_virtual_key::F1: return "f1";
382 case keyboard_virtual_key::F2: return "f2";
383 case keyboard_virtual_key::F3: return "f3";
384 case keyboard_virtual_key::F4: return "f4";
385 case keyboard_virtual_key::F5: return "f5";
386 case keyboard_virtual_key::F6: return "f6";
387 case keyboard_virtual_key::F7: return "f7";
388 case keyboard_virtual_key::F8: return "f8";
389 case keyboard_virtual_key::F9: return "f9";
390 case keyboard_virtual_key::F10: return "f10";
391 case keyboard_virtual_key::F11: return "f11";
392 case keyboard_virtual_key::F12: return "f12";
393 case keyboard_virtual_key::F13: return "f13";
394 case keyboard_virtual_key::F14: return "f14";
395 case keyboard_virtual_key::F15: return "f15";
396 case keyboard_virtual_key::F16: return "f16";
397 case keyboard_virtual_key::F17: return "f17";
398 case keyboard_virtual_key::F18: return "f18";
399 case keyboard_virtual_key::F19: return "f19";
400 case keyboard_virtual_key::F20: return "f20";
401 case keyboard_virtual_key::F21: return "f21";
402 case keyboard_virtual_key::F22: return "f22";
403 case keyboard_virtual_key::F23: return "f23";
404 case keyboard_virtual_key::F24: return "f24";
405 case keyboard_virtual_key::MediaNextTrack: return "media-next";
406 case keyboard_virtual_key::MediaPrevTrack: return "media-prev";
407 case keyboard_virtual_key::MediaStop: return "media-stop";
408 case keyboard_virtual_key::MediaPlayPause: return "media-play";
409 case keyboard_virtual_key::BrowserBack: return "browser-back";
410 case keyboard_virtual_key::BrowserForward: return "browser-forward";
411 case keyboard_virtual_key::BrowserRefresh: return "browser-refresh";
412 case keyboard_virtual_key::BrowserStop: return "browser-stop";
413 case keyboard_virtual_key::BrowserSearch: return "browser-search";
414 case keyboard_virtual_key::BrowserFavorites: return "browser-favourite";
415 case keyboard_virtual_key::BrowserHome: return "browser-home";
416 case keyboard_virtual_key::VolumeMute: return "volume-mute";
417 case keyboard_virtual_key::VolumeUp: return "volume-up";
418 case keyboard_virtual_key::VolumeDown: return "volume-down";
419 default: hi_no_default();
420 }
421}
422
423inline std::string to_string(keyboard_virtual_key key) noexcept
424{
425 return std::string{to_const_string(key)};
426}
427
428inline std::ostream &operator<<(std::ostream &lhs, keyboard_virtual_key const &rhs)
429{
430 return lhs << to_string(rhs);
431}
432
433} // namespace hi::inline v1
434
435template<>
436struct std::hash<hi::keyboard_virtual_key> {
437 [[nodiscard]] std::size_t operator()(hi::keyboard_virtual_key rhs) const noexcept
438 {
439 return std::hash<uint8_t>{}(static_cast<uint8_t>(rhs));
440 }
441};
442
443template<typename CharT>
444struct std::formatter<hi::keyboard_virtual_key, CharT> : std::formatter<char const *, CharT> {
445 auto format(hi::keyboard_virtual_key const &t, auto &fc)
446 {
447 return std::formatter<char const *, CharT>::format(hi::to_const_string(t), fc);
448 }
449};
This file includes required definitions.
#define hilet
Invariant should be the default for variables.
Definition required.hpp:23
T operator()(T... args)
T to_string(T... args)