Euphoria
key.cc
Go to the documentation of this file.
1 // Euphoria - Copyright (c) Gustav
2 
3 #include "core/key.h"
4 
5 
6 #include <map>
7 
8 #include "base/stringutils.h"
9 
10 namespace eu::core
11 {
12  namespace
13  {
14  template <typename T>
15  struct KeyNamer
16  {
17  KeyNamer(T unbound, T invalid)
20  {
21  add(invalid_key, "<invalid>");
22  add(unbound_key, "<unbound>");
23  }
24 
25  KeyNamer&
26  add(T key, const std::string& name)
27  {
28  string_to_key.insert(std::make_pair(to_lower(name), key));
29  key_to_string.insert(std::make_pair(key, name));
30 
31  return *this;
32  }
33 
34  [[nodiscard]] std::string
35  from_key_to_string(T key) const
36  {
37  auto r = key_to_string.find(key);
38  if(r == key_to_string.end())
39  {
40  return "Unknown";
41  }
42  else
43  {
44  return r->second;
45  }
46  }
47 
48  [[nodiscard]] T
49  from_string_to_key(const std::string& name) const
50  {
51  if(name.empty())
52  {
53  return unbound_key;
54  }
55  auto r = string_to_key.find(to_lower(name));
56  if(r == string_to_key.end())
57  {
58  return invalid_key;
59  }
60  else
61  {
62  return r->second;
63  }
64  }
65 
66  std::map<std::string, T> string_to_key;
67  std::map<T, std::string> key_to_string;
68  const T invalid_key;
69  const T unbound_key;
70  };
71 
72  const KeyNamer<Key>&
73  all_keys()
74  {
75  static const KeyNamer<Key> keys =
76  KeyNamer<Key>{Key::unbound, Key::invalid}
77  .add(Key::return_key, "Return")
78  .add(Key::escape, "Escape")
79  .add(Key::backspace, "Backspace")
80  .add(Key::tab, "Tab")
81  .add(Key::space, "Space")
82  .add(Key::exclaim, "Exclaim")
83  .add(Key::quotedbl, "Quotedbl")
84  .add(Key::hash, "Hash")
85  .add(Key::percent, "Percent")
86  .add(Key::dollar, "Dollar")
87  .add(Key::ampersand, "Ampersand")
88  .add(Key::quote, "Quote")
89  .add(Key::left_paren, "Leftparen")
90  .add(Key::right_paren, "Rightparen")
91  .add(Key::asterix, "Asterisk")
92  .add(Key::plus, "Plus")
93  .add(Key::comma, "Comma")
94  .add(Key::minus, "Minus")
95  .add(Key::period, "Period")
96  .add(Key::slash, "Slash")
97  .add(Key::num_0, "Num0")
98  .add(Key::num_1, "Num1")
99  .add(Key::num_2, "Num2")
100  .add(Key::num_3, "Num3")
101  .add(Key::num_4, "Num4")
102  .add(Key::num_5, "Num5")
103  .add(Key::num_6, "Num6")
104  .add(Key::num_7, "Num7")
105  .add(Key::num_8, "Num8")
106  .add(Key::num_9, "Num9")
107  .add(Key::colon, "Colon")
108  .add(Key::semicolon, "Semicolon")
109  .add(Key::less, "Less")
110  .add(Key::equals, "Equals")
111  .add(Key::greater, "Greater")
112  .add(Key::question, "Question")
113  .add(Key::at, "At")
114  .add(Key::left_bracket, "Leftbracket")
115  .add(Key::backslash, "Backslash")
116  .add(Key::right_bracket, "Rightbracket")
117  .add(Key::caret, "Caret")
118  .add(Key::underscore, "Underscore")
119  .add(Key::backquote, "Backquote")
120  .add(Key::a, "A")
121  .add(Key::b, "B")
122  .add(Key::c, "C")
123  .add(Key::d, "D")
124  .add(Key::e, "E")
125  .add(Key::f, "F")
126  .add(Key::g, "G")
127  .add(Key::h, "H")
128  .add(Key::i, "I")
129  .add(Key::j, "J")
130  .add(Key::k, "K")
131  .add(Key::l, "L")
132  .add(Key::m, "M")
133  .add(Key::n, "N")
134  .add(Key::o, "O")
135  .add(Key::p, "P")
136  .add(Key::q, "Q")
137  .add(Key::r, "R")
138  .add(Key::s, "S")
139  .add(Key::t, "T")
140  .add(Key::u, "U")
141  .add(Key::v, "V")
142  .add(Key::w, "W")
143  .add(Key::x, "X")
144  .add(Key::y, "Y")
145  .add(Key::z, "Z")
146  .add(Key::capslock, "Capslock")
147  .add(Key::f1, "F1")
148  .add(Key::f2, "F2")
149  .add(Key::f3, "F3")
150  .add(Key::f4, "F4")
151  .add(Key::f5, "F5")
152  .add(Key::f6, "F6")
153  .add(Key::f7, "F7")
154  .add(Key::f8, "F8")
155  .add(Key::f9, "F9")
156  .add(Key::f10, "F10")
157  .add(Key::f11, "F11")
158  .add(Key::f12, "F12")
159  .add(Key::print_screen, "Printscreen")
160  .add(Key::scroll_lock, "Scrolllock")
161  .add(Key::pause, "Pause")
162  .add(Key::insert, "Insert")
163  .add(Key::home, "Home")
164  .add(Key::page_up, "Pageup")
165  .add(Key::delete_key, "Delete")
166  .add(Key::end, "End")
167  .add(Key::page_down, "Pagedown")
168  .add(Key::right, "Right")
169  .add(Key::left, "Left")
170  .add(Key::down, "Down")
171  .add(Key::up, "Up")
172  .add(Key::numlock_clear, "Numlockclear")
173  .add(Key::keypad_divide, "Kp_Divide")
174  .add(Key::keypad_multiply, "Kp_Multiply")
175  .add(Key::keypad_minus, "Kp_Minus")
176  .add(Key::keypad_plus, "Kp_Plus")
177  .add(Key::keypad_enter, "Kp_Enter")
178  .add(Key::keypad_1, "Kp_1")
179  .add(Key::keypad_2, "Kp_2")
180  .add(Key::keypad_3, "Kp_3")
181  .add(Key::keypad_4, "Kp_4")
182  .add(Key::keypad_5, "Kp_5")
183  .add(Key::keypad_6, "Kp_6")
184  .add(Key::keypad_7, "Kp_7")
185  .add(Key::keypad_8, "Kp_8")
186  .add(Key::keypad_9, "Kp_9")
187  .add(Key::keypad_0, "Kp_0")
188  .add(Key::keypad_period, "Kp_Period")
189  .add(Key::application, "Application")
190  .add(Key::power, "Power")
191  .add(Key::keypad_equals, "Kp_Equals")
192  .add(Key::f13, "F13")
193  .add(Key::f14, "F14")
194  .add(Key::f15, "F15")
195  .add(Key::f16, "F16")
196  .add(Key::f17, "F17")
197  .add(Key::f18, "F18")
198  .add(Key::f19, "F19")
199  .add(Key::f20, "F20")
200  .add(Key::f21, "F21")
201  .add(Key::f22, "F22")
202  .add(Key::f23, "F23")
203  .add(Key::f24, "F24")
204  .add(Key::execute, "Execute")
205  .add(Key::help, "Help")
206  .add(Key::menu, "Menu")
207  .add(Key::select, "Select")
208  .add(Key::stop, "Stop")
209  .add(Key::again, "Again")
210  .add(Key::undo, "Undo")
211  .add(Key::cut, "Cut")
212  .add(Key::copy, "Copy")
213  .add(Key::paste, "Paste")
214  .add(Key::find, "Find")
215  .add(Key::mute, "Mute")
216  .add(Key::volume_up, "Volumeup")
217  .add(Key::volume_down, "Volumedown")
218  .add(Key::keypad_comma, "Kp_Comma")
219  .add(Key::keypad_equals_as_400, "Kp_Equalsas400")
220  .add(Key::alt_erase, "Alterase")
221  .add(Key::sysreq, "Sysreq")
222  .add(Key::cancel, "Cancel")
223  .add(Key::clear, "Clear")
224  .add(Key::prior, "Prior")
225  .add(Key::second_return, "Return2")
226  .add(Key::separator, "Separator")
227  .add(Key::out, "Out")
228  .add(Key::oper, "Oper")
229  .add(Key::clear_again, "Clearagain")
230  .add(Key::crsel, "Crsel")
231  .add(Key::exsel, "Exsel")
232  .add(Key::keypad_00, "Kp_00")
233  .add(Key::keypad_000, "Kp_000")
234  .add(Key::thousandseparator, "Thousandsseparator")
235  .add(Key::decimalseparator, "Decimalseparator")
236  .add(Key::currency_unit, "Currencyunit")
237  .add(Key::currency_subunit, "Currencysubunit")
238  .add(Key::keypad_leftparen, "Kp_Leftparen")
239  .add(Key::keypad_rightparen, "Kp_Rightparen")
240  .add(Key::keypad_leftbrace, "Kp_Leftbrace")
241  .add(Key::keypad_rightbrace, "Kp_Rightbrace")
242  .add(Key::keypad_tab, "Kp_Tab")
243  .add(Key::keypad_backspace, "Kp_Backspace")
244  .add(Key::keypad_a, "Kp_A")
245  .add(Key::keypad_b, "Kp_B")
246  .add(Key::keypad_c, "Kp_C")
247  .add(Key::keypad_d, "Kp_D")
248  .add(Key::keypad_e, "Kp_E")
249  .add(Key::keypad_f, "Kp_F")
250  .add(Key::keypad_xor, "Kp_Xor")
251  .add(Key::keypad_power, "Kp_Power")
252  .add(Key::keypad_percent, "Kp_Percent")
253  .add(Key::keypad_less, "Kp_Less")
254  .add(Key::keypad_greater, "Kp_Greater")
255  .add(Key::keypad_ampersand, "Kp_Ampersand")
256  .add(Key::keypad_double_ampersand, "Kp_Dblampersand")
257  .add(Key::keypad_vertical_bar, "Kp_Verticalbar")
258  .add(Key::keypad_double_verticle_bar, "Kp_Dblverticalbar")
259  .add(Key::keypad_colon, "Kp_Colon")
260  .add(Key::keypad_hash, "Kp_Hash")
261  .add(Key::keypad_space, "Kp_Space")
262  .add(Key::keypad_at, "Kp_At")
263  .add(Key::keypad_exclam, "Kp_Exclam")
264  .add(Key::keypad_mem_store, "Kp_Memstore")
265  .add(Key::keypad_mem_recall, "Kp_Memrecall")
266  .add(Key::keypad_mem_clear, "Kp_Memclear")
267  .add(Key::keypad_mem_add, "Kp_Memadd")
268  .add(Key::keypad_mem_subtract, "Kp_Memsubtract")
269  .add(Key::keypad_mem_multiply, "Kp_Memmultiply")
270  .add(Key::keypad_mem_divide, "Kp_Memdivide")
271  .add(Key::keypad_plus_minus, "Kp_Plusminus")
272  .add(Key::keypad_clear, "Kp_Clear")
273  .add(Key::keypad_clear_entry, "Kp_Clearentry")
274  .add(Key::keypad_binary, "Kp_Binary")
275  .add(Key::keypad_octal, "Kp_Octal")
276  .add(Key::keypad_decimal, "Kp_Decimal")
277  .add(Key::keypad_hexadecimal, "Kp_Hexadecimal")
278  .add(Key::ctrl_left, "Lctrl")
279  .add(Key::shift_left, "Lshift")
280  .add(Key::alt_left, "Lalt")
281  .add(Key::gui_left, "Lgui")
282  .add(Key::ctrl_right, "Rctrl")
283  .add(Key::shift_right, "Rshift")
284  .add(Key::alt_right, "Ralt")
285  .add(Key::gui_right, "Rgui")
286  .add(Key::mode, "Mode")
287  .add(Key::audio_next, "Audionext")
288  .add(Key::audio_prev, "Audioprev")
289  .add(Key::audio_stop, "Audiostop")
290  .add(Key::audio_play, "Audioplay")
291  .add(Key::audio_mute, "Audiomute")
292  .add(Key::media_select, "Mediaselect")
293  .add(Key::www, "Www")
294  .add(Key::mail, "Mail")
295  .add(Key::calculator, "Calculator")
296  .add(Key::computer, "Computer")
297  .add(Key::ac_search, "Ac_Search")
298  .add(Key::ac_home, "Ac_Home")
299  .add(Key::ac_back, "Ac_Back")
300  .add(Key::ac_forward, "Ac_Forward")
301  .add(Key::ac_stop, "Ac_Stop")
302  .add(Key::ac_refresh, "Ac_Refresh")
303  .add(Key::ac_bookmarks, "Ac_Bookmarks")
304  .add(Key::brightness_down, "Brightnessdown")
305  .add(Key::brightness_up, "Brightnessup")
306  .add(Key::displayswitch, "Displayswitch")
307  .add(Key::keyboard_illum_toggle, "Kbdillumtoggle")
308  .add(Key::keyboard_illum_down, "Kbdillumdown")
309  .add(Key::keyboard_illum_up, "Kbdillumup")
310  .add(Key::eject, "Eject")
311  .add(Key::sleep, "Sleep")
312  ;
313  return keys;
314  }
315 
316  const KeyNamer<MouseButton>&
317  all_mouse_buttons()
318  {
319  static const KeyNamer<MouseButton> buttons =
320  KeyNamer<MouseButton>{MouseButton::unbound, MouseButton::invalid}
321  .add(MouseButton::left, "left")
322  .add(MouseButton::middle, "middle")
323  .add(MouseButton::right, "right")
324  .add(MouseButton::x1, "x1")
325  .add(MouseButton::x2, "x2")
326  ;
327  return buttons;
328  }
329 
330  }
331 
332  std::string
334  {
335  return all_keys().from_key_to_string(k);
336  }
337 
338  Key
339  to_key(const std::string& name)
340  {
341  return all_keys().from_string_to_key(name);
342  }
343 
344  std::string
346  {
347  return all_mouse_buttons().from_key_to_string(button);
348  }
349 
351  to_mouse_button(const std::string& button)
352  {
353  return all_mouse_buttons().from_string_to_key(button);
354  }
355 
356 }
std::map< std::string, T > string_to_key
Definition: key.cc:66
const T invalid_key
Definition: key.cc:68
std::map< T, std::string > key_to_string
Definition: key.cc:67
const T unbound_key
Definition: key.cc:69
std::string to_lower(const std::string &str)
Generate a string containing only lower characters.
Definition: stringutils.cc:143
Key to_key(const std::string &name)
Definition: key.cc:339
std::string to_string(const EnumValue &v)
Definition: enum.cc:175
Key
Definition: key.h:26
@ keypad_double_verticle_bar
MouseButton to_mouse_button(const std::string &button)
Definition: key.cc:351
MouseButton
Definition: key.h:8
String utility functions.