From 1ad5198c09afc169970a16c45842a5ed7556d565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 22 Jul 2009 08:02:51 +0000 Subject: [PATCH] * Reset keyboard state when an emergency key has been processed - it's likely that we lost a few keystrokes, and would make keys (like SysReq) stick. Thanks to Rene for the note! git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31688 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.c | 5 ++++- .../kernel/drivers/input/usb_hid/KeyboardDevice.cpp | 5 ++++- src/system/kernel/arch/x86/arch_debug_console.c | 10 ++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) 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; }