From 82df777b3d598303177634f887fec822033b000c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 17 Nov 2009 11:41:11 +0000 Subject: [PATCH] * The keyboard driver will now send a "key up" event for the emergency keys afterwards; ie. the alt key is no longer stuck after visiting KDL. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34087 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 5ee720fb39..75c92fcaab 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.c +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_keyboard.c @@ -153,8 +153,22 @@ keyboard_handle_int(ps2_dev *dev) emergencyKeyStatus &= EMERGENCY_SYS_REQ; } else if (emergencyKeyStatus > EMERGENCY_SYS_REQ && debug_emergency_key_pressed(kUnshiftedKeymap[scancode])) { + static const int kKeys[] = {LEFT_ALT_KEY, RIGHT_ALT_KEY, SYS_REQ_KEY}; + int i; + // we probably have lost some keys, so reset our key states emergencyKeyStatus = 0; + + // send key ups for alt-sysreq + keyInfo.timestamp = system_time(); + keyInfo.is_keydown = false; + for (i = 0; i < sizeof(kKeys) / sizeof(kKeys[0]); i++) { + keyInfo.scancode = kKeys[i]; + if (packet_buffer_write(sKeyBuffer, (uint8 *)&keyInfo, + sizeof(keyInfo)) != 0) + release_sem_etc(sKeyboardSem, 1, B_DO_NOT_RESCHEDULE); + } + return B_HANDLED_INTERRUPT; }