Line data Source code
1 : #pragma once
2 : #include <jage/engine/external/glfw.hpp>
3 : #include <jage/engine/input/keyboard/action.hpp>
4 : #include <jage/engine/input/keyboard/events/key_press.hpp>
5 : #include <jage/engine/input/keyboard/key.hpp>
6 : #include <jage/engine/input/keyboard/scancode.hpp>
7 : #include <jage/engine/input/mouse/button.hpp>
8 : #include <jage/engine/input/mouse/events/click.hpp>
9 : #include <jage/engine/input/mouse/events/cursor/motion.hpp>
10 : #include <jage/engine/input/mouse/events/cursor/position.hpp>
11 : #include <jage/engine/input/mouse/events/horizontal_scroll.hpp>
12 : #include <jage/engine/input/mouse/events/vertical_scroll.hpp>
13 : #include <jage/engine/time/durations.hpp>
14 :
15 : #include <array>
16 : #include <utility>
17 : #include <vector>
18 :
19 : namespace jage::engine::input::adapters {
20 : // TODO: Make this a concept
21 : template <class TPlatform> class glfw {
22 :
23 : static std::array<keyboard::key, GLFW_KEY_LAST + 1> logical_keys_;
24 : static std::vector<keyboard::scancode> physical_keys_;
25 : using duration_type = typename TPlatform::context_type::duration_type;
26 : using event_type = typename TPlatform::context_type::event_type;
27 : using window_handle_pointer_type =
28 : typename TPlatform::window_handle_pointer_type;
29 :
30 : static constexpr auto get_physical_key =
31 136 : [] [[nodiscard]] (const int scancode) -> keyboard::scancode {
32 136 : if (0 > scancode) [[unlikely]] {
33 1 : return keyboard::scancode::unidentified;
34 270 : } else if (static_cast<std::size_t>(scancode) >= std::size(physical_keys_))
35 1 : [[unlikely]] {
36 1 : return keyboard::scancode::unidentified;
37 134 : } else [[likely]] {
38 134 : return physical_keys_[static_cast<std::size_t>(scancode)];
39 : }
40 : };
41 :
42 : [[nodiscard]] static inline auto
43 157 : get_modifier(const auto mods) -> std::bitset<modifier_count> {
44 :
45 157 : auto modifier_bitset = std::bitset<modifier_count>{};
46 :
47 187 : const auto flip = [&](const auto... modifiers) -> void {
48 15 : (modifier_bitset.flip(std::to_underlying(modifiers)), ...);
49 : };
50 :
51 157 : if (mods != 0) [[unlikely]] {
52 15 : if (mods & GLFW_MOD_SHIFT) {
53 5 : flip(modifier::left_shift, modifier::right_shift);
54 : }
55 15 : if (mods & GLFW_MOD_ALT) {
56 2 : flip(modifier::left_alt, modifier::right_alt);
57 : }
58 15 : if (mods & GLFW_MOD_CONTROL) {
59 2 : flip(modifier::left_control, modifier::right_control);
60 : }
61 15 : if (mods & GLFW_MOD_SUPER) {
62 2 : flip(modifier::left_gui, modifier::right_gui);
63 : }
64 15 : if (mods & GLFW_MOD_CAPS_LOCK) {
65 2 : flip(modifier::caps_lock);
66 : }
67 15 : if (mods & GLFW_MOD_NUM_LOCK) {
68 2 : flip(modifier::num_lock);
69 : }
70 : }
71 157 : return modifier_bitset;
72 : }
73 :
74 : static constexpr auto get_current_timestamp =
75 175 : [] [[nodiscard]] -> duration_type {
76 175 : return time::cast<duration_type>(TPlatform::get_seconds_since_init());
77 : };
78 :
79 : static constexpr auto cursor_is_disabled =
80 16 : [] [[nodiscard]] (window_handle_pointer_type window) -> bool {
81 : return GLFW_CURSOR_DISABLED ==
82 16 : TPlatform::get_input_mode(window, GLFW_CURSOR);
83 : };
84 :
85 199 : static constexpr auto get_context(window_handle_pointer_type window) ->
86 : typename TPlatform::context_type & {
87 : return *static_cast<typename TPlatform::context_type *>(
88 199 : TPlatform::get_window_user_pointer(window));
89 : }
90 :
91 175 : static constexpr auto push_event(window_handle_pointer_type window,
92 : auto &&payload) -> void {
93 175 : auto &context = get_context(window);
94 175 : context.push(event_type{
95 175 : .timestamp = get_current_timestamp(),
96 : .payload = std::forward<decltype(payload)>(payload),
97 : });
98 175 : };
99 :
100 32 : static constexpr auto almost_equal = [] [[nodiscard]] (double lhs,
101 : double rhs) -> bool {
102 32 : auto difference = std::abs(lhs - rhs);
103 32 : return difference <= std::numeric_limits<double>::epsilon() *
104 32 : std::max(std::abs(lhs), std::abs(rhs));
105 : };
106 :
107 2 : static constexpr auto scroll_callback = [](window_handle_pointer_type window,
108 : double xoffset,
109 : double yoffset) -> void {
110 2 : if (0.0 != yoffset) {
111 1 : push_event(window, mouse::events::vertical_scroll{
112 : .offset = yoffset,
113 : });
114 : } else {
115 1 : push_event(window, mouse::events::horizontal_scroll{
116 : .offset = xoffset,
117 : });
118 : }
119 : };
120 :
121 : static constexpr auto cursor_position_callback =
122 24 : [](window_handle_pointer_type window, double xpos, double ypos) -> void {
123 24 : auto &[last_x_pos, last_y_pos] =
124 24 : get_context(window).last_known_cursor_position();
125 24 : if (almost_equal(xpos, last_x_pos) and almost_equal(ypos, last_y_pos)) {
126 8 : return;
127 : }
128 16 : if (cursor_is_disabled(window)) {
129 10 : push_event(window, mouse::events::cursor::motion{
130 10 : .delta_x = xpos - last_x_pos,
131 10 : .delta_y = ypos - last_y_pos,
132 : });
133 :
134 : } else {
135 6 : push_event(window, mouse::events::cursor::position{
136 : .x = xpos,
137 : .y = ypos,
138 : });
139 : }
140 16 : last_x_pos = xpos;
141 16 : last_y_pos = ypos;
142 : };
143 :
144 : static constexpr auto mouse_button_callback =
145 42 : [](window_handle_pointer_type window, int button, int action, int mods) {
146 21 : push_event(window, mouse::events::click{
147 21 : .button = static_cast<mouse::button>(button),
148 21 : .action = static_cast<mouse::action>(action),
149 21 : .modifiers = get_modifier(mods),
150 : });
151 : };
152 :
153 272 : static constexpr auto key_callback = [](window_handle_pointer_type window,
154 : int key, int scancode, int action,
155 : int mods) -> void {
156 136 : push_event(window,
157 : keyboard::events::key_press{
158 136 : .key = key != GLFW_KEY_UNKNOWN ? logical_keys_[key]
159 : : keyboard::key::unidentified,
160 136 : .scancode = get_physical_key(scancode),
161 136 : .action = static_cast<keyboard::action>(action),
162 136 : .modifiers = get_modifier(mods),
163 : });
164 : };
165 :
166 : static constexpr auto load_physical_scancodes =
167 158 : [](const TPlatform &platform) -> void {
168 18960 : auto bind = [&](const auto glfw_key,
169 : const keyboard::scancode scancode) -> void {
170 18960 : if (const auto os_scancode = platform.get_key_scancode(glfw_key);
171 : os_scancode != -1) {
172 127 : if (static_cast<std::size_t>(os_scancode) >=
173 127 : std::size(physical_keys_)) {
174 9 : physical_keys_.resize(static_cast<std::size_t>(os_scancode) + 1UZ,
175 9 : keyboard::scancode::unidentified);
176 : }
177 127 : physical_keys_[os_scancode] = scancode;
178 : }
179 : };
180 :
181 158 : bind(GLFW_KEY_SPACE, keyboard::scancode::spacebar);
182 158 : bind(GLFW_KEY_APOSTROPHE, keyboard::scancode::apostrophe);
183 158 : bind(GLFW_KEY_COMMA, keyboard::scancode::comma);
184 158 : bind(GLFW_KEY_MINUS, keyboard::scancode::minus);
185 158 : bind(GLFW_KEY_PERIOD, keyboard::scancode::period);
186 158 : bind(GLFW_KEY_SLASH, keyboard::scancode::slash);
187 158 : bind(GLFW_KEY_0, keyboard::scancode::_0);
188 158 : bind(GLFW_KEY_1, keyboard::scancode::_1);
189 158 : bind(GLFW_KEY_2, keyboard::scancode::_2);
190 158 : bind(GLFW_KEY_3, keyboard::scancode::_3);
191 158 : bind(GLFW_KEY_4, keyboard::scancode::_4);
192 158 : bind(GLFW_KEY_5, keyboard::scancode::_5);
193 158 : bind(GLFW_KEY_6, keyboard::scancode::_6);
194 158 : bind(GLFW_KEY_7, keyboard::scancode::_7);
195 158 : bind(GLFW_KEY_8, keyboard::scancode::_8);
196 158 : bind(GLFW_KEY_9, keyboard::scancode::_9);
197 158 : bind(GLFW_KEY_SEMICOLON, keyboard::scancode::semicolon);
198 158 : bind(GLFW_KEY_EQUAL, keyboard::scancode::equal);
199 158 : bind(GLFW_KEY_A, keyboard::scancode::a);
200 158 : bind(GLFW_KEY_B, keyboard::scancode::b);
201 158 : bind(GLFW_KEY_C, keyboard::scancode::c);
202 158 : bind(GLFW_KEY_D, keyboard::scancode::d);
203 158 : bind(GLFW_KEY_E, keyboard::scancode::e);
204 158 : bind(GLFW_KEY_F, keyboard::scancode::f);
205 158 : bind(GLFW_KEY_G, keyboard::scancode::g);
206 158 : bind(GLFW_KEY_H, keyboard::scancode::h);
207 158 : bind(GLFW_KEY_I, keyboard::scancode::i);
208 158 : bind(GLFW_KEY_J, keyboard::scancode::j);
209 158 : bind(GLFW_KEY_K, keyboard::scancode::k);
210 158 : bind(GLFW_KEY_L, keyboard::scancode::l);
211 158 : bind(GLFW_KEY_M, keyboard::scancode::m);
212 158 : bind(GLFW_KEY_N, keyboard::scancode::n);
213 158 : bind(GLFW_KEY_O, keyboard::scancode::o);
214 158 : bind(GLFW_KEY_P, keyboard::scancode::p);
215 158 : bind(GLFW_KEY_Q, keyboard::scancode::q);
216 158 : bind(GLFW_KEY_R, keyboard::scancode::r);
217 158 : bind(GLFW_KEY_S, keyboard::scancode::s);
218 158 : bind(GLFW_KEY_T, keyboard::scancode::t);
219 158 : bind(GLFW_KEY_U, keyboard::scancode::u);
220 158 : bind(GLFW_KEY_V, keyboard::scancode::v);
221 158 : bind(GLFW_KEY_W, keyboard::scancode::w);
222 158 : bind(GLFW_KEY_X, keyboard::scancode::x);
223 158 : bind(GLFW_KEY_Y, keyboard::scancode::y);
224 158 : bind(GLFW_KEY_Z, keyboard::scancode::z);
225 158 : bind(GLFW_KEY_LEFT_BRACKET, keyboard::scancode::left_bracket);
226 158 : bind(GLFW_KEY_BACKSLASH, keyboard::scancode::backslash);
227 158 : bind(GLFW_KEY_RIGHT_BRACKET, keyboard::scancode::right_bracket);
228 158 : bind(GLFW_KEY_GRAVE_ACCENT, keyboard::scancode::grave_accent);
229 158 : bind(GLFW_KEY_WORLD_1, keyboard::scancode::world_1);
230 158 : bind(GLFW_KEY_WORLD_2, keyboard::scancode::world_2);
231 158 : bind(GLFW_KEY_ESCAPE, keyboard::scancode::escape);
232 158 : bind(GLFW_KEY_ENTER, keyboard::scancode::enter);
233 158 : bind(GLFW_KEY_TAB, keyboard::scancode::tab);
234 158 : bind(GLFW_KEY_BACKSPACE, keyboard::scancode::backspace);
235 158 : bind(GLFW_KEY_INSERT, keyboard::scancode::insert);
236 158 : bind(GLFW_KEY_DELETE, keyboard::scancode::delete_key);
237 158 : bind(GLFW_KEY_RIGHT, keyboard::scancode::arrow_right);
238 158 : bind(GLFW_KEY_LEFT, keyboard::scancode::arrow_left);
239 158 : bind(GLFW_KEY_DOWN, keyboard::scancode::arrow_down);
240 158 : bind(GLFW_KEY_UP, keyboard::scancode::arrow_up);
241 158 : bind(GLFW_KEY_PAGE_UP, keyboard::scancode::page_up);
242 158 : bind(GLFW_KEY_PAGE_DOWN, keyboard::scancode::page_down);
243 158 : bind(GLFW_KEY_HOME, keyboard::scancode::home);
244 158 : bind(GLFW_KEY_END, keyboard::scancode::end);
245 158 : bind(GLFW_KEY_CAPS_LOCK, keyboard::scancode::caps_lock);
246 158 : bind(GLFW_KEY_SCROLL_LOCK, keyboard::scancode::scroll_lock);
247 158 : bind(GLFW_KEY_NUM_LOCK, keyboard::scancode::num_lock);
248 158 : bind(GLFW_KEY_PRINT_SCREEN, keyboard::scancode::print_screen);
249 158 : bind(GLFW_KEY_PAUSE, keyboard::scancode::pause);
250 158 : bind(GLFW_KEY_F1, keyboard::scancode::F1);
251 158 : bind(GLFW_KEY_F2, keyboard::scancode::F2);
252 158 : bind(GLFW_KEY_F3, keyboard::scancode::F3);
253 158 : bind(GLFW_KEY_F4, keyboard::scancode::F4);
254 158 : bind(GLFW_KEY_F5, keyboard::scancode::F5);
255 158 : bind(GLFW_KEY_F6, keyboard::scancode::F6);
256 158 : bind(GLFW_KEY_F7, keyboard::scancode::F7);
257 158 : bind(GLFW_KEY_F8, keyboard::scancode::F8);
258 158 : bind(GLFW_KEY_F9, keyboard::scancode::F9);
259 158 : bind(GLFW_KEY_F10, keyboard::scancode::F10);
260 158 : bind(GLFW_KEY_F11, keyboard::scancode::F11);
261 158 : bind(GLFW_KEY_F12, keyboard::scancode::F12);
262 158 : bind(GLFW_KEY_F13, keyboard::scancode::F13);
263 158 : bind(GLFW_KEY_F14, keyboard::scancode::F14);
264 158 : bind(GLFW_KEY_F15, keyboard::scancode::F15);
265 158 : bind(GLFW_KEY_F16, keyboard::scancode::F16);
266 158 : bind(GLFW_KEY_F17, keyboard::scancode::F17);
267 158 : bind(GLFW_KEY_F18, keyboard::scancode::F18);
268 158 : bind(GLFW_KEY_F19, keyboard::scancode::F19);
269 158 : bind(GLFW_KEY_F20, keyboard::scancode::F20);
270 158 : bind(GLFW_KEY_F21, keyboard::scancode::F21);
271 158 : bind(GLFW_KEY_F22, keyboard::scancode::F22);
272 158 : bind(GLFW_KEY_F23, keyboard::scancode::F23);
273 158 : bind(GLFW_KEY_F24, keyboard::scancode::F24);
274 158 : bind(GLFW_KEY_F25, keyboard::scancode::execute);
275 158 : bind(GLFW_KEY_KP_0, keyboard::scancode::kp_0);
276 158 : bind(GLFW_KEY_KP_1, keyboard::scancode::kp_1);
277 158 : bind(GLFW_KEY_KP_2, keyboard::scancode::kp_2);
278 158 : bind(GLFW_KEY_KP_3, keyboard::scancode::kp_3);
279 158 : bind(GLFW_KEY_KP_4, keyboard::scancode::kp_4);
280 158 : bind(GLFW_KEY_KP_5, keyboard::scancode::kp_5);
281 158 : bind(GLFW_KEY_KP_6, keyboard::scancode::kp_6);
282 158 : bind(GLFW_KEY_KP_7, keyboard::scancode::kp_7);
283 158 : bind(GLFW_KEY_KP_8, keyboard::scancode::kp_8);
284 158 : bind(GLFW_KEY_KP_9, keyboard::scancode::kp_9);
285 158 : bind(GLFW_KEY_KP_DECIMAL, keyboard::scancode::kp_decimal);
286 158 : bind(GLFW_KEY_KP_DIVIDE, keyboard::scancode::kp_divide);
287 158 : bind(GLFW_KEY_KP_MULTIPLY, keyboard::scancode::kp_multiply);
288 158 : bind(GLFW_KEY_KP_SUBTRACT, keyboard::scancode::kp_subtract);
289 158 : bind(GLFW_KEY_KP_ADD, keyboard::scancode::kp_add);
290 158 : bind(GLFW_KEY_KP_ENTER, keyboard::scancode::kp_enter);
291 158 : bind(GLFW_KEY_KP_EQUAL, keyboard::scancode::kp_equal);
292 158 : bind(GLFW_KEY_LEFT_SHIFT, keyboard::scancode::left_shift);
293 158 : bind(GLFW_KEY_LEFT_CONTROL, keyboard::scancode::left_control);
294 158 : bind(GLFW_KEY_LEFT_ALT, keyboard::scancode::left_alt);
295 158 : bind(GLFW_KEY_LEFT_SUPER, keyboard::scancode::left_super);
296 158 : bind(GLFW_KEY_RIGHT_SHIFT, keyboard::scancode::right_shift);
297 158 : bind(GLFW_KEY_RIGHT_CONTROL, keyboard::scancode::right_control);
298 158 : bind(GLFW_KEY_RIGHT_ALT, keyboard::scancode::right_alt);
299 158 : bind(GLFW_KEY_RIGHT_SUPER, keyboard::scancode::right_super);
300 158 : bind(GLFW_KEY_MENU, keyboard::scancode::menu);
301 : };
302 :
303 316 : static constexpr auto load_logical_keys = [] -> void {
304 158 : logical_keys_[GLFW_KEY_SPACE] = keyboard::key::spacebar;
305 158 : logical_keys_[GLFW_KEY_APOSTROPHE] = keyboard::key::apostrophe;
306 158 : logical_keys_[GLFW_KEY_COMMA] = keyboard::key::comma;
307 158 : logical_keys_[GLFW_KEY_MINUS] = keyboard::key::minus;
308 158 : logical_keys_[GLFW_KEY_PERIOD] = keyboard::key::period;
309 158 : logical_keys_[GLFW_KEY_SLASH] = keyboard::key::slash;
310 158 : logical_keys_[GLFW_KEY_0] = keyboard::key::_0;
311 158 : logical_keys_[GLFW_KEY_1] = keyboard::key::_1;
312 158 : logical_keys_[GLFW_KEY_2] = keyboard::key::_2;
313 158 : logical_keys_[GLFW_KEY_3] = keyboard::key::_3;
314 158 : logical_keys_[GLFW_KEY_4] = keyboard::key::_4;
315 158 : logical_keys_[GLFW_KEY_5] = keyboard::key::_5;
316 158 : logical_keys_[GLFW_KEY_6] = keyboard::key::_6;
317 158 : logical_keys_[GLFW_KEY_7] = keyboard::key::_7;
318 158 : logical_keys_[GLFW_KEY_8] = keyboard::key::_8;
319 158 : logical_keys_[GLFW_KEY_9] = keyboard::key::_9;
320 158 : logical_keys_[GLFW_KEY_SEMICOLON] = keyboard::key::semicolon;
321 158 : logical_keys_[GLFW_KEY_EQUAL] = keyboard::key::equal;
322 158 : logical_keys_[GLFW_KEY_A] = keyboard::key::a;
323 158 : logical_keys_[GLFW_KEY_B] = keyboard::key::b;
324 158 : logical_keys_[GLFW_KEY_C] = keyboard::key::c;
325 158 : logical_keys_[GLFW_KEY_D] = keyboard::key::d;
326 158 : logical_keys_[GLFW_KEY_E] = keyboard::key::e;
327 158 : logical_keys_[GLFW_KEY_F] = keyboard::key::f;
328 158 : logical_keys_[GLFW_KEY_G] = keyboard::key::g;
329 158 : logical_keys_[GLFW_KEY_H] = keyboard::key::h;
330 158 : logical_keys_[GLFW_KEY_I] = keyboard::key::i;
331 158 : logical_keys_[GLFW_KEY_J] = keyboard::key::j;
332 158 : logical_keys_[GLFW_KEY_K] = keyboard::key::k;
333 158 : logical_keys_[GLFW_KEY_L] = keyboard::key::l;
334 158 : logical_keys_[GLFW_KEY_M] = keyboard::key::m;
335 158 : logical_keys_[GLFW_KEY_N] = keyboard::key::n;
336 158 : logical_keys_[GLFW_KEY_O] = keyboard::key::o;
337 158 : logical_keys_[GLFW_KEY_P] = keyboard::key::p;
338 158 : logical_keys_[GLFW_KEY_Q] = keyboard::key::q;
339 158 : logical_keys_[GLFW_KEY_R] = keyboard::key::r;
340 158 : logical_keys_[GLFW_KEY_S] = keyboard::key::s;
341 158 : logical_keys_[GLFW_KEY_T] = keyboard::key::t;
342 158 : logical_keys_[GLFW_KEY_U] = keyboard::key::u;
343 158 : logical_keys_[GLFW_KEY_V] = keyboard::key::v;
344 158 : logical_keys_[GLFW_KEY_W] = keyboard::key::w;
345 158 : logical_keys_[GLFW_KEY_X] = keyboard::key::x;
346 158 : logical_keys_[GLFW_KEY_Y] = keyboard::key::y;
347 158 : logical_keys_[GLFW_KEY_Z] = keyboard::key::z;
348 158 : logical_keys_[GLFW_KEY_LEFT_BRACKET] = keyboard::key::left_bracket;
349 158 : logical_keys_[GLFW_KEY_BACKSLASH] = keyboard::key::backslash;
350 158 : logical_keys_[GLFW_KEY_RIGHT_BRACKET] = keyboard::key::right_bracket;
351 158 : logical_keys_[GLFW_KEY_GRAVE_ACCENT] = keyboard::key::grave_accent;
352 158 : logical_keys_[GLFW_KEY_WORLD_1] = keyboard::key::world_1;
353 158 : logical_keys_[GLFW_KEY_WORLD_2] = keyboard::key::world_2;
354 158 : logical_keys_[GLFW_KEY_ESCAPE] = keyboard::key::escape;
355 158 : logical_keys_[GLFW_KEY_ENTER] = keyboard::key::enter;
356 158 : logical_keys_[GLFW_KEY_TAB] = keyboard::key::tab;
357 158 : logical_keys_[GLFW_KEY_BACKSPACE] = keyboard::key::backspace;
358 158 : logical_keys_[GLFW_KEY_INSERT] = keyboard::key::insert;
359 158 : logical_keys_[GLFW_KEY_DELETE] = keyboard::key::delete_key;
360 158 : logical_keys_[GLFW_KEY_RIGHT] = keyboard::key::arrow_right;
361 158 : logical_keys_[GLFW_KEY_LEFT] = keyboard::key::arrow_left;
362 158 : logical_keys_[GLFW_KEY_DOWN] = keyboard::key::arrow_down;
363 158 : logical_keys_[GLFW_KEY_UP] = keyboard::key::arrow_up;
364 158 : logical_keys_[GLFW_KEY_PAGE_UP] = keyboard::key::page_up;
365 158 : logical_keys_[GLFW_KEY_PAGE_DOWN] = keyboard::key::page_down;
366 158 : logical_keys_[GLFW_KEY_HOME] = keyboard::key::home;
367 158 : logical_keys_[GLFW_KEY_END] = keyboard::key::end;
368 158 : logical_keys_[GLFW_KEY_CAPS_LOCK] = keyboard::key::caps_lock;
369 158 : logical_keys_[GLFW_KEY_SCROLL_LOCK] = keyboard::key::scroll_lock;
370 158 : logical_keys_[GLFW_KEY_PRINT_SCREEN] = keyboard::key::print_screen;
371 158 : logical_keys_[GLFW_KEY_NUM_LOCK] = keyboard::key::num_lock;
372 158 : logical_keys_[GLFW_KEY_PAUSE] = keyboard::key::pause;
373 158 : logical_keys_[GLFW_KEY_F1] = keyboard::key::F1;
374 158 : logical_keys_[GLFW_KEY_F2] = keyboard::key::F2;
375 158 : logical_keys_[GLFW_KEY_F3] = keyboard::key::F3;
376 158 : logical_keys_[GLFW_KEY_F4] = keyboard::key::F4;
377 158 : logical_keys_[GLFW_KEY_F5] = keyboard::key::F5;
378 158 : logical_keys_[GLFW_KEY_F6] = keyboard::key::F6;
379 158 : logical_keys_[GLFW_KEY_F7] = keyboard::key::F7;
380 158 : logical_keys_[GLFW_KEY_F8] = keyboard::key::F8;
381 158 : logical_keys_[GLFW_KEY_F9] = keyboard::key::F9;
382 158 : logical_keys_[GLFW_KEY_F10] = keyboard::key::F10;
383 158 : logical_keys_[GLFW_KEY_F11] = keyboard::key::F11;
384 158 : logical_keys_[GLFW_KEY_F12] = keyboard::key::F12;
385 158 : logical_keys_[GLFW_KEY_F13] = keyboard::key::F13;
386 158 : logical_keys_[GLFW_KEY_F14] = keyboard::key::F14;
387 158 : logical_keys_[GLFW_KEY_F15] = keyboard::key::F15;
388 158 : logical_keys_[GLFW_KEY_F16] = keyboard::key::F16;
389 158 : logical_keys_[GLFW_KEY_F17] = keyboard::key::F17;
390 158 : logical_keys_[GLFW_KEY_F18] = keyboard::key::F18;
391 158 : logical_keys_[GLFW_KEY_F19] = keyboard::key::F19;
392 158 : logical_keys_[GLFW_KEY_F20] = keyboard::key::F20;
393 158 : logical_keys_[GLFW_KEY_F21] = keyboard::key::F21;
394 158 : logical_keys_[GLFW_KEY_F22] = keyboard::key::F22;
395 158 : logical_keys_[GLFW_KEY_F23] = keyboard::key::F23;
396 158 : logical_keys_[GLFW_KEY_F24] = keyboard::key::F24;
397 158 : logical_keys_[GLFW_KEY_F25] = keyboard::key::execute;
398 158 : logical_keys_[GLFW_KEY_KP_0] = keyboard::key::kp_0;
399 158 : logical_keys_[GLFW_KEY_KP_1] = keyboard::key::kp_1;
400 158 : logical_keys_[GLFW_KEY_KP_2] = keyboard::key::kp_2;
401 158 : logical_keys_[GLFW_KEY_KP_3] = keyboard::key::kp_3;
402 158 : logical_keys_[GLFW_KEY_KP_4] = keyboard::key::kp_4;
403 158 : logical_keys_[GLFW_KEY_KP_5] = keyboard::key::kp_5;
404 158 : logical_keys_[GLFW_KEY_KP_6] = keyboard::key::kp_6;
405 158 : logical_keys_[GLFW_KEY_KP_7] = keyboard::key::kp_7;
406 158 : logical_keys_[GLFW_KEY_KP_8] = keyboard::key::kp_8;
407 158 : logical_keys_[GLFW_KEY_KP_9] = keyboard::key::kp_9;
408 158 : logical_keys_[GLFW_KEY_KP_DECIMAL] = keyboard::key::kp_decimal;
409 158 : logical_keys_[GLFW_KEY_KP_DIVIDE] = keyboard::key::kp_divide;
410 158 : logical_keys_[GLFW_KEY_KP_MULTIPLY] = keyboard::key::kp_multiply;
411 158 : logical_keys_[GLFW_KEY_KP_SUBTRACT] = keyboard::key::kp_subtract;
412 158 : logical_keys_[GLFW_KEY_KP_ADD] = keyboard::key::kp_add;
413 158 : logical_keys_[GLFW_KEY_KP_ENTER] = keyboard::key::kp_enter;
414 158 : logical_keys_[GLFW_KEY_KP_EQUAL] = keyboard::key::kp_equal;
415 158 : logical_keys_[GLFW_KEY_LEFT_SHIFT] = keyboard::key::left_shift;
416 158 : logical_keys_[GLFW_KEY_LEFT_CONTROL] = keyboard::key::left_control;
417 158 : logical_keys_[GLFW_KEY_LEFT_ALT] = keyboard::key::left_alt;
418 158 : logical_keys_[GLFW_KEY_LEFT_SUPER] = keyboard::key::left_super;
419 158 : logical_keys_[GLFW_KEY_RIGHT_SHIFT] = keyboard::key::right_shift;
420 158 : logical_keys_[GLFW_KEY_RIGHT_CONTROL] = keyboard::key::right_control;
421 158 : logical_keys_[GLFW_KEY_RIGHT_ALT] = keyboard::key::right_alt;
422 158 : logical_keys_[GLFW_KEY_RIGHT_SUPER] = keyboard::key::right_super;
423 158 : logical_keys_[GLFW_KEY_MENU] = keyboard::key::menu;
424 : };
425 :
426 : public:
427 316 : static constexpr auto initialize = [](window_handle_pointer_type window,
428 : TPlatform &platform,
429 : const duration_type &epoch) {
430 158 : platform.set_seconds_since_init(time::cast<time::seconds>(epoch));
431 158 : load_logical_keys();
432 158 : load_physical_scancodes(platform);
433 158 : platform.set_key_callback(window, key_callback);
434 158 : platform.set_mouse_button_callback(window, mouse_button_callback);
435 158 : platform.set_cursor_position_callback(window, cursor_position_callback);
436 158 : platform.set_scroll_callback(window, scroll_callback);
437 : };
438 : };
439 :
440 : template <class TPlatform>
441 : std::array<keyboard::key, GLFW_KEY_LAST + 1> glfw<TPlatform>::logical_keys_ =
442 : {};
443 : template <class TPlatform>
444 : std::vector<keyboard::scancode> glfw<TPlatform>::physical_keys_ = {};
445 : } // namespace jage::engine::input::adapters
|