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 "../enum_metadata.hpp"
12#include <unordered_map>
13
14namespace hi::inline v1 {
15
16enum class keyboard_virtual_key : uint8_t {
17 nul = 0,
18
19 A = 'a',
20 B = 'b',
21 C = 'c',
22 D = 'd',
23 E = 'e',
24 F = 'f',
25 G = 'g',
26 H = 'h',
27 I = 'i',
28 J = 'j',
29 K = 'k',
30 L = 'l',
31 M = 'm',
32 N = 'n',
33 O = 'o',
34 P = 'p',
35 Q = 'q',
36 R = 'r',
37 S = 's',
38 T = 't',
39 U = 'u',
40 V = 'v',
41 W = 'w',
42 X = 'x',
43 Y = 'y',
44 Z = 'z',
45
46 _0 = '0',
47 _1 = '1',
48 _2 = '2',
49 _3 = '3',
50 _4 = '4',
51 _5 = '5',
52 _6 = '6',
53 _7 = '7',
54 _8 = '8',
55 _9 = '9',
56
57 plus = '+',
58 minus = '-',
59 star = '*',
60 slash = '/',
61 percent = '%',
62 tilde = '~',
63 ampersant = '&',
64 pipe = '|',
65 caret = '^',
66 less = '<',
67 equal = '=',
68 greater = '>',
69 open_parentheses = '(',
70 close_parentheses = ')',
71 open_bracket = '[',
72 close_bracket = ']',
73 open_brace = '{',
74 close_brace = '}',
75 period = '.',
76 comma = ',',
77 colon = ':',
78 semi_colon = ';',
79 bang = '!',
80 question = '?',
81 space = ' ',
82 tab = '\t',
83 enter = '\n',
84 backtick = '`',
85 quote = '\'',
86 double_quote = '"',
87 at = '@',
88 hash = '#',
89 dollar = '$',
90 underscore = '_',
91 backslash = '\\',
92
93 F1 = 'A',
94 F2 = 'B',
95 F3 = 'C',
96 F4 = 'D',
97 F5 = 'E',
98 F6 = 'F',
99 F7 = 'G',
100 F8 = 'H',
101 F9 = 'I',
102 F10 = 'J',
103 F11 = 'K',
104 F12 = 'L',
105 F13 = 'M',
106 F14 = 'N',
107 F15 = 'O',
108 F16 = 'P',
109 F17 = 'Q',
110 F18 = 'R',
111 F19 = 'S',
112 F20 = 'T',
113 F21 = 'U',
114 F22 = 'V',
115 F23 = 'W',
116 F24 = 'X',
117
118 home = 0x02, // ASCII start-of-text
119 end = 0x03, // ASCII end-of-text
120 backspace = 0x08, // ASCII backspace
121 clear = 0x0c, // ASCII form-feed
122 insert = 0x1a, // ASCII substitute
123 escape = 0x1b, // ASCII escape
124 _delete = 0x7f, // ASCII delete
125
126 left = 0x80,
127 right,
128 up,
129 down,
130 page_up,
131 page_down,
132
133 menu,
134 print_screen,
135 pause_break,
136 sysmenu,
137
138 media_next_track,
139 media_prev_track,
140 media_stop,
141 media_play_pause,
142
143 volume_mute,
144 volume_up,
145 volume_down,
146
147 browser_back,
148 browser_forward,
149 browser_home,
150 browser_refresh,
151 browser_stop,
152 browser_search,
153 browser_favorites,
154};
155
156// clang-format off
157constexpr auto keyboard_virtual_key_metadata = enum_metadata{
158 keyboard_virtual_key::nul, "nul",
159 keyboard_virtual_key::A, "a",
160 keyboard_virtual_key::B, "b",
161 keyboard_virtual_key::C, "c",
162 keyboard_virtual_key::D, "d",
163 keyboard_virtual_key::E, "e",
164 keyboard_virtual_key::F, "f",
165 keyboard_virtual_key::G, "g",
166 keyboard_virtual_key::H, "h",
167 keyboard_virtual_key::I, "i",
168 keyboard_virtual_key::J, "j",
169 keyboard_virtual_key::K, "k",
170 keyboard_virtual_key::L, "l",
171 keyboard_virtual_key::M, "m",
172 keyboard_virtual_key::N, "n",
173 keyboard_virtual_key::O, "o",
174 keyboard_virtual_key::P, "p",
175 keyboard_virtual_key::Q, "q",
176 keyboard_virtual_key::R, "r",
177 keyboard_virtual_key::S, "s",
178 keyboard_virtual_key::T, "t",
179 keyboard_virtual_key::U, "u",
180 keyboard_virtual_key::V, "v",
181 keyboard_virtual_key::W, "w",
182 keyboard_virtual_key::X, "x",
183 keyboard_virtual_key::Y, "y",
184 keyboard_virtual_key::Z, "z",
185 keyboard_virtual_key::_0, "0",
186 keyboard_virtual_key::_1, "1",
187 keyboard_virtual_key::_2, "2",
188 keyboard_virtual_key::_3, "3",
189 keyboard_virtual_key::_4, "4",
190 keyboard_virtual_key::_5, "5",
191 keyboard_virtual_key::_6, "6",
192 keyboard_virtual_key::_7, "7",
193 keyboard_virtual_key::_8, "8",
194 keyboard_virtual_key::_9, "9",
195 keyboard_virtual_key::plus, "plus",
196 keyboard_virtual_key::minus, "-",
197 keyboard_virtual_key::star, "*",
198 keyboard_virtual_key::slash, "/",
199 keyboard_virtual_key::percent, "%",
200 keyboard_virtual_key::tilde, "~",
201 keyboard_virtual_key::ampersant, "&",
202 keyboard_virtual_key::pipe, "|",
203 keyboard_virtual_key::caret, "^",
204 keyboard_virtual_key::less, "<",
205 keyboard_virtual_key::equal, "=",
206 keyboard_virtual_key::greater, ">",
207 keyboard_virtual_key::open_parentheses, "(",
208 keyboard_virtual_key::close_parentheses, ")",
209 keyboard_virtual_key::open_bracket, "[",
210 keyboard_virtual_key::close_bracket, "]",
211 keyboard_virtual_key::open_brace, "{",
212 keyboard_virtual_key::close_brace, "}",
213 keyboard_virtual_key::period, ".",
214 keyboard_virtual_key::comma, ",",
215 keyboard_virtual_key::colon, ":",
216 keyboard_virtual_key::semi_colon, ";",
217 keyboard_virtual_key::bang, "!",
218 keyboard_virtual_key::question, "?",
219 keyboard_virtual_key::space, "space",
220 keyboard_virtual_key::tab, "tab",
221 keyboard_virtual_key::enter, "enter",
222 keyboard_virtual_key::backtick, "`",
223 keyboard_virtual_key::quote, "quote",
224 keyboard_virtual_key::double_quote, "dquote",
225 keyboard_virtual_key::at, "@",
226 keyboard_virtual_key::hash, "#",
227 keyboard_virtual_key::dollar, "$",
228 keyboard_virtual_key::underscore, "_",
229 keyboard_virtual_key::backslash, "backslash",
230 keyboard_virtual_key::F1, "f1",
231 keyboard_virtual_key::F2, "f2",
232 keyboard_virtual_key::F3, "f3",
233 keyboard_virtual_key::F4, "f4",
234 keyboard_virtual_key::F5, "f5",
235 keyboard_virtual_key::F6, "f6",
236 keyboard_virtual_key::F7, "f7",
237 keyboard_virtual_key::F8, "f8",
238 keyboard_virtual_key::F9, "f9",
239 keyboard_virtual_key::F10, "f10",
240 keyboard_virtual_key::F11, "f11",
241 keyboard_virtual_key::F12, "f12",
242 keyboard_virtual_key::F13, "f13",
243 keyboard_virtual_key::F14, "f14",
244 keyboard_virtual_key::F15, "f15",
245 keyboard_virtual_key::F16, "f16",
246 keyboard_virtual_key::F17, "f17",
247 keyboard_virtual_key::F18, "f18",
248 keyboard_virtual_key::F19, "f19",
249 keyboard_virtual_key::F20, "f20",
250 keyboard_virtual_key::F21, "f21",
251 keyboard_virtual_key::F22, "f22",
252 keyboard_virtual_key::F23, "f23",
253 keyboard_virtual_key::F24, "f24",
254 keyboard_virtual_key::home, "home",
255 keyboard_virtual_key::end, "end",
256 keyboard_virtual_key::backspace, "backspace",
257 keyboard_virtual_key::clear, "clear",
258 keyboard_virtual_key::insert, "insert",
259 keyboard_virtual_key::escape, "escape",
260 keyboard_virtual_key::_delete, "delete",
261 keyboard_virtual_key::left, "left",
262 keyboard_virtual_key::right, "right",
263 keyboard_virtual_key::up, "up",
264 keyboard_virtual_key::down, "down",
265 keyboard_virtual_key::page_up, "page-up",
266 keyboard_virtual_key::page_down, "page-down",
267 keyboard_virtual_key::menu, "menu",
268 keyboard_virtual_key::sysmenu, "sysmenu",
269 keyboard_virtual_key::print_screen, "print-screen",
270 keyboard_virtual_key::pause_break, "pause-break",
271 keyboard_virtual_key::media_next_track, "media-next",
272 keyboard_virtual_key::media_prev_track, "media-prev",
273 keyboard_virtual_key::media_stop, "media-stop",
274 keyboard_virtual_key::media_play_pause, "media-play",
275 keyboard_virtual_key::volume_mute, "volume-mute",
276 keyboard_virtual_key::volume_up, "volume-up",
277 keyboard_virtual_key::volume_down, "volume-down",
278 keyboard_virtual_key::browser_back, "browser-back",
279 keyboard_virtual_key::browser_forward, "browser-forward",
280 keyboard_virtual_key::browser_home, "browser-home",
281 keyboard_virtual_key::browser_refresh, "browser-refresh",
282 keyboard_virtual_key::browser_stop, "browser-stop",
283 keyboard_virtual_key::browser_search, "browser-search",
284 keyboard_virtual_key::browser_favorites, "browser-favorites"
285};
286// clang-format on
287
288constexpr keyboard_virtual_key to_keyboard_virtual_key(std::string_view s)
289{
290 return keyboard_virtual_key_metadata[s];
291}
292
293keyboard_virtual_key to_keyboard_virtual_key(int key_code, bool extended, keyboard_modifiers modifiers);
294
295constexpr std::string_view to_string_view(keyboard_virtual_key key) noexcept
296{
297 return keyboard_virtual_key_metadata[key];
298}
299
300inline std::string to_string(keyboard_virtual_key key) noexcept
301{
302 return std::string{to_string_view(key)};
303}
304
305inline std::ostream& operator<<(std::ostream& lhs, keyboard_virtual_key const& rhs)
306{
307 return lhs << to_string_view(rhs);
308}
309
310} // namespace hi::inline v1
311
312template<>
313struct std::hash<hi::keyboard_virtual_key> {
314 [[nodiscard]] std::size_t operator()(hi::keyboard_virtual_key rhs) const noexcept
315 {
316 return std::hash<uint8_t>{}(static_cast<uint8_t>(rhs));
317 }
318};
319
320template<typename CharT>
321struct std::formatter<hi::keyboard_virtual_key, CharT> : std::formatter<std::string_view, CharT> {
322 auto format(hi::keyboard_virtual_key const& t, auto& fc)
323 {
324 return std::formatter<std::string_view, CharT>{}.format(hi::to_string_view(t), fc);
325 }
326};
This file includes required definitions.
T end(T... args)
T equal(T... args)
T left(T... args)
T operator()(T... args)
Definition datum.hpp:2458
T to_string(T... args)