diff --git a/Kernel/Devices/HID/KeyboardDevice.cpp b/Kernel/Devices/HID/KeyboardDevice.cpp index bc2eb249d2..680cc7cbc4 100644 --- a/Kernel/Devices/HID/KeyboardDevice.cpp +++ b/Kernel/Devices/HID/KeyboardDevice.cpp @@ -303,7 +303,7 @@ void KeyboardDevice::handle_scan_code_input_event(ScanCodeEvent event) queued_event.flags = m_modifiers; queued_event.e0_prefix = event.e0_prefix; queued_event.caps_lock_on = m_caps_lock_on; - queued_event.code_point = HIDManagement::the().get_char_from_character_map(queued_event); + queued_event.code_point = HIDManagement::the().get_char_from_character_map(queued_event, m_num_lock_on); // If using a non-QWERTY layout, queued_event.key needs to be updated to be the same as event.code_point KeyCode mapped_key = code_point_to_key_code(queued_event.code_point); diff --git a/Kernel/Devices/HID/Management.cpp b/Kernel/Devices/HID/Management.cpp index d1fcf6a6b7..030ee2439b 100644 --- a/Kernel/Devices/HID/Management.cpp +++ b/Kernel/Devices/HID/Management.cpp @@ -174,7 +174,7 @@ HIDManagement& HIDManagement::the() return *s_the; } -u32 HIDManagement::get_char_from_character_map(KeyEvent event) const +u32 HIDManagement::get_char_from_character_map(KeyEvent event, bool num_lock_on) const { auto modifiers = event.modifiers(); auto index = event.scancode & 0xFF; // Index is last byte of scan code. @@ -208,6 +208,10 @@ u32 HIDManagement::get_char_from_character_map(KeyEvent event) const // Except for `keypad-/` and 'keypad-return', all e0 scan codes are not actually characters. i.e., `keypad-0` and // `Insert` have the same scancode except for the prefix, but insert should not have a code_point. code_point = 0; + } else if (!num_lock_on && !event.e0_prefix && event.scancode >= 0x47 && event.scancode <= 0x53 && event.key != Key_Minus && event.key != Key_Plus) { + // When Num Lock is off, some numpad keys have the same function as some of the extended keys like Home, End, PgDown, arrows etc. + // These keys should have the code_point set to 0. + code_point = 0; } return code_point; diff --git a/Kernel/Devices/HID/Management.h b/Kernel/Devices/HID/Management.h index 1a64ffcda6..39afe00f77 100644 --- a/Kernel/Devices/HID/Management.h +++ b/Kernel/Devices/HID/Management.h @@ -46,7 +46,7 @@ public: SpinlockProtected& keymap_data() { return m_keymap_data; } - u32 get_char_from_character_map(KeyEvent) const; + u32 get_char_from_character_map(KeyEvent, bool) const; void set_client(KeyboardClient* client); void set_maps(NonnullOwnPtr character_map_name, Keyboard::CharacterMapData const& character_map);