LCOV - code coverage report
Current view: top level - engine/input/adapters - glfw.hpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 325 325
Test Date: 2026-03-11 04:45:14 Functions: 100.0 % 22 22

            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
        

Generated by: LCOV version 2.0-1