7#include "keyboard_modifiers.hpp"
8#include "../required.hpp"
9#include "../exception.hpp"
10#include "../strings.hpp"
11#include <unordered_map>
15enum class keyboard_virtual_key : uint8_t {
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,
21 _0, _1, _2, _3, _4, _5, _6, _7, _8, _9,
23 Plus, Minus, Star, Slash, Percent,
24 Tilde, Ampersant, Pipe, Caret,
26 OpenParentheses, CloseParentheses, OpenBracket, CloseBracket, OpenBrace, CloseBrace,
27 Period, Comma, Colon, SemiColon, Bang, Question,
29 Backtick, Quote, DoubleQuote,
30 At, Hash, Dollar, Underscore, Backslash,
32 Left, Right, Up, Down, PageUp, PageDown, Home, End,
33 Backspace, Insert, Delete, Clear, Escape,
35 PrintScreen, PauseBreak,
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,
40 BrowserBack, BrowserForward, BrowserRefresh, BrowserStop,
41 BrowserSearch, BrowserFavorites, BrowserHome,
42 VolumeMute, VolumeUp, VolumeDown,
43 MediaNextTrack, MediaPrevTrack, MediaStop, MediaPlayPause,
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},
173inline keyboard_virtual_key to_keyboard_virtual_key(std::string_view s)
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()) {
180 throw parse_error(
"Could not find virtual key '{}'", s);
183keyboard_virtual_key to_keyboard_virtual_key(
int key_code,
bool extended, keyboard_modifiers modifiers);
186constexpr char const *to_const_string(keyboard_virtual_key key)
noexcept
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();
331struct hash<tt::keyboard_virtual_key> {
332 [[nodiscard]]
size_t operator() (tt::keyboard_virtual_key rhs)
const noexcept {
341template<
typename CharT>
342struct std::formatter<tt::keyboard_virtual_key, CharT> : std::formatter<char const *, CharT> {
343 auto format(tt::keyboard_virtual_key
const &t,
auto &fc)
345 return std::formatter<char const *, CharT>::format(tt::to_const_string(t), fc);