diff --git a/base-sysroot.tar.gz b/base-sysroot.tar.gz index c9cc9d92..77155719 100644 Binary files a/base-sysroot.tar.gz and b/base-sysroot.tar.gz differ diff --git a/kernel/kernel/Input/PS2/Keyboard.cpp b/kernel/kernel/Input/PS2/Keyboard.cpp index a0ca4b95..37142245 100644 --- a/kernel/kernel/Input/PS2/Keyboard.cpp +++ b/kernel/kernel/Input/PS2/Keyboard.cpp @@ -151,16 +151,18 @@ namespace Kernel::Input uint16_t toggle_mask = 0; switch (dummy_event.key) { - case Key::LeftShift: modifier_mask = KeyModifier::LShift; break; - case Key::RightShift: modifier_mask = KeyModifier::RShift; break; - case Key::LeftCtrl: modifier_mask = KeyModifier::LCtrl; break; - case Key::RightCtrl: modifier_mask = KeyModifier::RCtrl; break; - case Key::LeftAlt: modifier_mask = KeyModifier::LAlt; break; - case Key::RightAlt: modifier_mask = KeyModifier::RAlt; break; + case Key::LeftShift: modifier_mask = KeyModifier::LShift; break; + case Key::RightShift: modifier_mask = KeyModifier::RShift; break; + case Key::LeftCtrl: modifier_mask = KeyModifier::LCtrl; break; + case Key::RightCtrl: modifier_mask = KeyModifier::RCtrl; break; + case Key::LeftAlt: modifier_mask = KeyModifier::LAlt; break; + case Key::RightAlt: modifier_mask = KeyModifier::RAlt; break; + case Key::LeftSuper: modifier_mask = KeyModifier::LSuper; break; + case Key::RightSuper: modifier_mask = KeyModifier::RSuper; break; - case Key::ScrollLock: toggle_mask = KeyModifier::ScrollLock; break; - case Key::NumLock: toggle_mask = KeyModifier::NumLock; break; - case Key::CapsLock: toggle_mask = KeyModifier::CapsLock; break; + case Key::ScrollLock: toggle_mask = KeyModifier::ScrollLock; break; + case Key::NumLock: toggle_mask = KeyModifier::NumLock; break; + case Key::CapsLock: toggle_mask = KeyModifier::CapsLock; break; default: break; } diff --git a/kernel/kernel/Input/PS2/Keymap.cpp b/kernel/kernel/Input/PS2/Keymap.cpp index dec6649d..1f7af2cc 100644 --- a/kernel/kernel/Input/PS2/Keymap.cpp +++ b/kernel/kernel/Input/PS2/Keymap.cpp @@ -95,7 +95,9 @@ namespace Kernel::Input m_scancode_to_keycode_normal[0x38] = keycode_normal(4, 2); m_scancode_to_keycode_normal[0x39] = keycode_normal(4, 3); m_scancode_to_keycode_extended[0x38] = keycode_normal(4, 4); - m_scancode_to_keycode_extended[0x1D] = keycode_normal(4, 5); + m_scancode_to_keycode_extended[0x5C] = keycode_normal(4, 5); + m_scancode_to_keycode_extended[0x5D] = keycode_normal(4, 6); + m_scancode_to_keycode_extended[0x1D] = keycode_normal(4, 7); m_scancode_to_keycode_normal[0x45] = keycode_numpad(0, 0); m_scancode_to_keycode_extended[0x35] = keycode_numpad(0, 1); @@ -208,7 +210,9 @@ namespace Kernel::Input m_scancode_to_keycode_normal[0x11] = keycode_normal(4, 2); m_scancode_to_keycode_normal[0x29] = keycode_normal(4, 3); m_scancode_to_keycode_extended[0x11] = keycode_normal(4, 4); - m_scancode_to_keycode_extended[0x14] = keycode_normal(4, 5); + m_scancode_to_keycode_extended[0x27] = keycode_normal(4, 5); + m_scancode_to_keycode_extended[0x2F] = keycode_normal(4, 6); + m_scancode_to_keycode_extended[0x14] = keycode_normal(4, 7); m_scancode_to_keycode_normal[0x77] = keycode_numpad(0, 0); m_scancode_to_keycode_extended[0x4A] = keycode_numpad(0, 1); @@ -321,7 +325,9 @@ namespace Kernel::Input m_scancode_to_keycode_normal[0x19] = keycode_normal(4, 2); m_scancode_to_keycode_normal[0x29] = keycode_normal(4, 3); m_scancode_to_keycode_normal[0x39] = keycode_normal(4, 4); - m_scancode_to_keycode_normal[0x58] = keycode_normal(4, 5); + m_scancode_to_keycode_normal[0x8C] = keycode_normal(4, 5); + m_scancode_to_keycode_normal[0x8D] = keycode_normal(4, 6); + m_scancode_to_keycode_normal[0x58] = keycode_normal(4, 7); m_scancode_to_keycode_normal[0x76] = keycode_numpad(0, 0); m_scancode_to_keycode_normal[0x4A] = keycode_numpad(0, 1); diff --git a/kernel/kernel/USB/HID/Keyboard.cpp b/kernel/kernel/USB/HID/Keyboard.cpp index d6fb9e8d..5b955e63 100644 --- a/kernel/kernel/USB/HID/Keyboard.cpp +++ b/kernel/kernel/USB/HID/Keyboard.cpp @@ -56,6 +56,8 @@ namespace Kernel READ_MODIFIER(0xE4, KeyModifier::RCtrl); READ_MODIFIER(0xE2, KeyModifier::LAlt); READ_MODIFIER(0xE6, KeyModifier::RAlt); + READ_MODIFIER(0xE3, KeyModifier::LSuper); + READ_MODIFIER(0xE7, KeyModifier::RSuper); #undef READ_MODIFIER #define READ_TOGGLE(scancode, key_modifier) \ @@ -340,8 +342,10 @@ namespace Kernel s_scancode_to_keycode[0xE3] = keycode_normal(4, 1); s_scancode_to_keycode[0xE2] = keycode_normal(4, 2); s_scancode_to_keycode[0x2C] = keycode_normal(4, 3); - s_scancode_to_keycode[0xE6] = keycode_normal(4, 5); - s_scancode_to_keycode[0xE4] = keycode_normal(4, 6); + s_scancode_to_keycode[0xE6] = keycode_normal(4, 4); + s_scancode_to_keycode[0xE7] = keycode_normal(4, 5); + s_scancode_to_keycode[0x65] = keycode_normal(5, 6); + s_scancode_to_keycode[0xE4] = keycode_normal(4, 7); s_scancode_to_keycode[0x52] = keycode_normal(5, 0); s_scancode_to_keycode[0x50] = keycode_normal(5, 1); diff --git a/userspace/libraries/LibInput/KeyEvent.cpp b/userspace/libraries/LibInput/KeyEvent.cpp index 552f219a..133deb34 100644 --- a/userspace/libraries/LibInput/KeyEvent.cpp +++ b/userspace/libraries/LibInput/KeyEvent.cpp @@ -18,7 +18,7 @@ namespace LibInput "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", nullptr, "@", "£", "$", "€", - nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "'", "*", "^", "~", nullptr, nullptr, nullptr, nullptr, ",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", "¬", "¦", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", @@ -37,7 +37,7 @@ namespace LibInput "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", nullptr, "@", "£", "$", "€", - nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "'", "*", "^", "~", nullptr, nullptr, nullptr, nullptr, ",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", "¬", "¦", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", @@ -62,7 +62,7 @@ namespace LibInput "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", "\b", "@", "£", "$", "€", - "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "'", "*", "^", "~", "\e[A", "\e[B", "\e[D", "\e[C", ",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", "¬", "¦", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", @@ -81,7 +81,7 @@ namespace LibInput "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", "\b", "@", "£", "$", "€", - "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "'", "*", "^", "~", "\e[A", "\e[B", "\e[D", "\e[C", ",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", "¬", "¦", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", @@ -100,7 +100,7 @@ namespace LibInput "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", "\b", "@", "£", "$", "€", - "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "'", "*", "^", "~", "\e[A", "\e[B", "\e[D", "\e[C", ",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", "¬", "¦", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", diff --git a/userspace/libraries/LibInput/KeyboardLayout.cpp b/userspace/libraries/LibInput/KeyboardLayout.cpp index 55c3143a..cd1dd874 100644 --- a/userspace/libraries/LibInput/KeyboardLayout.cpp +++ b/userspace/libraries/LibInput/KeyboardLayout.cpp @@ -394,11 +394,13 @@ namespace LibInput TRY(s_name_to_key.insert("LeftShift"_sv, Key::LeftShift)); TRY(s_name_to_key.insert("LessThan"_sv, Key::LessThan)); TRY(s_name_to_key.insert("LShift"_sv, Key::LeftShift)); + TRY(s_name_to_key.insert("LSuper"_sv, Key::LeftSuper)); TRY(s_name_to_key.insert("M"_sv, Key::M)); TRY(s_name_to_key.insert("MediaNext"_sv, Key::MediaNext)); TRY(s_name_to_key.insert("MediaPlayPause"_sv, Key::MediaPlayPause)); TRY(s_name_to_key.insert("MediaPrevious"_sv, Key::MediaPrevious)); TRY(s_name_to_key.insert("MediaStop"_sv, Key::MediaStop)); + TRY(s_name_to_key.insert("Application"_sv, Key::Application)); TRY(s_name_to_key.insert("N"_sv, Key::N)); TRY(s_name_to_key.insert("Negation"_sv, Key::Negation)); TRY(s_name_to_key.insert("None"_sv, Key::None)); @@ -443,6 +445,7 @@ namespace LibInput TRY(s_name_to_key.insert("RightControl"_sv, Key::RightCtrl)); TRY(s_name_to_key.insert("RightShift"_sv, Key::RightShift)); TRY(s_name_to_key.insert("RShift"_sv, Key::RightShift)); + TRY(s_name_to_key.insert("RSuper"_sv, Key::RightSuper)); TRY(s_name_to_key.insert("S"_sv, Key::S)); TRY(s_name_to_key.insert("ScrollLock"_sv, Key::ScrollLock)); TRY(s_name_to_key.insert("Section"_sv, Key::Section)); @@ -450,7 +453,6 @@ namespace LibInput TRY(s_name_to_key.insert("SingleQuote"_sv, Key::SingleQuote)); TRY(s_name_to_key.insert("Slash"_sv, Key::Slash)); TRY(s_name_to_key.insert("Space"_sv, Key::Space)); - TRY(s_name_to_key.insert("Super"_sv, Key::Super)); TRY(s_name_to_key.insert("T"_sv, Key::T)); TRY(s_name_to_key.insert("Tab"_sv, Key::Tab)); TRY(s_name_to_key.insert("Tilde"_sv, Key::Tilde)); diff --git a/userspace/libraries/LibInput/include/LibInput/KeyEvent.h b/userspace/libraries/LibInput/include/LibInput/KeyEvent.h index 46de73c7..f6a625c2 100644 --- a/userspace/libraries/LibInput/include/LibInput/KeyEvent.h +++ b/userspace/libraries/LibInput/include/LibInput/KeyEvent.h @@ -44,7 +44,7 @@ namespace LibInput ExclamationMark, DoubleQuote, Hashtag, Currency, Percent, Ampersand, Slash, Section, Half, OpenParenthesis, CloseParenthesis, OpenSquareBracket, CloseSquareBracket, OpenCurlyBracket, CloseCurlyBracket, Equals, QuestionMark, Plus, BackSlash, Acute, BackTick, TwoDots, Cedilla, Backspace, AtSign, Pound, Dollar, Euro, - Escape, Tab, CapsLock, LeftShift, LeftCtrl, Super, LeftAlt, RightAlt, AltGr = RightAlt, RightCtrl, RightShift, + Escape, Tab, CapsLock, LeftShift, LeftCtrl, LeftSuper, LeftAlt, RightAlt, AltGr = RightAlt, RightSuper, Application, RightCtrl, RightShift, SingleQuote, Asterix, Caret, Tilde, ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Comma, Semicolon, Period, Colon, Hyphen, Underscore, NumLock, ScrollLock, LessThan, GreaterThan, Pipe, Negation, BrokenBar, Numpad0, Numpad1, Numpad2, Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9, @@ -65,36 +65,42 @@ namespace LibInput { enum Modifier : uint16_t { - LShift = (1 << 0), - RShift = (1 << 1), - LCtrl = (1 << 2), - RCtrl = (1 << 3), - LAlt = (1 << 4), - RAlt = (1 << 5), - CapsLock = (1 << 6), - NumLock = (1 << 7), - ScrollLock = (1 << 8), - Pressed = (1 << 9), + LShift = (1 << 0), + RShift = (1 << 1), + LCtrl = (1 << 2), + RCtrl = (1 << 3), + LAlt = (1 << 4), + RAlt = (1 << 5), + LSuper = (1 << 6), + RSuper = (1 << 7), + CapsLock = (1 << 8), + NumLock = (1 << 9), + ScrollLock = (1 << 10), + Pressed = (1 << 11), }; - bool lshift() const { return modifier & Modifier::LShift; } - bool rshift() const { return modifier & Modifier::RShift; } - bool shift() const { return lshift() || rshift(); } + bool lshift() const { return modifier & Modifier::LShift; } + bool rshift() const { return modifier & Modifier::RShift; } + bool shift() const { return lshift() || rshift(); } - bool lctrl() const { return modifier & Modifier::LCtrl; } - bool rctrl() const { return modifier & Modifier::RCtrl; } - bool ctrl() const { return lctrl() || rctrl(); } + bool lctrl() const { return modifier & Modifier::LCtrl; } + bool rctrl() const { return modifier & Modifier::RCtrl; } + bool ctrl() const { return lctrl() || rctrl(); } - bool lalt() const { return modifier & Modifier::LAlt; } - bool ralt() const { return modifier & Modifier::RAlt; } - bool alt() const { return lalt() || ralt(); } + bool lalt() const { return modifier & Modifier::LAlt; } + bool ralt() const { return modifier & Modifier::RAlt; } + bool alt() const { return lalt() || ralt(); } - bool caps_lock() const { return modifier & Modifier::CapsLock; } - bool num_lock() const { return modifier & Modifier::NumLock; } - bool scroll_lock() const { return modifier & Modifier::ScrollLock; } + bool lsuper() const { return modifier & Modifier::LSuper; } + bool rsuper() const { return modifier & Modifier::RSuper; } + bool super() const { return lsuper() || rsuper(); } - bool pressed() const { return modifier & Modifier::Pressed; } - bool released() const { return !pressed(); } + bool caps_lock() const { return modifier & Modifier::CapsLock; } + bool num_lock() const { return modifier & Modifier::NumLock; } + bool scroll_lock() const { return modifier & Modifier::ScrollLock; } + + bool pressed() const { return modifier & Modifier::Pressed; } + bool released() const { return !pressed(); } uint16_t modifier; uint8_t scancode; diff --git a/userspace/programs/WindowServer/WindowServer.cpp b/userspace/programs/WindowServer/WindowServer.cpp index d7d9d2ce..e4b407d9 100644 --- a/userspace/programs/WindowServer/WindowServer.cpp +++ b/userspace/programs/WindowServer/WindowServer.cpp @@ -481,7 +481,7 @@ static void update_volume(const char* new_volume) void WindowServer::on_key_event(LibInput::KeyEvent event) { - if (event.key == LibInput::Key::Super) + if (event.key == LibInput::Key::LeftSuper) m_is_mod_key_held = event.pressed(); if (event.pressed() && event.key == LibInput::Key::VolumeDown)