diff --git a/src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.c b/src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.c index b6932c449c..5ee720fb39 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.c +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.c @@ -152,8 +152,11 @@ keyboard_handle_int(ps2_dev *dev) else emergencyKeyStatus &= EMERGENCY_SYS_REQ; } else if (emergencyKeyStatus > EMERGENCY_SYS_REQ - && debug_emergency_key_pressed(kUnshiftedKeymap[scancode])) + && debug_emergency_key_pressed(kUnshiftedKeymap[scancode])) { + // we probably have lost some keys, so reset our key states + emergencyKeyStatus = 0; return B_HANDLED_INTERRUPT; + } keyInfo.timestamp = dev->history[0].time; keyInfo.scancode = scancode; diff --git a/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp b/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp index d9a265e773..3a481047b2 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp +++ b/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp @@ -465,8 +465,11 @@ KeyboardDevice::_InterpretBuffer() char letter = current[i] - 4 + 'a'; - if (debug_emergency_key_pressed(letter)) + if (debug_emergency_key_pressed(letter)) { + // we probably have lost some keys, so reset our key state + sysReqPressed = false; continue; + } } else if (key == 0) { // unmapped key key = 0x200000 + current[i]; diff --git a/src/system/kernel/arch/x86/arch_debug_console.c b/src/system/kernel/arch/x86/arch_debug_console.c index 779bc2fa47..1c5a947f4f 100644 --- a/src/system/kernel/arch/x86/arch_debug_console.c +++ b/src/system/kernel/arch/x86/arch_debug_console.c @@ -147,8 +147,14 @@ debug_keyboard_interrupt(void *data) break; default: - if (altPressed && sysReqPressed) - debug_emergency_key_pressed(kUnshiftedKeymap[key]); + if (altPressed && sysReqPressed) { + if (debug_emergency_key_pressed(kUnshiftedKeymap[key])) { + // we probably have lost some keys, so reset our key states + controlPressed = false; + sysReqPressed = false; + altPressed = false; + } + } break; }