Inferno Game Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

160 lines
4.3 KiB

/*
* Copyright (C) 2022 Riyyi
*
* SPDX-License-Identifier: MIT
*/
#include <algorithm> // std::find_if
#include <string_view>
#include <unordered_map> // std::unordered_map
#include "GLFW/glfw3.h"
#include "ruc/meta/assert.h"
#include "inferno/keycodes.h"
namespace Inferno {
static std::unordered_map<std::string_view, int> keys({
{ MAP_KEY(GLFW_KEY_UNKNOWN) },
{ MAP_KEY(GLFW_KEY_SPACE) },
{ MAP_KEY(GLFW_KEY_APOSTROPHE) },
{ MAP_KEY(GLFW_KEY_COMMA) },
{ MAP_KEY(GLFW_KEY_MINUS) },
{ MAP_KEY(GLFW_KEY_PERIOD) },
{ MAP_KEY(GLFW_KEY_SLASH) },
{ MAP_KEY(GLFW_KEY_0) },
{ MAP_KEY(GLFW_KEY_1) },
{ MAP_KEY(GLFW_KEY_2) },
{ MAP_KEY(GLFW_KEY_3) },
{ MAP_KEY(GLFW_KEY_4) },
{ MAP_KEY(GLFW_KEY_5) },
{ MAP_KEY(GLFW_KEY_6) },
{ MAP_KEY(GLFW_KEY_7) },
{ MAP_KEY(GLFW_KEY_8) },
{ MAP_KEY(GLFW_KEY_9) },
{ MAP_KEY(GLFW_KEY_SEMICOLON) },
{ MAP_KEY(GLFW_KEY_EQUAL) },
{ MAP_KEY(GLFW_KEY_A) },
{ MAP_KEY(GLFW_KEY_B) },
{ MAP_KEY(GLFW_KEY_C) },
{ MAP_KEY(GLFW_KEY_D) },
{ MAP_KEY(GLFW_KEY_E) },
{ MAP_KEY(GLFW_KEY_F) },
{ MAP_KEY(GLFW_KEY_G) },
{ MAP_KEY(GLFW_KEY_H) },
{ MAP_KEY(GLFW_KEY_I) },
{ MAP_KEY(GLFW_KEY_J) },
{ MAP_KEY(GLFW_KEY_K) },
{ MAP_KEY(GLFW_KEY_L) },
{ MAP_KEY(GLFW_KEY_M) },
{ MAP_KEY(GLFW_KEY_N) },
{ MAP_KEY(GLFW_KEY_O) },
{ MAP_KEY(GLFW_KEY_P) },
{ MAP_KEY(GLFW_KEY_Q) },
{ MAP_KEY(GLFW_KEY_R) },
{ MAP_KEY(GLFW_KEY_S) },
{ MAP_KEY(GLFW_KEY_T) },
{ MAP_KEY(GLFW_KEY_U) },
{ MAP_KEY(GLFW_KEY_V) },
{ MAP_KEY(GLFW_KEY_W) },
{ MAP_KEY(GLFW_KEY_X) },
{ MAP_KEY(GLFW_KEY_Y) },
{ MAP_KEY(GLFW_KEY_Z) },
{ MAP_KEY(GLFW_KEY_LEFT_BRACKET) },
{ MAP_KEY(GLFW_KEY_BACKSLASH) },
{ MAP_KEY(GLFW_KEY_RIGHT_BRACKET) },
{ MAP_KEY(GLFW_KEY_GRAVE_ACCENT) },
{ MAP_KEY(GLFW_KEY_WORLD_1) },
{ MAP_KEY(GLFW_KEY_WORLD_2) },
{ MAP_KEY(GLFW_KEY_ESCAPE) },
{ MAP_KEY(GLFW_KEY_ENTER) },
{ MAP_KEY(GLFW_KEY_TAB) },
{ MAP_KEY(GLFW_KEY_BACKSPACE) },
{ MAP_KEY(GLFW_KEY_INSERT) },
{ MAP_KEY(GLFW_KEY_DELETE) },
{ MAP_KEY(GLFW_KEY_RIGHT) },
{ MAP_KEY(GLFW_KEY_LEFT) },
{ MAP_KEY(GLFW_KEY_DOWN) },
{ MAP_KEY(GLFW_KEY_UP) },
{ MAP_KEY(GLFW_KEY_PAGE_UP) },
{ MAP_KEY(GLFW_KEY_PAGE_DOWN) },
{ MAP_KEY(GLFW_KEY_HOME) },
{ MAP_KEY(GLFW_KEY_END) },
{ MAP_KEY(GLFW_KEY_CAPS_LOCK) },
{ MAP_KEY(GLFW_KEY_SCROLL_LOCK) },
{ MAP_KEY(GLFW_KEY_NUM_LOCK) },
{ MAP_KEY(GLFW_KEY_PRINT_SCREEN) },
{ MAP_KEY(GLFW_KEY_PAUSE) },
{ MAP_KEY(GLFW_KEY_F1) },
{ MAP_KEY(GLFW_KEY_F2) },
{ MAP_KEY(GLFW_KEY_F3) },
{ MAP_KEY(GLFW_KEY_F4) },
{ MAP_KEY(GLFW_KEY_F5) },
{ MAP_KEY(GLFW_KEY_F6) },
{ MAP_KEY(GLFW_KEY_F7) },
{ MAP_KEY(GLFW_KEY_F8) },
{ MAP_KEY(GLFW_KEY_F9) },
{ MAP_KEY(GLFW_KEY_F10) },
{ MAP_KEY(GLFW_KEY_F11) },
{ MAP_KEY(GLFW_KEY_F12) },
{ MAP_KEY(GLFW_KEY_F13) },
{ MAP_KEY(GLFW_KEY_F14) },
{ MAP_KEY(GLFW_KEY_F15) },
{ MAP_KEY(GLFW_KEY_F16) },
{ MAP_KEY(GLFW_KEY_F17) },
{ MAP_KEY(GLFW_KEY_F18) },
{ MAP_KEY(GLFW_KEY_F19) },
{ MAP_KEY(GLFW_KEY_F20) },
{ MAP_KEY(GLFW_KEY_F21) },
{ MAP_KEY(GLFW_KEY_F22) },
{ MAP_KEY(GLFW_KEY_F23) },
{ MAP_KEY(GLFW_KEY_F24) },
{ MAP_KEY(GLFW_KEY_F25) },
{ MAP_KEY(GLFW_KEY_KP_0) },
{ MAP_KEY(GLFW_KEY_KP_1) },
{ MAP_KEY(GLFW_KEY_KP_2) },
{ MAP_KEY(GLFW_KEY_KP_3) },
{ MAP_KEY(GLFW_KEY_KP_4) },
{ MAP_KEY(GLFW_KEY_KP_5) },
{ MAP_KEY(GLFW_KEY_KP_6) },
{ MAP_KEY(GLFW_KEY_KP_7) },
{ MAP_KEY(GLFW_KEY_KP_8) },
{ MAP_KEY(GLFW_KEY_KP_9) },
{ MAP_KEY(GLFW_KEY_KP_DECIMAL) },
{ MAP_KEY(GLFW_KEY_KP_DIVIDE) },
{ MAP_KEY(GLFW_KEY_KP_MULTIPLY) },
{ MAP_KEY(GLFW_KEY_KP_SUBTRACT) },
{ MAP_KEY(GLFW_KEY_KP_ADD) },
{ MAP_KEY(GLFW_KEY_KP_ENTER) },
{ MAP_KEY(GLFW_KEY_KP_EQUAL) },
{ MAP_KEY(GLFW_KEY_LEFT_SHIFT) },
{ MAP_KEY(GLFW_KEY_LEFT_CONTROL) },
{ MAP_KEY(GLFW_KEY_LEFT_ALT) },
{ MAP_KEY(GLFW_KEY_LEFT_SUPER) },
{ MAP_KEY(GLFW_KEY_RIGHT_SHIFT) },
{ MAP_KEY(GLFW_KEY_RIGHT_CONTROL) },
{ MAP_KEY(GLFW_KEY_RIGHT_ALT) },
{ MAP_KEY(GLFW_KEY_RIGHT_SUPER) },
{ MAP_KEY(GLFW_KEY_MENU) },
});
// -----------------------------------------
int keyCode(std::string_view name)
{
VERIFY(keys.find(name) != keys.end(), "could not find key code: {}", name);
return keys.at(name);
}
std::string_view keyName(int key)
{
auto it = std::find_if(keys.begin(), keys.end(), [key](const auto& keybind) {
return keybind.second == key;
});
VERIFY(it != keys.end(), "could not find key name: {}", key);
return it->first.substr(9);
}
} // namespace Inferno