mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 08:44:58 +00:00
Kernel+Userland: Implement support for PS2 scan code set 2
This scan code set is more advanced than the basic scan code set 1, and is required to be supported for some bare metal hardware that might not properly enable the PS2 first port translation in the i8042 controller. LibWeb can now also generate bindings for keyboard events like the Pause key, as well as other function keys (such as Right Alt, etc). The logic for handling scan code sets is implemented by the PS2 keyboard driver and is abstracted from the main HID KeyboardDevice code which only handles "standard" KeyEvent(s).
This commit is contained in:
parent
cae184d7cf
commit
c8f27d7cb8
12 changed files with 991 additions and 439 deletions
|
@ -8,113 +8,140 @@
|
|||
|
||||
#include <AK/Types.h>
|
||||
|
||||
#define ENUMERATE_KEY_CODES \
|
||||
__ENUMERATE_KEY_CODE(Invalid, "Invalid") \
|
||||
__ENUMERATE_KEY_CODE(Escape, "Escape") \
|
||||
__ENUMERATE_KEY_CODE(Tab, "Tab") \
|
||||
__ENUMERATE_KEY_CODE(Backspace, "Backspace") \
|
||||
__ENUMERATE_KEY_CODE(Return, "Return") \
|
||||
__ENUMERATE_KEY_CODE(Insert, "Insert") \
|
||||
__ENUMERATE_KEY_CODE(Delete, "Delete") \
|
||||
__ENUMERATE_KEY_CODE(PrintScreen, "PrintScreen") \
|
||||
__ENUMERATE_KEY_CODE(SysRq, "SysRq") \
|
||||
__ENUMERATE_KEY_CODE(Home, "Home") \
|
||||
__ENUMERATE_KEY_CODE(End, "End") \
|
||||
__ENUMERATE_KEY_CODE(Left, "Left") \
|
||||
__ENUMERATE_KEY_CODE(Up, "Up") \
|
||||
__ENUMERATE_KEY_CODE(Right, "Right") \
|
||||
__ENUMERATE_KEY_CODE(Down, "Down") \
|
||||
__ENUMERATE_KEY_CODE(PageUp, "PageUp") \
|
||||
__ENUMERATE_KEY_CODE(PageDown, "PageDown") \
|
||||
__ENUMERATE_KEY_CODE(LeftShift, "LeftShift") \
|
||||
__ENUMERATE_KEY_CODE(RightShift, "RightShift") \
|
||||
__ENUMERATE_KEY_CODE(Control, "Ctrl") \
|
||||
__ENUMERATE_KEY_CODE(Alt, "Alt") \
|
||||
__ENUMERATE_KEY_CODE(CapsLock, "CapsLock") \
|
||||
__ENUMERATE_KEY_CODE(NumLock, "NumLock") \
|
||||
__ENUMERATE_KEY_CODE(ScrollLock, "ScrollLock") \
|
||||
__ENUMERATE_KEY_CODE(F1, "F1") \
|
||||
__ENUMERATE_KEY_CODE(F2, "F2") \
|
||||
__ENUMERATE_KEY_CODE(F3, "F3") \
|
||||
__ENUMERATE_KEY_CODE(F4, "F4") \
|
||||
__ENUMERATE_KEY_CODE(F5, "F5") \
|
||||
__ENUMERATE_KEY_CODE(F6, "F6") \
|
||||
__ENUMERATE_KEY_CODE(F7, "F7") \
|
||||
__ENUMERATE_KEY_CODE(F8, "F8") \
|
||||
__ENUMERATE_KEY_CODE(F9, "F9") \
|
||||
__ENUMERATE_KEY_CODE(F10, "F10") \
|
||||
__ENUMERATE_KEY_CODE(F11, "F11") \
|
||||
__ENUMERATE_KEY_CODE(F12, "F12") \
|
||||
__ENUMERATE_KEY_CODE(Space, "Space") \
|
||||
__ENUMERATE_KEY_CODE(ExclamationPoint, "!") \
|
||||
__ENUMERATE_KEY_CODE(DoubleQuote, "\"") \
|
||||
__ENUMERATE_KEY_CODE(Hashtag, "#") \
|
||||
__ENUMERATE_KEY_CODE(Dollar, "$") \
|
||||
__ENUMERATE_KEY_CODE(Percent, "%") \
|
||||
__ENUMERATE_KEY_CODE(Ampersand, "&") \
|
||||
__ENUMERATE_KEY_CODE(Apostrophe, "'") \
|
||||
__ENUMERATE_KEY_CODE(LeftParen, "(") \
|
||||
__ENUMERATE_KEY_CODE(RightParen, ")") \
|
||||
__ENUMERATE_KEY_CODE(Asterisk, "*") \
|
||||
__ENUMERATE_KEY_CODE(Plus, "+") \
|
||||
__ENUMERATE_KEY_CODE(Comma, ",") \
|
||||
__ENUMERATE_KEY_CODE(Minus, "-") \
|
||||
__ENUMERATE_KEY_CODE(Period, ".") \
|
||||
__ENUMERATE_KEY_CODE(Slash, "/") \
|
||||
__ENUMERATE_KEY_CODE(0, "0") \
|
||||
__ENUMERATE_KEY_CODE(1, "1") \
|
||||
__ENUMERATE_KEY_CODE(2, "2") \
|
||||
__ENUMERATE_KEY_CODE(3, "3") \
|
||||
__ENUMERATE_KEY_CODE(4, "4") \
|
||||
__ENUMERATE_KEY_CODE(5, "5") \
|
||||
__ENUMERATE_KEY_CODE(6, "6") \
|
||||
__ENUMERATE_KEY_CODE(7, "7") \
|
||||
__ENUMERATE_KEY_CODE(8, "8") \
|
||||
__ENUMERATE_KEY_CODE(9, "9") \
|
||||
__ENUMERATE_KEY_CODE(Colon, ":") \
|
||||
__ENUMERATE_KEY_CODE(Semicolon, ";") \
|
||||
__ENUMERATE_KEY_CODE(LessThan, "<") \
|
||||
__ENUMERATE_KEY_CODE(Equal, "=") \
|
||||
__ENUMERATE_KEY_CODE(GreaterThan, ">") \
|
||||
__ENUMERATE_KEY_CODE(QuestionMark, "?") \
|
||||
__ENUMERATE_KEY_CODE(AtSign, "@") \
|
||||
__ENUMERATE_KEY_CODE(A, "A") \
|
||||
__ENUMERATE_KEY_CODE(B, "B") \
|
||||
__ENUMERATE_KEY_CODE(C, "C") \
|
||||
__ENUMERATE_KEY_CODE(D, "D") \
|
||||
__ENUMERATE_KEY_CODE(E, "E") \
|
||||
__ENUMERATE_KEY_CODE(F, "F") \
|
||||
__ENUMERATE_KEY_CODE(G, "G") \
|
||||
__ENUMERATE_KEY_CODE(H, "H") \
|
||||
__ENUMERATE_KEY_CODE(I, "I") \
|
||||
__ENUMERATE_KEY_CODE(J, "J") \
|
||||
__ENUMERATE_KEY_CODE(K, "K") \
|
||||
__ENUMERATE_KEY_CODE(L, "L") \
|
||||
__ENUMERATE_KEY_CODE(M, "M") \
|
||||
__ENUMERATE_KEY_CODE(N, "N") \
|
||||
__ENUMERATE_KEY_CODE(O, "O") \
|
||||
__ENUMERATE_KEY_CODE(P, "P") \
|
||||
__ENUMERATE_KEY_CODE(Q, "Q") \
|
||||
__ENUMERATE_KEY_CODE(R, "R") \
|
||||
__ENUMERATE_KEY_CODE(S, "S") \
|
||||
__ENUMERATE_KEY_CODE(T, "T") \
|
||||
__ENUMERATE_KEY_CODE(U, "U") \
|
||||
__ENUMERATE_KEY_CODE(V, "V") \
|
||||
__ENUMERATE_KEY_CODE(W, "W") \
|
||||
__ENUMERATE_KEY_CODE(X, "X") \
|
||||
__ENUMERATE_KEY_CODE(Y, "Y") \
|
||||
__ENUMERATE_KEY_CODE(Z, "Z") \
|
||||
__ENUMERATE_KEY_CODE(LeftBracket, "[") \
|
||||
__ENUMERATE_KEY_CODE(RightBracket, "]") \
|
||||
__ENUMERATE_KEY_CODE(Backslash, "\\") \
|
||||
__ENUMERATE_KEY_CODE(Circumflex, "^") \
|
||||
__ENUMERATE_KEY_CODE(Underscore, "_") \
|
||||
__ENUMERATE_KEY_CODE(LeftBrace, "{") \
|
||||
__ENUMERATE_KEY_CODE(RightBrace, "}") \
|
||||
__ENUMERATE_KEY_CODE(Pipe, "|") \
|
||||
__ENUMERATE_KEY_CODE(Tilde, "~") \
|
||||
__ENUMERATE_KEY_CODE(Backtick, "`") \
|
||||
__ENUMERATE_KEY_CODE(Super, "Super") \
|
||||
#define ENUMERATE_KEY_CODES \
|
||||
__ENUMERATE_KEY_CODE(Invalid, "Invalid") \
|
||||
__ENUMERATE_KEY_CODE(Escape, "Escape") \
|
||||
__ENUMERATE_KEY_CODE(Tab, "Tab") \
|
||||
__ENUMERATE_KEY_CODE(Backspace, "Backspace") \
|
||||
__ENUMERATE_KEY_CODE(Return, "Return") \
|
||||
__ENUMERATE_KEY_CODE(Insert, "Insert") \
|
||||
__ENUMERATE_KEY_CODE(Delete, "Delete") \
|
||||
__ENUMERATE_KEY_CODE(PrintScreen, "PrintScreen") \
|
||||
__ENUMERATE_KEY_CODE(PauseBreak, "PauseBreak") \
|
||||
__ENUMERATE_KEY_CODE(SysRq, "SysRq") \
|
||||
__ENUMERATE_KEY_CODE(Home, "Home") \
|
||||
__ENUMERATE_KEY_CODE(End, "End") \
|
||||
__ENUMERATE_KEY_CODE(Left, "Left") \
|
||||
__ENUMERATE_KEY_CODE(Up, "Up") \
|
||||
__ENUMERATE_KEY_CODE(Right, "Right") \
|
||||
__ENUMERATE_KEY_CODE(Down, "Down") \
|
||||
__ENUMERATE_KEY_CODE(PageUp, "PageUp") \
|
||||
__ENUMERATE_KEY_CODE(PageDown, "PageDown") \
|
||||
__ENUMERATE_KEY_CODE(LeftShift, "LeftShift") \
|
||||
__ENUMERATE_KEY_CODE(RightShift, "RightShift") \
|
||||
__ENUMERATE_KEY_CODE(Control, "Ctrl") \
|
||||
__ENUMERATE_KEY_CODE(RightControl, "RightCtrl") \
|
||||
__ENUMERATE_KEY_CODE(Alt, "Alt") \
|
||||
__ENUMERATE_KEY_CODE(RightAlt, "Alt") \
|
||||
__ENUMERATE_KEY_CODE(CapsLock, "CapsLock") \
|
||||
__ENUMERATE_KEY_CODE(NumLock, "NumLock") \
|
||||
__ENUMERATE_KEY_CODE(ScrollLock, "ScrollLock") \
|
||||
__ENUMERATE_KEY_CODE(F1, "F1") \
|
||||
__ENUMERATE_KEY_CODE(F2, "F2") \
|
||||
__ENUMERATE_KEY_CODE(F3, "F3") \
|
||||
__ENUMERATE_KEY_CODE(F4, "F4") \
|
||||
__ENUMERATE_KEY_CODE(F5, "F5") \
|
||||
__ENUMERATE_KEY_CODE(F6, "F6") \
|
||||
__ENUMERATE_KEY_CODE(F7, "F7") \
|
||||
__ENUMERATE_KEY_CODE(F8, "F8") \
|
||||
__ENUMERATE_KEY_CODE(F9, "F9") \
|
||||
__ENUMERATE_KEY_CODE(F10, "F10") \
|
||||
__ENUMERATE_KEY_CODE(F11, "F11") \
|
||||
__ENUMERATE_KEY_CODE(F12, "F12") \
|
||||
__ENUMERATE_KEY_CODE(Space, "Space") \
|
||||
__ENUMERATE_KEY_CODE(ExclamationPoint, "!") \
|
||||
__ENUMERATE_KEY_CODE(DoubleQuote, "\"") \
|
||||
__ENUMERATE_KEY_CODE(Hashtag, "#") \
|
||||
__ENUMERATE_KEY_CODE(Dollar, "$") \
|
||||
__ENUMERATE_KEY_CODE(Percent, "%") \
|
||||
__ENUMERATE_KEY_CODE(Ampersand, "&") \
|
||||
__ENUMERATE_KEY_CODE(Apostrophe, "'") \
|
||||
__ENUMERATE_KEY_CODE(LeftParen, "(") \
|
||||
__ENUMERATE_KEY_CODE(RightParen, ")") \
|
||||
__ENUMERATE_KEY_CODE(Asterisk, "*") \
|
||||
__ENUMERATE_KEY_CODE(Plus, "+") \
|
||||
__ENUMERATE_KEY_CODE(Comma, ",") \
|
||||
__ENUMERATE_KEY_CODE(Minus, "-") \
|
||||
__ENUMERATE_KEY_CODE(Period, ".") \
|
||||
__ENUMERATE_KEY_CODE(Slash, "/") \
|
||||
__ENUMERATE_KEY_CODE(0, "0") \
|
||||
__ENUMERATE_KEY_CODE(1, "1") \
|
||||
__ENUMERATE_KEY_CODE(2, "2") \
|
||||
__ENUMERATE_KEY_CODE(3, "3") \
|
||||
__ENUMERATE_KEY_CODE(4, "4") \
|
||||
__ENUMERATE_KEY_CODE(5, "5") \
|
||||
__ENUMERATE_KEY_CODE(6, "6") \
|
||||
__ENUMERATE_KEY_CODE(7, "7") \
|
||||
__ENUMERATE_KEY_CODE(8, "8") \
|
||||
__ENUMERATE_KEY_CODE(9, "9") \
|
||||
__ENUMERATE_KEY_CODE(Colon, ":") \
|
||||
__ENUMERATE_KEY_CODE(Semicolon, ";") \
|
||||
__ENUMERATE_KEY_CODE(LessThan, "<") \
|
||||
__ENUMERATE_KEY_CODE(Equal, "=") \
|
||||
__ENUMERATE_KEY_CODE(GreaterThan, ">") \
|
||||
__ENUMERATE_KEY_CODE(QuestionMark, "?") \
|
||||
__ENUMERATE_KEY_CODE(AtSign, "@") \
|
||||
__ENUMERATE_KEY_CODE(A, "A") \
|
||||
__ENUMERATE_KEY_CODE(B, "B") \
|
||||
__ENUMERATE_KEY_CODE(C, "C") \
|
||||
__ENUMERATE_KEY_CODE(D, "D") \
|
||||
__ENUMERATE_KEY_CODE(E, "E") \
|
||||
__ENUMERATE_KEY_CODE(F, "F") \
|
||||
__ENUMERATE_KEY_CODE(G, "G") \
|
||||
__ENUMERATE_KEY_CODE(H, "H") \
|
||||
__ENUMERATE_KEY_CODE(I, "I") \
|
||||
__ENUMERATE_KEY_CODE(J, "J") \
|
||||
__ENUMERATE_KEY_CODE(K, "K") \
|
||||
__ENUMERATE_KEY_CODE(L, "L") \
|
||||
__ENUMERATE_KEY_CODE(M, "M") \
|
||||
__ENUMERATE_KEY_CODE(N, "N") \
|
||||
__ENUMERATE_KEY_CODE(O, "O") \
|
||||
__ENUMERATE_KEY_CODE(P, "P") \
|
||||
__ENUMERATE_KEY_CODE(Q, "Q") \
|
||||
__ENUMERATE_KEY_CODE(R, "R") \
|
||||
__ENUMERATE_KEY_CODE(S, "S") \
|
||||
__ENUMERATE_KEY_CODE(T, "T") \
|
||||
__ENUMERATE_KEY_CODE(U, "U") \
|
||||
__ENUMERATE_KEY_CODE(V, "V") \
|
||||
__ENUMERATE_KEY_CODE(W, "W") \
|
||||
__ENUMERATE_KEY_CODE(X, "X") \
|
||||
__ENUMERATE_KEY_CODE(Y, "Y") \
|
||||
__ENUMERATE_KEY_CODE(Z, "Z") \
|
||||
__ENUMERATE_KEY_CODE(LeftBracket, "[") \
|
||||
__ENUMERATE_KEY_CODE(RightBracket, "]") \
|
||||
__ENUMERATE_KEY_CODE(Backslash, "\\") \
|
||||
__ENUMERATE_KEY_CODE(Circumflex, "^") \
|
||||
__ENUMERATE_KEY_CODE(Underscore, "_") \
|
||||
__ENUMERATE_KEY_CODE(LeftBrace, "{") \
|
||||
__ENUMERATE_KEY_CODE(RightBrace, "}") \
|
||||
__ENUMERATE_KEY_CODE(Pipe, "|") \
|
||||
__ENUMERATE_KEY_CODE(Tilde, "~") \
|
||||
__ENUMERATE_KEY_CODE(Backtick, "`") \
|
||||
__ENUMERATE_KEY_CODE(Super, "Super") \
|
||||
__ENUMERATE_KEY_CODE(BrowserSearch, "BrowserSearch") \
|
||||
__ENUMERATE_KEY_CODE(BrowserFavorites, "BrowserFavorites") \
|
||||
__ENUMERATE_KEY_CODE(BrowserHome, "BrowserHome") \
|
||||
__ENUMERATE_KEY_CODE(PreviousTrack, "PreviousTrack") \
|
||||
__ENUMERATE_KEY_CODE(BrowserBack, "BrowserBack") \
|
||||
__ENUMERATE_KEY_CODE(BrowserForward, "BrowserForward") \
|
||||
__ENUMERATE_KEY_CODE(BrowserRefresh, "BrowserRefresh") \
|
||||
__ENUMERATE_KEY_CODE(BrowserStop, "BrowserStop") \
|
||||
__ENUMERATE_KEY_CODE(VolumeDown, "VolumeDown") \
|
||||
__ENUMERATE_KEY_CODE(VolumeUp, "VolumeUp") \
|
||||
__ENUMERATE_KEY_CODE(Wake, "Wake") \
|
||||
__ENUMERATE_KEY_CODE(Sleep, "Sleep") \
|
||||
__ENUMERATE_KEY_CODE(NextTrack, "NextTrack") \
|
||||
__ENUMERATE_KEY_CODE(MediaSelect, "MediaSelect") \
|
||||
__ENUMERATE_KEY_CODE(Email, "Email") \
|
||||
__ENUMERATE_KEY_CODE(MyComputer, "MyComputer") \
|
||||
__ENUMERATE_KEY_CODE(Power, "Power") \
|
||||
__ENUMERATE_KEY_CODE(Stop, "Stop") \
|
||||
__ENUMERATE_KEY_CODE(LeftGUI, "LeftGUI") \
|
||||
__ENUMERATE_KEY_CODE(Mute, "Mute") \
|
||||
__ENUMERATE_KEY_CODE(RightGUI, "RightGUI") \
|
||||
__ENUMERATE_KEY_CODE(Calculator, "Calculator") \
|
||||
__ENUMERATE_KEY_CODE(Apps, "Apps") \
|
||||
__ENUMERATE_KEY_CODE(PlayPause, "PlayPause") \
|
||||
__ENUMERATE_KEY_CODE(Menu, "Menu")
|
||||
|
||||
enum KeyCode : u8 {
|
||||
|
@ -143,11 +170,10 @@ enum KeyModifier {
|
|||
struct KeyEvent {
|
||||
KeyCode key { Key_Invalid };
|
||||
u8 map_entry_index { 0 };
|
||||
u32 scancode { 0 };
|
||||
u64 scancode { 0 };
|
||||
u32 code_point { 0 };
|
||||
u8 flags { 0 };
|
||||
bool caps_lock_on { false };
|
||||
bool e0_prefix { false };
|
||||
bool alt() const { return flags & Mod_Alt; }
|
||||
bool ctrl() const { return flags & Mod_Ctrl; }
|
||||
bool shift() const { return flags & Mod_Shift; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue