summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.cpp')
-rw-r--r--Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.cpp b/Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.cpp
new file mode 100644
index 0000000000..0e00d17362
--- /dev/null
+++ b/Userland/Libraries/LibWeb/UIEvents/KeyboardEvent.cpp
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/CharacterTypes.h>
+#include <LibWeb/UIEvents/KeyboardEvent.h>
+
+namespace Web::UIEvents {
+
+// https://www.w3.org/TR/uievents/#determine-keydown-keyup-keyCode
+static unsigned long determine_key_code(KeyCode platform_key, u32 code_point)
+{
+ // If input key when pressed without modifiers would insert a numerical character (0-9), return the ASCII code of that numerical character.
+ if (is_ascii_digit(code_point))
+ return code_point;
+
+ // If input key when pressed without modifiers would insert a lower case character in the a-z alphabetical range, return the ASCII code of the upper case equivalent.
+ if (is_ascii_lower_alpha(code_point))
+ return to_ascii_uppercase(code_point);
+
+ // If the keyโ€™s function, as determined in an implementation-specific way, corresponds to one of the keys in the ยง8.3.3 Fixed virtual key codes table, return the corresponding key code.
+ // https://www.w3.org/TR/uievents/#fixed-virtual-key-codes
+ switch (platform_key) {
+ case KeyCode::Key_Backspace:
+ return 8;
+ case KeyCode::Key_Tab:
+ return 9;
+ case KeyCode::Key_Return:
+ return 13;
+ case KeyCode::Key_Shift:
+ return 16;
+ case KeyCode::Key_Control:
+ return 17;
+ case KeyCode::Key_Alt:
+ return 18;
+ case KeyCode::Key_CapsLock:
+ return 20;
+ case KeyCode::Key_Escape:
+ return 27;
+ case KeyCode::Key_Space:
+ return 32;
+ case KeyCode::Key_PageUp:
+ return 33;
+ case KeyCode::Key_PageDown:
+ return 34;
+ case KeyCode::Key_End:
+ return 35;
+ case KeyCode::Key_Home:
+ return 36;
+ case KeyCode::Key_Left:
+ return 37;
+ case KeyCode::Key_Up:
+ return 38;
+ case KeyCode::Key_Right:
+ return 39;
+ case KeyCode::Key_Down:
+ return 40;
+ default:
+ break;
+ }
+
+ // Return the virtual key code from the operating system.
+ return platform_key;
+}
+
+NonnullRefPtr<KeyboardEvent> KeyboardEvent::create_from_platform_event(FlyString event_name, KeyCode platform_key, unsigned modifiers, u32 code_point)
+{
+ // FIXME: Figure out what these should actually contain.
+ String event_key = key_code_to_string(platform_key);
+ String event_code = "FIXME";
+
+ auto key_code = determine_key_code(platform_key, code_point);
+ return KeyboardEvent::create(move(event_name), move(event_key), move(event_code), 0, modifiers & Mod_Ctrl, modifiers & Mod_Shift, modifiers & Mod_Alt, false, false, false, key_code, code_point);
+}
+
+KeyboardEvent::KeyboardEvent(FlyString event_name, String key, String code, unsigned long location, bool ctrl_key, bool shift_key, bool alt_key, bool meta_key, bool repeat, bool is_composing, unsigned long key_code, unsigned long char_code)
+ : UIEvent(move(event_name))
+ , m_key(move(key))
+ , m_code(move(code))
+ , m_location(location)
+ , m_ctrl_key(ctrl_key)
+ , m_shift_key(shift_key)
+ , m_alt_key(alt_key)
+ , m_meta_key(meta_key)
+ , m_repeat(repeat)
+ , m_is_composing(is_composing)
+ , m_key_code(key_code)
+ , m_char_code(char_code)
+{
+}
+
+KeyboardEvent::~KeyboardEvent()
+{
+}
+
+bool KeyboardEvent::get_modifier_state(String const& key_arg)
+{
+ if (key_arg == "Alt")
+ return m_alt_key;
+ if (key_arg == "Control")
+ return m_ctrl_key;
+ if (key_arg == "Shift")
+ return m_shift_key;
+ if (key_arg == "Meta")
+ return m_meta_key;
+ return false;
+}
+}