From 25f76ed7711f8b1f63db04bbfe85c932c6bddcfe Mon Sep 17 00:00:00 2001 From: LepkoQQ Date: Mon, 30 Aug 2021 18:46:27 +0200 Subject: [PATCH] Kernel: Fix shift sometimes staying pressed after releasing the key Previous implementation sometimes didn't release the key after pressing and holding shift due to repeating key updates when holding keys. This meant repeating updates would set/unset `m_both_shift_keys_pressed` repeatedly, sometimes resulting in shift still being considered pressed even after you released it. Simplify left and right shift key pressed logic by tracking both key states separately and always updating modifiers based on them. --- Kernel/Devices/HID/KeyboardDevice.h | 3 ++- Kernel/Devices/HID/PS2KeyboardDevice.cpp | 11 +++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Kernel/Devices/HID/KeyboardDevice.h b/Kernel/Devices/HID/KeyboardDevice.h index 74197eaf20..2a7fff18c7 100644 --- a/Kernel/Devices/HID/KeyboardDevice.h +++ b/Kernel/Devices/HID/KeyboardDevice.h @@ -61,7 +61,8 @@ protected: bool m_caps_lock_on { false }; bool m_num_lock_on { false }; bool m_has_e0_prefix { false }; - bool m_both_shift_keys_pressed { false }; + bool m_left_shift_pressed { false }; + bool m_right_shift_pressed { false }; void key_state_changed(u8 raw, bool pressed); }; diff --git a/Kernel/Devices/HID/PS2KeyboardDevice.cpp b/Kernel/Devices/HID/PS2KeyboardDevice.cpp index 19db54ddc6..e81ea7fa0c 100644 --- a/Kernel/Devices/HID/PS2KeyboardDevice.cpp +++ b/Kernel/Devices/HID/PS2KeyboardDevice.cpp @@ -53,13 +53,12 @@ void PS2KeyboardDevice::irq_handle_byte_read(u8 byte) update_modifier(Mod_Super, pressed); break; case 0x2a: + m_left_shift_pressed = pressed; + update_modifier(Mod_Shift, m_left_shift_pressed || m_right_shift_pressed); + break; case 0x36: - if (m_both_shift_keys_pressed) - m_both_shift_keys_pressed = false; - else if ((m_modifiers & Mod_Shift) != 0 && pressed) - m_both_shift_keys_pressed = true; - else - update_modifier(Mod_Shift, pressed); + m_right_shift_pressed = pressed; + update_modifier(Mod_Shift, m_left_shift_pressed || m_right_shift_pressed); break; } switch (ch) {