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