mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2024-12-23 20:36:53 +01:00
233 lines
8.9 KiB
C++
233 lines
8.9 KiB
C++
/*************************************************************************/
|
|
/* dom_keys.inc */
|
|
/*************************************************************************/
|
|
/* This file is part of: */
|
|
/* PANDEMONIUM ENGINE */
|
|
/* https://godotengine.org */
|
|
/*************************************************************************/
|
|
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
|
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
|
/* */
|
|
/* Permission is hereby granted, free of charge, to any person obtaining */
|
|
/* a copy of this software and associated documentation files (the */
|
|
/* "Software"), to deal in the Software without restriction, including */
|
|
/* without limitation the rights to use, copy, modify, merge, publish, */
|
|
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
|
/* permit persons to whom the Software is furnished to do so, subject to */
|
|
/* the following conditions: */
|
|
/* */
|
|
/* The above copyright notice and this permission notice shall be */
|
|
/* included in all copies or substantial portions of the Software. */
|
|
/* */
|
|
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
|
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
|
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
|
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
|
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
|
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|
/*************************************************************************/
|
|
|
|
#include "core/os/keyboard.h"
|
|
|
|
// See https://w3c.github.io/uievents-code/#code-value-tables
|
|
int dom_code2pandemonium_scancode(EM_UTF8 const p_code[32], EM_UTF8 const p_key[32], bool p_physical) {
|
|
#define DOM2PANDEMONIUM(p_str, p_pandemonium_code) \
|
|
if (memcmp((const void *)p_str, (void *)p_code, strlen(p_str) + 1) == 0) { \
|
|
return KEY_##p_pandemonium_code; \
|
|
}
|
|
|
|
// Numpad section.
|
|
DOM2PANDEMONIUM("NumLock", NUMLOCK);
|
|
DOM2PANDEMONIUM("Numpad0", KP_0);
|
|
DOM2PANDEMONIUM("Numpad1", KP_1);
|
|
DOM2PANDEMONIUM("Numpad2", KP_2);
|
|
DOM2PANDEMONIUM("Numpad3", KP_3);
|
|
DOM2PANDEMONIUM("Numpad4", KP_4);
|
|
DOM2PANDEMONIUM("Numpad5", KP_5);
|
|
DOM2PANDEMONIUM("Numpad6", KP_6);
|
|
DOM2PANDEMONIUM("Numpad7", KP_7);
|
|
DOM2PANDEMONIUM("Numpad8", KP_8);
|
|
DOM2PANDEMONIUM("Numpad9", KP_9);
|
|
DOM2PANDEMONIUM("NumpadAdd", KP_ADD);
|
|
DOM2PANDEMONIUM("NumpadBackspace", BACKSPACE);
|
|
DOM2PANDEMONIUM("NumpadClear", CLEAR);
|
|
DOM2PANDEMONIUM("NumpadClearEntry", CLEAR);
|
|
//DOM2PANDEMONIUM("NumpadComma", UNKNOWN);
|
|
DOM2PANDEMONIUM("NumpadDecimal", KP_PERIOD);
|
|
DOM2PANDEMONIUM("NumpadDivide", KP_DIVIDE);
|
|
DOM2PANDEMONIUM("NumpadEnter", KP_ENTER);
|
|
DOM2PANDEMONIUM("NumpadEqual", EQUAL);
|
|
//DOM2PANDEMONIUM("NumpadHash", UNKNOWN);
|
|
//DOM2PANDEMONIUM("NumpadMemoryAdd", UNKNOWN);
|
|
//DOM2PANDEMONIUM("NumpadMemoryClear", UNKNOWN);
|
|
//DOM2PANDEMONIUM("NumpadMemoryRecall", UNKNOWN);
|
|
//DOM2PANDEMONIUM("NumpadMemoryStore", UNKNOWN);
|
|
//DOM2PANDEMONIUM("NumpadMemorySubtract", UNKNOWN);
|
|
DOM2PANDEMONIUM("NumpadMultiply", KP_MULTIPLY);
|
|
DOM2PANDEMONIUM("NumpadParenLeft", PARENLEFT);
|
|
DOM2PANDEMONIUM("NumpadParenRight", PARENRIGHT);
|
|
DOM2PANDEMONIUM("NumpadStar", KP_MULTIPLY); // or ASTERISK ?
|
|
DOM2PANDEMONIUM("NumpadSubtract", KP_SUBTRACT);
|
|
|
|
// Printable ASCII.
|
|
if (!p_physical) {
|
|
uint8_t b0 = (uint8_t)p_key[0];
|
|
uint8_t b1 = (uint8_t)p_key[1];
|
|
uint8_t b2 = (uint8_t)p_key[2];
|
|
if (b1 == 0 && b0 > 0x1F && b0 < 0x7F) { // ASCII.
|
|
if (b0 > 0x60 && b0 < 0x7B) { // Lowercase ASCII.
|
|
b0 -= 32;
|
|
}
|
|
return b0;
|
|
}
|
|
|
|
#define _U_2BYTES_MASK 0xE0
|
|
#define _U_2BYTES 0xC0
|
|
// Latin-1 codes.
|
|
if (b2 == 0 && (b0 & _U_2BYTES_MASK) == _U_2BYTES) { // 2-bytes utf8, only known latin.
|
|
uint32_t key = ((b0 & ~_U_2BYTES_MASK) << 6) | (b1 & 0x3F);
|
|
if (key >= 0xA0 && key <= 0xDF) {
|
|
return key;
|
|
}
|
|
if (key >= 0xE0 && key <= 0xFF) { // Lowercase known latin.
|
|
key -= 0x20;
|
|
return key;
|
|
}
|
|
}
|
|
#undef _U_2BYTES_MASK
|
|
#undef _U_2BYTES
|
|
}
|
|
|
|
// Alphanumeric section.
|
|
DOM2PANDEMONIUM("Backquote", QUOTELEFT);
|
|
DOM2PANDEMONIUM("Backslash", BACKSLASH);
|
|
DOM2PANDEMONIUM("BracketLeft", BRACKETLEFT);
|
|
DOM2PANDEMONIUM("BracketRight", BRACKETRIGHT);
|
|
DOM2PANDEMONIUM("Comma", COMMA);
|
|
DOM2PANDEMONIUM("Digit0", 0);
|
|
DOM2PANDEMONIUM("Digit1", 1);
|
|
DOM2PANDEMONIUM("Digit2", 2);
|
|
DOM2PANDEMONIUM("Digit3", 3);
|
|
DOM2PANDEMONIUM("Digit4", 4);
|
|
DOM2PANDEMONIUM("Digit5", 5);
|
|
DOM2PANDEMONIUM("Digit6", 6);
|
|
DOM2PANDEMONIUM("Digit7", 7);
|
|
DOM2PANDEMONIUM("Digit8", 8);
|
|
DOM2PANDEMONIUM("Digit9", 9);
|
|
DOM2PANDEMONIUM("Equal", EQUAL);
|
|
DOM2PANDEMONIUM("IntlBackslash", BACKSLASH);
|
|
//DOM2PANDEMONIUM("IntlRo", UNKNOWN);
|
|
DOM2PANDEMONIUM("IntlYen", YEN);
|
|
|
|
DOM2PANDEMONIUM("KeyA", A);
|
|
DOM2PANDEMONIUM("KeyB", B);
|
|
DOM2PANDEMONIUM("KeyC", C);
|
|
DOM2PANDEMONIUM("KeyD", D);
|
|
DOM2PANDEMONIUM("KeyE", E);
|
|
DOM2PANDEMONIUM("KeyF", F);
|
|
DOM2PANDEMONIUM("KeyG", G);
|
|
DOM2PANDEMONIUM("KeyH", H);
|
|
DOM2PANDEMONIUM("KeyI", I);
|
|
DOM2PANDEMONIUM("KeyJ", J);
|
|
DOM2PANDEMONIUM("KeyK", K);
|
|
DOM2PANDEMONIUM("KeyL", L);
|
|
DOM2PANDEMONIUM("KeyM", M);
|
|
DOM2PANDEMONIUM("KeyN", N);
|
|
DOM2PANDEMONIUM("KeyO", O);
|
|
DOM2PANDEMONIUM("KeyP", P);
|
|
DOM2PANDEMONIUM("KeyQ", Q);
|
|
DOM2PANDEMONIUM("KeyR", R);
|
|
DOM2PANDEMONIUM("KeyS", S);
|
|
DOM2PANDEMONIUM("KeyT", T);
|
|
DOM2PANDEMONIUM("KeyU", U);
|
|
DOM2PANDEMONIUM("KeyV", V);
|
|
DOM2PANDEMONIUM("KeyW", W);
|
|
DOM2PANDEMONIUM("KeyX", X);
|
|
DOM2PANDEMONIUM("KeyY", Y);
|
|
DOM2PANDEMONIUM("KeyZ", Z);
|
|
|
|
DOM2PANDEMONIUM("Minus", MINUS);
|
|
DOM2PANDEMONIUM("Period", PERIOD);
|
|
DOM2PANDEMONIUM("Quote", APOSTROPHE);
|
|
DOM2PANDEMONIUM("Semicolon", SEMICOLON);
|
|
DOM2PANDEMONIUM("Slash", SLASH);
|
|
|
|
// Functional keys in the Alphanumeric section.
|
|
DOM2PANDEMONIUM("AltLeft", ALT);
|
|
DOM2PANDEMONIUM("AltRight", ALT);
|
|
DOM2PANDEMONIUM("Backspace", BACKSPACE);
|
|
DOM2PANDEMONIUM("CapsLock", CAPSLOCK);
|
|
DOM2PANDEMONIUM("ContextMenu", MENU);
|
|
DOM2PANDEMONIUM("ControlLeft", CONTROL);
|
|
DOM2PANDEMONIUM("ControlRight", CONTROL);
|
|
DOM2PANDEMONIUM("Enter", ENTER);
|
|
DOM2PANDEMONIUM("MetaLeft", SUPER_L);
|
|
DOM2PANDEMONIUM("MetaRight", SUPER_R);
|
|
DOM2PANDEMONIUM("ShiftLeft", SHIFT);
|
|
DOM2PANDEMONIUM("ShiftRight", SHIFT);
|
|
DOM2PANDEMONIUM("Space", SPACE);
|
|
DOM2PANDEMONIUM("Tab", TAB);
|
|
|
|
// ControlPad section.
|
|
DOM2PANDEMONIUM("Delete", DELETE);
|
|
DOM2PANDEMONIUM("End", END);
|
|
DOM2PANDEMONIUM("Help", HELP);
|
|
DOM2PANDEMONIUM("Home", HOME);
|
|
DOM2PANDEMONIUM("Insert", INSERT);
|
|
DOM2PANDEMONIUM("PageDown", PAGEDOWN);
|
|
DOM2PANDEMONIUM("PageUp", PAGEUP);
|
|
|
|
// ArrowPad section.
|
|
DOM2PANDEMONIUM("ArrowDown", DOWN);
|
|
DOM2PANDEMONIUM("ArrowLeft", LEFT);
|
|
DOM2PANDEMONIUM("ArrowRight", RIGHT);
|
|
DOM2PANDEMONIUM("ArrowUp", UP);
|
|
|
|
// Function section.
|
|
DOM2PANDEMONIUM("Escape", ESCAPE);
|
|
DOM2PANDEMONIUM("F1", F1);
|
|
DOM2PANDEMONIUM("F2", F2);
|
|
DOM2PANDEMONIUM("F3", F3);
|
|
DOM2PANDEMONIUM("F4", F4);
|
|
DOM2PANDEMONIUM("F5", F5);
|
|
DOM2PANDEMONIUM("F6", F6);
|
|
DOM2PANDEMONIUM("F7", F7);
|
|
DOM2PANDEMONIUM("F8", F8);
|
|
DOM2PANDEMONIUM("F9", F9);
|
|
DOM2PANDEMONIUM("F10", F10);
|
|
DOM2PANDEMONIUM("F11", F11);
|
|
DOM2PANDEMONIUM("F12", F12);
|
|
//DOM2PANDEMONIUM("Fn", UNKNOWN); // never actually fired, but included in the standard draft.
|
|
//DOM2PANDEMONIUM("FnLock", UNKNOWN);
|
|
DOM2PANDEMONIUM("PrintScreen", PRINT);
|
|
DOM2PANDEMONIUM("ScrollLock", SCROLLLOCK);
|
|
DOM2PANDEMONIUM("Pause", PAUSE);
|
|
|
|
// Media keys section.
|
|
DOM2PANDEMONIUM("BrowserBack", BACK);
|
|
DOM2PANDEMONIUM("BrowserFavorites", FAVORITES);
|
|
DOM2PANDEMONIUM("BrowserForward", FORWARD);
|
|
DOM2PANDEMONIUM("BrowserHome", OPENURL);
|
|
DOM2PANDEMONIUM("BrowserRefresh", REFRESH);
|
|
DOM2PANDEMONIUM("BrowserSearch", SEARCH);
|
|
DOM2PANDEMONIUM("BrowserStop", STOP);
|
|
//DOM2PANDEMONIUM("Eject", UNKNOWN);
|
|
DOM2PANDEMONIUM("LaunchApp1", LAUNCH0);
|
|
DOM2PANDEMONIUM("LaunchApp2", LAUNCH1);
|
|
DOM2PANDEMONIUM("LaunchMail", LAUNCHMAIL);
|
|
DOM2PANDEMONIUM("MediaPlayPause", MEDIAPLAY);
|
|
DOM2PANDEMONIUM("MediaSelect", LAUNCHMEDIA);
|
|
DOM2PANDEMONIUM("MediaStop", MEDIASTOP);
|
|
DOM2PANDEMONIUM("MediaTrackNext", MEDIANEXT);
|
|
DOM2PANDEMONIUM("MediaTrackPrevious", MEDIAPREVIOUS);
|
|
//DOM2PANDEMONIUM("Power", UNKNOWN);
|
|
//DOM2PANDEMONIUM("Sleep", UNKNOWN);
|
|
DOM2PANDEMONIUM("AudioVolumeDown", VOLUMEDOWN);
|
|
DOM2PANDEMONIUM("AudioVolumeMute", VOLUMEMUTE);
|
|
DOM2PANDEMONIUM("AudioVolumeUp", VOLUMEUP);
|
|
//DOM2PANDEMONIUM("WakeUp", UNKNOWN);
|
|
return KEY_UNKNOWN;
|
|
#undef DOM2PANDEMONIUM
|
|
}
|