diff --git a/Ladybird/AppKit/UI/Event.mm b/Ladybird/AppKit/UI/Event.mm
index de029ca5367..ef854714c11 100644
--- a/Ladybird/AppKit/UI/Event.mm
+++ b/Ladybird/AppKit/UI/Event.mm
@@ -226,8 +226,8 @@ static Web::UIEvents::KeyCode ns_key_code_to_key_code(unsigned short key_code, W
case kVK_ANSI_Semicolon: return Web::UIEvents::KeyCode::Key_Semicolon;
case kVK_ANSI_Slash: return Web::UIEvents::KeyCode::Key_Slash;
case kVK_CapsLock: return Web::UIEvents::KeyCode::Key_CapsLock;
- case kVK_Command: return Web::UIEvents::KeyCode::Key_Super;
- case kVK_Control: return Web::UIEvents::KeyCode::Key_Control;
+ case kVK_Command: return Web::UIEvents::KeyCode::Key_LeftSuper;
+ case kVK_Control: return Web::UIEvents::KeyCode::Key_LeftControl;
case kVK_Delete: return Web::UIEvents::KeyCode::Key_Backspace;
case kVK_DownArrow: return Web::UIEvents::KeyCode::Key_Down;
case kVK_End: return Web::UIEvents::KeyCode::Key_End;
@@ -247,16 +247,16 @@ static Web::UIEvents::KeyCode ns_key_code_to_key_code(unsigned short key_code, W
case kVK_ForwardDelete: return Web::UIEvents::KeyCode::Key_Delete;
case kVK_Home: return Web::UIEvents::KeyCode::Key_Home;
case kVK_LeftArrow: return Web::UIEvents::KeyCode::Key_Left;
- case kVK_Option: return Web::UIEvents::KeyCode::Key_Alt;
+ case kVK_Option: return Web::UIEvents::KeyCode::Key_LeftAlt;
case kVK_PageDown: return Web::UIEvents::KeyCode::Key_PageDown;
case kVK_PageUp: return Web::UIEvents::KeyCode::Key_PageUp;
case kVK_Return: return Web::UIEvents::KeyCode::Key_Return;
case kVK_RightArrow: return Web::UIEvents::KeyCode::Key_Right;
- case kVK_RightCommand: return Web::UIEvents::KeyCode::Key_Super; // FIXME: We do not distinguish left-vs-right.
- case kVK_RightControl: return Web::UIEvents::KeyCode::Key_Control; // FIXME: We do not distinguish left-vs-right.
- case kVK_RightOption: return Web::UIEvents::KeyCode::Key_Alt; // FIXME: We do not distinguish left-vs-right.
+ case kVK_RightCommand: return Web::UIEvents::KeyCode::Key_RightSuper;
+ case kVK_RightControl: return Web::UIEvents::KeyCode::Key_RightControl;
+ case kVK_RightOption: return Web::UIEvents::KeyCode::Key_RightAlt;
case kVK_RightShift: return Web::UIEvents::KeyCode::Key_RightShift;
- case kVK_Shift: return Web::UIEvents::KeyCode::Key_Shift;
+ case kVK_Shift: return Web::UIEvents::KeyCode::Key_LeftShift;
case kVK_Space: return Web::UIEvents::KeyCode::Key_Space;
case kVK_Tab: return Web::UIEvents::KeyCode::Key_Tab;
case kVK_UpArrow: return Web::UIEvents::KeyCode::Key_Up;
diff --git a/Ladybird/Qt/WebContentView.cpp b/Ladybird/Qt/WebContentView.cpp
index 80846f811f7..5bae48ac7bc 100644
--- a/Ladybird/Qt/WebContentView.cpp
+++ b/Ladybird/Qt/WebContentView.cpp
@@ -244,8 +244,6 @@ static Web::UIEvents::KeyModifier get_modifiers_from_qt_key_event(QKeyEvent cons
modifiers |= Web::UIEvents::KeyModifier::Mod_Super;
if (event.modifiers().testFlag(Qt::ShiftModifier))
modifiers |= Web::UIEvents::KeyModifier::Mod_Shift;
- if (event.modifiers().testFlag(Qt::AltModifier))
- modifiers |= Web::UIEvents::KeyModifier::Mod_AltGr;
if (event.modifiers().testFlag(Qt::KeypadModifier))
modifiers |= Web::UIEvents::KeyModifier::Mod_Keypad;
return modifiers;
@@ -264,8 +262,12 @@ static Web::UIEvents::KeyCode get_keycode_from_qt_key_event(QKeyEvent const& eve
Web::UIEvents::KeyCode serenity_key;
};
+ // FIXME: Qt does not differentiate between left-and-right modifier keys. Unfortunately, it seems like we would have
+ // to inspect event.nativeScanCode() / event.nativeVirtualKey() to do so, which has platform-dependent values.
+ // For now, we default to left keys.
+
// https://doc.qt.io/qt-6/qt.html#Key-enum
- constexpr Mapping mappings[] = {
+ static constexpr Mapping mappings[] = {
{ Qt::Key_0, Web::UIEvents::Key_0 },
{ Qt::Key_1, Web::UIEvents::Key_1 },
{ Qt::Key_2, Web::UIEvents::Key_2 },
@@ -277,7 +279,7 @@ static Web::UIEvents::KeyCode get_keycode_from_qt_key_event(QKeyEvent const& eve
{ Qt::Key_8, Web::UIEvents::Key_8 },
{ Qt::Key_9, Web::UIEvents::Key_9 },
{ Qt::Key_A, Web::UIEvents::Key_A },
- { Qt::Key_Alt, Web::UIEvents::Key_Alt },
+ { Qt::Key_Alt, Web::UIEvents::Key_LeftAlt },
{ Qt::Key_Ampersand, Web::UIEvents::Key_Ampersand },
{ Qt::Key_Apostrophe, Web::UIEvents::Key_Apostrophe },
{ Qt::Key_AsciiCircum, Web::UIEvents::Key_Circumflex },
@@ -296,7 +298,7 @@ static Web::UIEvents::KeyCode get_keycode_from_qt_key_event(QKeyEvent const& eve
{ Qt::Key_CapsLock, Web::UIEvents::Key_CapsLock },
{ Qt::Key_Colon, Web::UIEvents::Key_Colon },
{ Qt::Key_Comma, Web::UIEvents::Key_Comma },
- { Qt::Key_Control, Web::UIEvents::Key_Control },
+ { Qt::Key_Control, Web::UIEvents::Key_LeftControl },
{ Qt::Key_D, Web::UIEvents::Key_D },
{ Qt::Key_Delete, Web::UIEvents::Key_Delete },
{ Qt::Key_Dollar, Web::UIEvents::Key_Dollar },
@@ -334,7 +336,7 @@ static Web::UIEvents::KeyCode get_keycode_from_qt_key_event(QKeyEvent const& eve
{ Qt::Key_Less, Web::UIEvents::Key_LessThan },
{ Qt::Key_M, Web::UIEvents::Key_M },
{ Qt::Key_Menu, Web::UIEvents::Key_Menu },
- { Qt::Key_Meta, Web::UIEvents::Key_Super },
+ { Qt::Key_Meta, Web::UIEvents::Key_LeftSuper },
{ Qt::Key_Minus, Web::UIEvents::Key_Minus },
{ Qt::Key_N, Web::UIEvents::Key_N },
{ Qt::Key_NumberSign, Web::UIEvents::Key_Hashtag },
@@ -362,8 +364,8 @@ static Web::UIEvents::KeyCode get_keycode_from_qt_key_event(QKeyEvent const& eve
{ Qt::Key_Shift, Web::UIEvents::Key_LeftShift },
{ Qt::Key_Slash, Web::UIEvents::Key_Slash },
{ Qt::Key_Space, Web::UIEvents::Key_Space },
- { Qt::Key_Super_L, Web::UIEvents::Key_Super },
- { Qt::Key_Super_R, Web::UIEvents::Key_Super },
+ { Qt::Key_Super_L, Web::UIEvents::Key_LeftSuper },
+ { Qt::Key_Super_R, Web::UIEvents::Key_RightSuper },
{ Qt::Key_SysReq, Web::UIEvents::Key_SysRq },
{ Qt::Key_T, Web::UIEvents::Key_T },
{ Qt::Key_Tab, Web::UIEvents::Key_Tab },
diff --git a/Tests/LibWeb/Text/expected/UIEvents/KeyEvent-functional-keys.txt b/Tests/LibWeb/Text/expected/UIEvents/KeyEvent-functional-keys.txt
new file mode 100644
index 00000000000..f45de043853
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/UIEvents/KeyEvent-functional-keys.txt
@@ -0,0 +1,13 @@
+key=CapsLock code=CapsLock
+key=Escape code=Escape
+key=Enter code=Enter
+key= code=Space
+key=Tab code=Tab
+key=Alt code=AltLeft
+key=Alt code=AltRight
+key=Control code=ControlLeft
+key=Control code=ControlRight
+key=Shift code=ShiftLeft
+key=Shift code=ShiftRight
+key=Meta code=MetaLeft
+key=Meta code=MetaRight
diff --git a/Tests/LibWeb/Text/expected/UIEvents/special-keys.txt b/Tests/LibWeb/Text/expected/UIEvents/special-keys.txt
deleted file mode 100644
index 76704e47d46..00000000000
--- a/Tests/LibWeb/Text/expected/UIEvents/special-keys.txt
+++ /dev/null
@@ -1 +0,0 @@
-Escape
diff --git a/Tests/LibWeb/Text/input/UIEvents/KeyEvent-functional-keys.html b/Tests/LibWeb/Text/input/UIEvents/KeyEvent-functional-keys.html
new file mode 100644
index 00000000000..a11c6db13a3
--- /dev/null
+++ b/Tests/LibWeb/Text/input/UIEvents/KeyEvent-functional-keys.html
@@ -0,0 +1,32 @@
+
+
+
diff --git a/Tests/LibWeb/Text/input/UIEvents/special-keys.html b/Tests/LibWeb/Text/input/UIEvents/special-keys.html
deleted file mode 100644
index 502de7c9131..00000000000
--- a/Tests/LibWeb/Text/input/UIEvents/special-keys.html
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/Userland/Libraries/LibWeb/Page/EventHandler.cpp b/Userland/Libraries/LibWeb/Page/EventHandler.cpp
index 0d82898b20c..4e3fc372822 100644
--- a/Userland/Libraries/LibWeb/Page/EventHandler.cpp
+++ b/Userland/Libraries/LibWeb/Page/EventHandler.cpp
@@ -1072,7 +1072,7 @@ EventResult EventHandler::handle_keydown(UIEvents::KeyCode key, u32 modifiers, u
return EventResult::Handled;
case UIEvents::KeyCode::Key_Left:
case UIEvents::KeyCode::Key_Right:
- if (modifiers > UIEvents::KeyModifier::Mod_Alt && modifiers != (UIEvents::KeyModifier::Mod_Alt | UIEvents::KeyModifier::Mod_AltGr))
+ if (modifiers && modifiers != UIEvents::KeyModifier::Mod_Alt)
break;
if (modifiers)
document->page().traverse_the_history_by_delta(key == UIEvents::KeyCode::Key_Left ? -1 : 1);
@@ -1081,7 +1081,7 @@ EventResult EventHandler::handle_keydown(UIEvents::KeyCode key, u32 modifiers, u
return EventResult::Handled;
case UIEvents::KeyCode::Key_PageUp:
case UIEvents::KeyCode::Key_PageDown:
- if (modifiers > UIEvents::KeyModifier::Mod_None)
+ if (modifiers != UIEvents::KeyModifier::Mod_None)
break;
document->window()->scroll_by(0, key == UIEvents::KeyCode::Key_PageUp ? -page_scroll_distance : page_scroll_distance);
return EventResult::Handled;
diff --git a/Userland/Libraries/LibWeb/UIEvents/KeyCode.h b/Userland/Libraries/LibWeb/UIEvents/KeyCode.h
index b146ccdce23..1cb45726e1c 100644
--- a/Userland/Libraries/LibWeb/UIEvents/KeyCode.h
+++ b/Userland/Libraries/LibWeb/UIEvents/KeyCode.h
@@ -21,10 +21,11 @@ namespace Web::UIEvents {
__ENUMERATE_KEY_CODE(Return, "Return", 0x0D) \
__ENUMERATE_KEY_CODE(LeftShift, "LeftShift", 0x10) \
__ENUMERATE_KEY_CODE(RightShift, "RightShift", 0xB0) \
- __ENUMERATE_KEY_CODE(Control, "Ctrl", 0x11) \
- __ENUMERATE_KEY_CODE(RightControl, "RightCtrl", 0xB1) \
- __ENUMERATE_KEY_CODE(Alt, "Alt", 0x12) \
- __ENUMERATE_KEY_CODE(RightAlt, "Alt", 0xB2) \
+ __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) \
@@ -123,7 +124,8 @@ namespace Web::UIEvents {
__ENUMERATE_KEY_CODE(Backtick, "`", 0x8C) \
__ENUMERATE_KEY_CODE(NumLock, "NumLock", 0x90) \
__ENUMERATE_KEY_CODE(ScrollLock, "ScrollLock", 0x91) \
- __ENUMERATE_KEY_CODE(Super, "Super", 0x92) \
+ __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) \
@@ -154,11 +156,7 @@ enum KeyCode : u8 {
#define __ENUMERATE_KEY_CODE(name, ui_name, code) Key_##name = code,
ENUMERATE_KEY_CODES
#undef __ENUMERATE_KEY_CODE
-
- Key_Shift
- = Key_LeftShift,
};
-size_t const key_code_count = Key_Menu + 1;
constexpr KeyCode key_code_from_string(StringView key_name)
{
@@ -177,9 +175,8 @@ enum KeyModifier {
Mod_Ctrl = (1 << 1),
Mod_Shift = (1 << 2),
Mod_Super = (1 << 3),
- Mod_AltGr = (1 << 4),
- Mod_Keypad = (1 << 5),
- Mod_Mask = Mod_Alt | Mod_Ctrl | Mod_Shift | Mod_Super | Mod_AltGr | Mod_Keypad,
+ Mod_Keypad = (1 << 4),
+ Mod_Mask = Mod_Alt | Mod_Ctrl | Mod_Shift | Mod_Super | Mod_Keypad,
Is_Press = 0x80,
diff --git a/Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.cpp b/Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.cpp
index fc6b03bf012..a8ff1cbdc56 100644
--- a/Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.cpp
+++ b/Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.cpp
@@ -59,11 +59,14 @@ static unsigned long determine_key_code(KeyCode platform_key, u32 code_point)
return 9;
case KeyCode::Key_Return:
return 13;
- case KeyCode::Key_Shift:
+ case KeyCode::Key_LeftShift:
+ case KeyCode::Key_RightShift:
return 16;
- case KeyCode::Key_Control:
+ case KeyCode::Key_LeftControl:
+ case KeyCode::Key_RightControl:
return 17;
- case KeyCode::Key_Alt:
+ case KeyCode::Key_LeftAlt:
+ case KeyCode::Key_RightAlt:
return 18;
case KeyCode::Key_CapsLock:
return 20;
@@ -143,15 +146,20 @@ static ErrorOr> get_event_named_key(KeyCode platform_key)
return "Unidentified"_string;
// 3.2. Modifier Keys, https://www.w3.org/TR/uievents-key/#keys-modifier
- case KeyCode::Key_Alt:
- return "AltLeft"_string;
+ case KeyCode::Key_LeftAlt:
case KeyCode::Key_RightAlt:
- return "AltRight"_string;
+ return "Alt"_string;
+ case KeyCode::Key_AltGr:
+ return "AltGraph"_string;
case KeyCode::Key_CapsLock:
return "CapsLock"_string;
- case KeyCode::Key_Control:
+ case KeyCode::Key_LeftControl:
+ case KeyCode::Key_RightControl:
return "Control"_string;
- case KeyCode::Key_Super:
+ // FIXME: Fn
+ // FIXME: FnLock
+ case KeyCode::Key_LeftSuper:
+ case KeyCode::Key_RightSuper:
return "Meta"_string;
case KeyCode::Key_NumLock:
return "NumLock"_string;
@@ -454,24 +462,28 @@ static ErrorOr get_event_code(KeyCode platform_key, unsigned modifiers)
return "Slash"_string;
// 3.1.2. Functional Keys, https://www.w3.org/TR/uievents-code/#key-alphanumeric-functional
- case KeyCode::Key_Alt:
+ case KeyCode::Key_LeftAlt:
return "AltLeft"_string;
case KeyCode::Key_RightAlt:
return "AltRight"_string;
+ case KeyCode::Key_AltGr:
+ return "AltGraph"_string;
case KeyCode::Key_Backspace:
return "Backspace"_string;
case KeyCode::Key_CapsLock:
return "CapsLock"_string;
case KeyCode::Key_Menu:
return "ContextMenu"_string;
- case KeyCode::Key_Control:
+ case KeyCode::Key_LeftControl:
return "ControlLeft"_string;
case KeyCode::Key_RightControl:
return "ControlRight"_string;
case KeyCode::Key_Return:
return "Enter"_string;
- case KeyCode::Key_Super:
- return "Meta"_string; // FIXME: Detect left vs. right key.
+ case KeyCode::Key_LeftSuper:
+ return "MetaLeft"_string;
+ case KeyCode::Key_RightSuper:
+ return "MetaRight"_string;
case KeyCode::Key_LeftShift:
return "ShiftLeft"_string;
case KeyCode::Key_RightShift:
@@ -611,11 +623,16 @@ static DOMKeyLocation get_event_location(KeyCode platform_key, unsigned modifier
if ((modifiers & Mod_Keypad) != 0)
return DOMKeyLocation::Numpad;
- // FIXME: Detect left vs. right for Control and Alt keys.
switch (platform_key) {
+ case KeyCode::Key_LeftAlt:
+ case KeyCode::Key_LeftControl:
case KeyCode::Key_LeftShift:
+ case KeyCode::Key_LeftSuper:
return DOMKeyLocation::Left;
+ case KeyCode::Key_RightAlt:
+ case KeyCode::Key_RightControl:
case KeyCode::Key_RightShift:
+ case KeyCode::Key_RightSuper:
return DOMKeyLocation::Right;
default:
break;