browser DOM support
This commit is contained in:
parent
3859c43ce3
commit
5352ef69a2
37 changed files with 2637 additions and 59 deletions
|
|
@ -189,6 +189,153 @@ export namespace Crafter {
|
|||
case CrafterKeys::CrafterKeysMax: return 0;
|
||||
}
|
||||
#endif
|
||||
#ifdef CRAFTER_GRAPHICS_WINDOW_DOM
|
||||
// DOM mode: `KeyboardEvent.code` (a layout-independent physical-key
|
||||
// string like "KeyA" or "Space") is hashed to a 32-bit KeyCode in
|
||||
// dom-env.js and again here at compile time. FNV-1a was picked for
|
||||
// its trivial implementation — collision chance over the ~110-entry
|
||||
// key set is negligible.
|
||||
constexpr auto fnv = [](const char* s) constexpr -> KeyCode {
|
||||
std::uint32_t h = 2166136261u;
|
||||
while (*s) {
|
||||
h ^= static_cast<std::uint8_t>(*s++);
|
||||
h *= 16777619u;
|
||||
}
|
||||
return h;
|
||||
};
|
||||
switch (k) {
|
||||
// Alphabetic — KeyboardEvent.code uses "Key" prefix.
|
||||
case CrafterKeys::A: return fnv("KeyA");
|
||||
case CrafterKeys::B: return fnv("KeyB");
|
||||
case CrafterKeys::C: return fnv("KeyC");
|
||||
case CrafterKeys::D: return fnv("KeyD");
|
||||
case CrafterKeys::E: return fnv("KeyE");
|
||||
case CrafterKeys::F: return fnv("KeyF");
|
||||
case CrafterKeys::G: return fnv("KeyG");
|
||||
case CrafterKeys::H: return fnv("KeyH");
|
||||
case CrafterKeys::I: return fnv("KeyI");
|
||||
case CrafterKeys::J: return fnv("KeyJ");
|
||||
case CrafterKeys::K: return fnv("KeyK");
|
||||
case CrafterKeys::L: return fnv("KeyL");
|
||||
case CrafterKeys::M: return fnv("KeyM");
|
||||
case CrafterKeys::N: return fnv("KeyN");
|
||||
case CrafterKeys::O: return fnv("KeyO");
|
||||
case CrafterKeys::P: return fnv("KeyP");
|
||||
case CrafterKeys::Q: return fnv("KeyQ");
|
||||
case CrafterKeys::R: return fnv("KeyR");
|
||||
case CrafterKeys::S: return fnv("KeyS");
|
||||
case CrafterKeys::T: return fnv("KeyT");
|
||||
case CrafterKeys::U: return fnv("KeyU");
|
||||
case CrafterKeys::V: return fnv("KeyV");
|
||||
case CrafterKeys::W: return fnv("KeyW");
|
||||
case CrafterKeys::X: return fnv("KeyX");
|
||||
case CrafterKeys::Y: return fnv("KeyY");
|
||||
case CrafterKeys::Z: return fnv("KeyZ");
|
||||
// Numeric (top row) — DigitN.
|
||||
case CrafterKeys::_0: return fnv("Digit0");
|
||||
case CrafterKeys::_1: return fnv("Digit1");
|
||||
case CrafterKeys::_2: return fnv("Digit2");
|
||||
case CrafterKeys::_3: return fnv("Digit3");
|
||||
case CrafterKeys::_4: return fnv("Digit4");
|
||||
case CrafterKeys::_5: return fnv("Digit5");
|
||||
case CrafterKeys::_6: return fnv("Digit6");
|
||||
case CrafterKeys::_7: return fnv("Digit7");
|
||||
case CrafterKeys::_8: return fnv("Digit8");
|
||||
case CrafterKeys::_9: return fnv("Digit9");
|
||||
// Function keys.
|
||||
case CrafterKeys::F1: return fnv("F1");
|
||||
case CrafterKeys::F2: return fnv("F2");
|
||||
case CrafterKeys::F3: return fnv("F3");
|
||||
case CrafterKeys::F4: return fnv("F4");
|
||||
case CrafterKeys::F5: return fnv("F5");
|
||||
case CrafterKeys::F6: return fnv("F6");
|
||||
case CrafterKeys::F7: return fnv("F7");
|
||||
case CrafterKeys::F8: return fnv("F8");
|
||||
case CrafterKeys::F9: return fnv("F9");
|
||||
case CrafterKeys::F10: return fnv("F10");
|
||||
case CrafterKeys::F11: return fnv("F11");
|
||||
case CrafterKeys::F12: return fnv("F12");
|
||||
// Control keys.
|
||||
case CrafterKeys::Escape: return fnv("Escape");
|
||||
case CrafterKeys::Tab: return fnv("Tab");
|
||||
case CrafterKeys::Enter: return fnv("Enter");
|
||||
case CrafterKeys::Space: return fnv("Space");
|
||||
case CrafterKeys::Backspace: return fnv("Backspace");
|
||||
case CrafterKeys::Delete: return fnv("Delete");
|
||||
case CrafterKeys::Insert: return fnv("Insert");
|
||||
case CrafterKeys::Home: return fnv("Home");
|
||||
case CrafterKeys::End: return fnv("End");
|
||||
case CrafterKeys::PageUp: return fnv("PageUp");
|
||||
case CrafterKeys::PageDown: return fnv("PageDown");
|
||||
case CrafterKeys::CapsLock: return fnv("CapsLock");
|
||||
case CrafterKeys::NumLock: return fnv("NumLock");
|
||||
case CrafterKeys::ScrollLock: return fnv("ScrollLock");
|
||||
// Modifiers.
|
||||
case CrafterKeys::LeftShift: return fnv("ShiftLeft");
|
||||
case CrafterKeys::RightShift: return fnv("ShiftRight");
|
||||
case CrafterKeys::LeftCtrl: return fnv("ControlLeft");
|
||||
case CrafterKeys::RightCtrl: return fnv("ControlRight");
|
||||
case CrafterKeys::LeftAlt: return fnv("AltLeft");
|
||||
case CrafterKeys::RightAlt: return fnv("AltRight");
|
||||
case CrafterKeys::LeftSuper: return fnv("MetaLeft");
|
||||
case CrafterKeys::RightSuper: return fnv("MetaRight");
|
||||
// Arrows.
|
||||
case CrafterKeys::Up: return fnv("ArrowUp");
|
||||
case CrafterKeys::Down: return fnv("ArrowDown");
|
||||
case CrafterKeys::Left: return fnv("ArrowLeft");
|
||||
case CrafterKeys::Right: return fnv("ArrowRight");
|
||||
// Keypad.
|
||||
case CrafterKeys::keypad_0: return fnv("Numpad0");
|
||||
case CrafterKeys::keypad_1: return fnv("Numpad1");
|
||||
case CrafterKeys::keypad_2: return fnv("Numpad2");
|
||||
case CrafterKeys::keypad_3: return fnv("Numpad3");
|
||||
case CrafterKeys::keypad_4: return fnv("Numpad4");
|
||||
case CrafterKeys::keypad_5: return fnv("Numpad5");
|
||||
case CrafterKeys::keypad_6: return fnv("Numpad6");
|
||||
case CrafterKeys::keypad_7: return fnv("Numpad7");
|
||||
case CrafterKeys::keypad_8: return fnv("Numpad8");
|
||||
case CrafterKeys::keypad_9: return fnv("Numpad9");
|
||||
case CrafterKeys::keypad_enter: return fnv("NumpadEnter");
|
||||
case CrafterKeys::keypad_plus: return fnv("NumpadAdd");
|
||||
case CrafterKeys::keypad_minus: return fnv("NumpadSubtract");
|
||||
case CrafterKeys::keypad_multiply: return fnv("NumpadMultiply");
|
||||
case CrafterKeys::keypad_divide: return fnv("NumpadDivide");
|
||||
case CrafterKeys::keypad_decimal: return fnv("NumpadDecimal");
|
||||
// Punctuation.
|
||||
case CrafterKeys::grave: return fnv("Backquote");
|
||||
case CrafterKeys::minus: return fnv("Minus");
|
||||
case CrafterKeys::equal: return fnv("Equal");
|
||||
case CrafterKeys::bracket_left: return fnv("BracketLeft");
|
||||
case CrafterKeys::bracket_right: return fnv("BracketRight");
|
||||
case CrafterKeys::backslash: return fnv("Backslash");
|
||||
case CrafterKeys::semicolon: return fnv("Semicolon");
|
||||
case CrafterKeys::quote: return fnv("Quote");
|
||||
case CrafterKeys::comma: return fnv("Comma");
|
||||
case CrafterKeys::period: return fnv("Period");
|
||||
case CrafterKeys::slash: return fnv("Slash");
|
||||
case CrafterKeys::print_screen: return fnv("PrintScreen");
|
||||
case CrafterKeys::pause: return fnv("Pause");
|
||||
case CrafterKeys::menu: return fnv("ContextMenu");
|
||||
// Multimedia / browser / launch.
|
||||
case CrafterKeys::volume_up: return fnv("AudioVolumeUp");
|
||||
case CrafterKeys::volume_down: return fnv("AudioVolumeDown");
|
||||
case CrafterKeys::volume_mute: return fnv("AudioVolumeMute");
|
||||
case CrafterKeys::media_play: return fnv("MediaPlayPause");
|
||||
case CrafterKeys::media_stop: return fnv("MediaStop");
|
||||
case CrafterKeys::media_prev: return fnv("MediaTrackPrevious");
|
||||
case CrafterKeys::media_next: return fnv("MediaTrackNext");
|
||||
case CrafterKeys::browser_back: return fnv("BrowserBack");
|
||||
case CrafterKeys::browser_forward: return fnv("BrowserForward");
|
||||
case CrafterKeys::browser_refresh: return fnv("BrowserRefresh");
|
||||
case CrafterKeys::browser_stop: return fnv("BrowserStop");
|
||||
case CrafterKeys::browser_search: return fnv("BrowserSearch");
|
||||
case CrafterKeys::browser_home: return fnv("BrowserHome");
|
||||
case CrafterKeys::launch_mail: return fnv("LaunchMail");
|
||||
case CrafterKeys::launch_calculator: return fnv("LaunchApp2");
|
||||
case CrafterKeys::launch_media_player: return fnv("LaunchApp1");
|
||||
case CrafterKeys::CrafterKeysMax: return 0;
|
||||
}
|
||||
#endif
|
||||
#ifdef CRAFTER_GRAPHICS_WINDOW_WAYLAND
|
||||
// Linux kernel input-event-codes. The Wayland keyboard handler strips
|
||||
// the +8 X11 offset before delivery so these match wl_keyboard.key
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue