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