mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 15:40:19 +00:00
284 lines
13 KiB
C++
284 lines
13 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <andreas@ladybird.org>
|
|
* Copyright (c) 2024, Andrew Kaster <akaster@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/EnumBits.h>
|
|
#include <AK/Platform.h>
|
|
#include <AK/StringView.h>
|
|
#include <AK/Types.h>
|
|
|
|
namespace Web::UIEvents {
|
|
|
|
#define ENUMERATE_KEY_CODES \
|
|
__ENUMERATE_KEY_CODE(Invalid, "Invalid", 0x00) \
|
|
__ENUMERATE_KEY_CODE(Backspace, "Backspace", 0x08) \
|
|
__ENUMERATE_KEY_CODE(Tab, "Tab", 0x09) \
|
|
__ENUMERATE_KEY_CODE(Return, "Return", 0x0D) \
|
|
__ENUMERATE_KEY_CODE(LeftShift, "LeftShift", 0x10) \
|
|
__ENUMERATE_KEY_CODE(RightShift, "RightShift", 0xB0) \
|
|
__ENUMERATE_KEY_CODE(LeftControl, "LeftControl", 0x11) \
|
|
__ENUMERATE_KEY_CODE(RightControl, "RightControl", 0xB1) \
|
|
__ENUMERATE_KEY_CODE(LeftAlt, "LeftAlt", 0x12) \
|
|
__ENUMERATE_KEY_CODE(RightAlt, "RightAlt", 0xB2) \
|
|
__ENUMERATE_KEY_CODE(AltGr, "AltGr", 0xE1) \
|
|
__ENUMERATE_KEY_CODE(PauseBreak, "PauseBreak", 0x13) \
|
|
__ENUMERATE_KEY_CODE(CapsLock, "CapsLock", 0x14) \
|
|
__ENUMERATE_KEY_CODE(Escape, "Escape", 0x1B) \
|
|
__ENUMERATE_KEY_CODE(Space, "Space", 0x20) \
|
|
__ENUMERATE_KEY_CODE(PageUp, "PageUp", 0x21) \
|
|
__ENUMERATE_KEY_CODE(PageDown, "PageDown", 0x22) \
|
|
__ENUMERATE_KEY_CODE(End, "End", 0x23) \
|
|
__ENUMERATE_KEY_CODE(Home, "Home", 0x24) \
|
|
__ENUMERATE_KEY_CODE(Left, "Left", 0x25) \
|
|
__ENUMERATE_KEY_CODE(Up, "Up", 0x26) \
|
|
__ENUMERATE_KEY_CODE(Right, "Right", 0x27) \
|
|
__ENUMERATE_KEY_CODE(Down, "Down", 0x28) \
|
|
__ENUMERATE_KEY_CODE(PrintScreen, "PrintScreen", 0x2A) \
|
|
__ENUMERATE_KEY_CODE(SysRq, "SysRq", 0x2C) \
|
|
__ENUMERATE_KEY_CODE(Delete, "Delete", 0x2E) \
|
|
__ENUMERATE_KEY_CODE(0, "0", 0x30) \
|
|
__ENUMERATE_KEY_CODE(1, "1", 0x31) \
|
|
__ENUMERATE_KEY_CODE(2, "2", 0x32) \
|
|
__ENUMERATE_KEY_CODE(3, "3", 0x33) \
|
|
__ENUMERATE_KEY_CODE(4, "4", 0x34) \
|
|
__ENUMERATE_KEY_CODE(5, "5", 0x35) \
|
|
__ENUMERATE_KEY_CODE(6, "6", 0x36) \
|
|
__ENUMERATE_KEY_CODE(7, "7", 0x37) \
|
|
__ENUMERATE_KEY_CODE(8, "8", 0x38) \
|
|
__ENUMERATE_KEY_CODE(9, "9", 0x39) \
|
|
__ENUMERATE_KEY_CODE(A, "A", 0x41) \
|
|
__ENUMERATE_KEY_CODE(B, "B", 0x42) \
|
|
__ENUMERATE_KEY_CODE(C, "C", 0x43) \
|
|
__ENUMERATE_KEY_CODE(D, "D", 0x44) \
|
|
__ENUMERATE_KEY_CODE(E, "E", 0x45) \
|
|
__ENUMERATE_KEY_CODE(F, "F", 0x46) \
|
|
__ENUMERATE_KEY_CODE(G, "G", 0x47) \
|
|
__ENUMERATE_KEY_CODE(H, "H", 0x48) \
|
|
__ENUMERATE_KEY_CODE(I, "I", 0x49) \
|
|
__ENUMERATE_KEY_CODE(J, "J", 0x4A) \
|
|
__ENUMERATE_KEY_CODE(K, "K", 0x4B) \
|
|
__ENUMERATE_KEY_CODE(L, "L", 0x4C) \
|
|
__ENUMERATE_KEY_CODE(M, "M", 0x4D) \
|
|
__ENUMERATE_KEY_CODE(N, "N", 0x4E) \
|
|
__ENUMERATE_KEY_CODE(O, "O", 0x4F) \
|
|
__ENUMERATE_KEY_CODE(P, "P", 0x50) \
|
|
__ENUMERATE_KEY_CODE(Q, "Q", 0x51) \
|
|
__ENUMERATE_KEY_CODE(R, "R", 0x52) \
|
|
__ENUMERATE_KEY_CODE(S, "S", 0x53) \
|
|
__ENUMERATE_KEY_CODE(T, "T", 0x54) \
|
|
__ENUMERATE_KEY_CODE(U, "U", 0x55) \
|
|
__ENUMERATE_KEY_CODE(V, "V", 0x56) \
|
|
__ENUMERATE_KEY_CODE(W, "W", 0x57) \
|
|
__ENUMERATE_KEY_CODE(X, "X", 0x58) \
|
|
__ENUMERATE_KEY_CODE(Y, "Y", 0x59) \
|
|
__ENUMERATE_KEY_CODE(Z, "Z", 0x5A) \
|
|
__ENUMERATE_KEY_CODE(RightParen, ")", 0x60) \
|
|
__ENUMERATE_KEY_CODE(ExclamationPoint, "!", 0x61) \
|
|
__ENUMERATE_KEY_CODE(AtSign, "@", 0x62) \
|
|
__ENUMERATE_KEY_CODE(Hashtag, "#", 0x63) \
|
|
__ENUMERATE_KEY_CODE(Dollar, "$", 0x64) \
|
|
__ENUMERATE_KEY_CODE(Percent, "%", 0x65) \
|
|
__ENUMERATE_KEY_CODE(Circumflex, "^", 0x66) \
|
|
__ENUMERATE_KEY_CODE(Ampersand, "&", 0x67) \
|
|
__ENUMERATE_KEY_CODE(Asterisk, "*", 0x68) \
|
|
__ENUMERATE_KEY_CODE(LeftParen, "(", 0x69) \
|
|
__ENUMERATE_KEY_CODE(Plus, "+", 0x6A) \
|
|
__ENUMERATE_KEY_CODE(Minus, "-", 0x6B) \
|
|
__ENUMERATE_KEY_CODE(Slash, "/", 0x6C) \
|
|
__ENUMERATE_KEY_CODE(Comma, ",", 0x6D) \
|
|
__ENUMERATE_KEY_CODE(Period, ".", 0x6E) \
|
|
__ENUMERATE_KEY_CODE(Colon, ":", 0x6F) \
|
|
__ENUMERATE_KEY_CODE(F1, "F1", 0x70) \
|
|
__ENUMERATE_KEY_CODE(F2, "F2", 0x71) \
|
|
__ENUMERATE_KEY_CODE(F3, "F3", 0x72) \
|
|
__ENUMERATE_KEY_CODE(F4, "F4", 0x73) \
|
|
__ENUMERATE_KEY_CODE(F5, "F5", 0x74) \
|
|
__ENUMERATE_KEY_CODE(F6, "F6", 0x75) \
|
|
__ENUMERATE_KEY_CODE(F7, "F7", 0x76) \
|
|
__ENUMERATE_KEY_CODE(F8, "F8", 0x77) \
|
|
__ENUMERATE_KEY_CODE(F9, "F9", 0x78) \
|
|
__ENUMERATE_KEY_CODE(F10, "F10", 0x79) \
|
|
__ENUMERATE_KEY_CODE(F11, "F11", 0x7A) \
|
|
__ENUMERATE_KEY_CODE(F12, "F12", 0x7B) \
|
|
__ENUMERATE_KEY_CODE(DoubleQuote, "\"", 0x7C) \
|
|
__ENUMERATE_KEY_CODE(Apostrophe, "'", 0x7D) \
|
|
__ENUMERATE_KEY_CODE(Insert, "Insert", 0x7E) \
|
|
__ENUMERATE_KEY_CODE(Semicolon, ";", 0x7F) \
|
|
__ENUMERATE_KEY_CODE(LessThan, "<", 0x80) \
|
|
__ENUMERATE_KEY_CODE(Equal, "=", 0x81) \
|
|
__ENUMERATE_KEY_CODE(GreaterThan, ">", 0x82) \
|
|
__ENUMERATE_KEY_CODE(QuestionMark, "?", 0x83) \
|
|
__ENUMERATE_KEY_CODE(LeftBracket, "[", 0x84) \
|
|
__ENUMERATE_KEY_CODE(RightBracket, "]", 0x85) \
|
|
__ENUMERATE_KEY_CODE(Backslash, "\\", 0x86) \
|
|
__ENUMERATE_KEY_CODE(Underscore, "_", 0x87) \
|
|
__ENUMERATE_KEY_CODE(LeftBrace, "{", 0x88) \
|
|
__ENUMERATE_KEY_CODE(RightBrace, "}", 0x89) \
|
|
__ENUMERATE_KEY_CODE(Pipe, "|", 0x8A) \
|
|
__ENUMERATE_KEY_CODE(Tilde, "~", 0x8B) \
|
|
__ENUMERATE_KEY_CODE(Backtick, "`", 0x8C) \
|
|
__ENUMERATE_KEY_CODE(NumLock, "NumLock", 0x90) \
|
|
__ENUMERATE_KEY_CODE(ScrollLock, "ScrollLock", 0x91) \
|
|
__ENUMERATE_KEY_CODE(LeftSuper, "LeftSuper", 0x92) \
|
|
__ENUMERATE_KEY_CODE(RightSuper, "RightSuper", 0xAC) \
|
|
__ENUMERATE_KEY_CODE(BrowserSearch, "BrowserSearch", 0x93) \
|
|
__ENUMERATE_KEY_CODE(BrowserFavorites, "BrowserFavorites", 0x94) \
|
|
__ENUMERATE_KEY_CODE(BrowserHome, "BrowserHome", 0x95) \
|
|
__ENUMERATE_KEY_CODE(PreviousTrack, "PreviousTrack", 0x96) \
|
|
__ENUMERATE_KEY_CODE(BrowserBack, "BrowserBack", 0x97) \
|
|
__ENUMERATE_KEY_CODE(BrowserForward, "BrowserForward", 0x98) \
|
|
__ENUMERATE_KEY_CODE(BrowserRefresh, "BrowserRefresh", 0x99) \
|
|
__ENUMERATE_KEY_CODE(BrowserStop, "BrowserStop", 0x9A) \
|
|
__ENUMERATE_KEY_CODE(VolumeDown, "VolumeDown", 0x9B) \
|
|
__ENUMERATE_KEY_CODE(VolumeUp, "VolumeUp", 0x9C) \
|
|
__ENUMERATE_KEY_CODE(Wake, "Wake", 0x9D) \
|
|
__ENUMERATE_KEY_CODE(Sleep, "Sleep", 0x9E) \
|
|
__ENUMERATE_KEY_CODE(NextTrack, "NextTrack", 0x9F) \
|
|
__ENUMERATE_KEY_CODE(MediaSelect, "MediaSelect", 0xA0) \
|
|
__ENUMERATE_KEY_CODE(Email, "Email", 0xA1) \
|
|
__ENUMERATE_KEY_CODE(MyComputer, "MyComputer", 0xA2) \
|
|
__ENUMERATE_KEY_CODE(Power, "Power", 0xA3) \
|
|
__ENUMERATE_KEY_CODE(Stop, "Stop", 0xA4) \
|
|
__ENUMERATE_KEY_CODE(LeftGUI, "LeftGUI", 0xA5) \
|
|
__ENUMERATE_KEY_CODE(Mute, "Mute", 0xA6) \
|
|
__ENUMERATE_KEY_CODE(RightGUI, "RightGUI", 0xA7) \
|
|
__ENUMERATE_KEY_CODE(Calculator, "Calculator", 0xA8) \
|
|
__ENUMERATE_KEY_CODE(Apps, "Apps", 0xA9) \
|
|
__ENUMERATE_KEY_CODE(PlayPause, "PlayPause", 0xAA) \
|
|
__ENUMERATE_KEY_CODE(Menu, "Menu", 0xAB)
|
|
|
|
enum KeyCode : u8 {
|
|
#define __ENUMERATE_KEY_CODE(name, ui_name, code) Key_##name = code,
|
|
ENUMERATE_KEY_CODES
|
|
#undef __ENUMERATE_KEY_CODE
|
|
};
|
|
|
|
constexpr KeyCode key_code_from_string(StringView key_name)
|
|
{
|
|
#define __ENUMERATE_KEY_CODE(name, ui_name, code) \
|
|
if (key_name == ui_name##sv) \
|
|
return KeyCode::Key_##name;
|
|
ENUMERATE_KEY_CODES
|
|
#undef __ENUMERATE_KEY_CODE
|
|
|
|
VERIFY_NOT_REACHED();
|
|
}
|
|
|
|
enum KeyModifier {
|
|
Mod_None = 0x00,
|
|
Mod_Alt = (1 << 0),
|
|
Mod_Ctrl = (1 << 1),
|
|
Mod_Shift = (1 << 2),
|
|
Mod_Super = (1 << 3),
|
|
Mod_Keypad = (1 << 4),
|
|
Mod_Mask = Mod_Alt | Mod_Ctrl | Mod_Shift | Mod_Super | Mod_Keypad,
|
|
|
|
Is_Press = 0x80,
|
|
|
|
#if defined(AK_OS_MACOS)
|
|
Mod_PlatformCtrl = Mod_Super,
|
|
Mod_PlatformWordJump = Mod_Alt,
|
|
#else
|
|
Mod_PlatformCtrl = Mod_Ctrl,
|
|
Mod_PlatformWordJump = Mod_Ctrl,
|
|
#endif
|
|
};
|
|
|
|
AK_ENUM_BITWISE_OPERATORS(KeyModifier);
|
|
|
|
inline KeyCode code_point_to_key_code(u32 code_point)
|
|
{
|
|
switch (code_point) {
|
|
#define MATCH_ALPHA(letter) \
|
|
case #letter[0]: \
|
|
case #letter[0] + 32: \
|
|
return KeyCode::Key_##letter;
|
|
MATCH_ALPHA(A)
|
|
MATCH_ALPHA(B)
|
|
MATCH_ALPHA(C)
|
|
MATCH_ALPHA(D)
|
|
MATCH_ALPHA(E)
|
|
MATCH_ALPHA(F)
|
|
MATCH_ALPHA(G)
|
|
MATCH_ALPHA(H)
|
|
MATCH_ALPHA(I)
|
|
MATCH_ALPHA(J)
|
|
MATCH_ALPHA(K)
|
|
MATCH_ALPHA(L)
|
|
MATCH_ALPHA(M)
|
|
MATCH_ALPHA(N)
|
|
MATCH_ALPHA(O)
|
|
MATCH_ALPHA(P)
|
|
MATCH_ALPHA(Q)
|
|
MATCH_ALPHA(R)
|
|
MATCH_ALPHA(S)
|
|
MATCH_ALPHA(T)
|
|
MATCH_ALPHA(U)
|
|
MATCH_ALPHA(V)
|
|
MATCH_ALPHA(W)
|
|
MATCH_ALPHA(X)
|
|
MATCH_ALPHA(Y)
|
|
MATCH_ALPHA(Z)
|
|
#undef MATCH_ALPHA
|
|
|
|
#define MATCH_KEY(name, character) \
|
|
case character: \
|
|
return KeyCode::Key_##name;
|
|
MATCH_KEY(ExclamationPoint, '!')
|
|
MATCH_KEY(DoubleQuote, '"')
|
|
MATCH_KEY(Hashtag, '#')
|
|
MATCH_KEY(Dollar, '$')
|
|
MATCH_KEY(Percent, '%')
|
|
MATCH_KEY(Ampersand, '&')
|
|
MATCH_KEY(Apostrophe, '\'')
|
|
MATCH_KEY(LeftParen, '(')
|
|
MATCH_KEY(RightParen, ')')
|
|
MATCH_KEY(Asterisk, '*')
|
|
MATCH_KEY(Plus, '+')
|
|
MATCH_KEY(Comma, ',')
|
|
MATCH_KEY(Minus, '-')
|
|
MATCH_KEY(Period, '.')
|
|
MATCH_KEY(Slash, '/')
|
|
MATCH_KEY(0, '0')
|
|
MATCH_KEY(1, '1')
|
|
MATCH_KEY(2, '2')
|
|
MATCH_KEY(3, '3')
|
|
MATCH_KEY(4, '4')
|
|
MATCH_KEY(5, '5')
|
|
MATCH_KEY(6, '6')
|
|
MATCH_KEY(7, '7')
|
|
MATCH_KEY(8, '8')
|
|
MATCH_KEY(9, '9')
|
|
MATCH_KEY(Colon, ':')
|
|
MATCH_KEY(Semicolon, ';')
|
|
MATCH_KEY(LessThan, '<')
|
|
MATCH_KEY(Equal, '=')
|
|
MATCH_KEY(GreaterThan, '>')
|
|
MATCH_KEY(QuestionMark, '?')
|
|
MATCH_KEY(AtSign, '@')
|
|
MATCH_KEY(LeftBracket, '[')
|
|
MATCH_KEY(RightBracket, ']')
|
|
MATCH_KEY(Backslash, '\\')
|
|
MATCH_KEY(Circumflex, '^')
|
|
MATCH_KEY(Underscore, '_')
|
|
MATCH_KEY(LeftBrace, '{')
|
|
MATCH_KEY(RightBrace, '}')
|
|
MATCH_KEY(Pipe, '|')
|
|
MATCH_KEY(Tilde, '~')
|
|
MATCH_KEY(Backtick, '`')
|
|
MATCH_KEY(Space, ' ')
|
|
MATCH_KEY(Tab, '\t')
|
|
MATCH_KEY(Backspace, '\b')
|
|
#undef MATCH_KEY
|
|
|
|
default:
|
|
return KeyCode::Key_Invalid;
|
|
}
|
|
}
|
|
|
|
}
|