mirror of
https://github.com/reactos/reactos.git
synced 2025-04-22 05:00:27 +00:00
[NTVDM]
Fix the shift key. Improve the BIOS keyboard handler. Do not append modifier keys to the buffer. CORE-8231 #resolve #comment Fixed in revision r67066. svn path=/trunk/; revision=67066
This commit is contained in:
parent
965df2ffd2
commit
14ce9b898d
1 changed files with 39 additions and 20 deletions
|
@ -232,23 +232,39 @@ static VOID WINAPI BiosKeyboardIrq(LPWORD Stack)
|
|||
/* Check if this is a key press or release */
|
||||
if (!(ScanCode & (1 << 7)))
|
||||
{
|
||||
/* Key press */
|
||||
if (VirtualKey == VK_NUMLOCK ||
|
||||
VirtualKey == VK_CAPITAL ||
|
||||
VirtualKey == VK_SCROLL ||
|
||||
VirtualKey == VK_INSERT)
|
||||
/* Key press, set the highest bit */
|
||||
BiosKeyboardMap[VirtualKey] |= (1 << 7);
|
||||
|
||||
switch (VirtualKey)
|
||||
{
|
||||
case VK_NUMLOCK:
|
||||
case VK_CAPITAL:
|
||||
case VK_SCROLL:
|
||||
case VK_INSERT:
|
||||
{
|
||||
/* For toggle keys, toggle the lowest bit in the keyboard map */
|
||||
BiosKeyboardMap[VirtualKey] ^= ~(1 << 0);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Set the highest bit */
|
||||
BiosKeyboardMap[VirtualKey] |= (1 << 7);
|
||||
case VK_CONTROL:
|
||||
case VK_SHIFT:
|
||||
case VK_LSHIFT:
|
||||
case VK_RSHIFT:
|
||||
case VK_MENU:
|
||||
case VK_LMENU:
|
||||
case VK_RMENU:
|
||||
{
|
||||
/* Modifier keys don't go in the buffer */
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
Character = 0;
|
||||
|
||||
/* If ALT isn't held down, find out which character this is */
|
||||
if (!((BiosKeyboardMap[VK_MENU] | BiosKeyboardMap[VK_RMENU] | BiosKeyboardMap[VK_LMENU]) & (1 << 7)))
|
||||
if (!(Bda->KeybdShiftFlags & (BDA_KBDFLAG_ALT | BDA_KBDFLAG_LALT | BDA_KBDFLAG_RALT)))
|
||||
{
|
||||
if (ToAscii(VirtualKey, ScanCode, BiosKeyboardMap, &Character, 0) == 0)
|
||||
{
|
||||
|
@ -260,6 +276,8 @@ static VOID WINAPI BiosKeyboardIrq(LPWORD Stack)
|
|||
/* Push it onto the BIOS keyboard queue */
|
||||
BiosKbdBufferPush(MAKEWORD(Character, ScanCode));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Key release, unset the highest bit */
|
||||
|
@ -270,6 +288,7 @@ static VOID WINAPI BiosKeyboardIrq(LPWORD Stack)
|
|||
Bda->KeybdShiftFlags = 0;
|
||||
|
||||
/* Set the appropriate flags based on the state */
|
||||
if (BiosKeyboardMap[VK_SHIFT] & (1 << 7)) Bda->KeybdShiftFlags |= BDA_KBDFLAG_LSHIFT;
|
||||
if (BiosKeyboardMap[VK_RSHIFT] & (1 << 7)) Bda->KeybdShiftFlags |= BDA_KBDFLAG_RSHIFT;
|
||||
if (BiosKeyboardMap[VK_LSHIFT] & (1 << 7)) Bda->KeybdShiftFlags |= BDA_KBDFLAG_LSHIFT;
|
||||
if (BiosKeyboardMap[VK_CONTROL] & (1 << 7)) Bda->KeybdShiftFlags |= BDA_KBDFLAG_CTRL;
|
||||
|
|
Loading…
Reference in a new issue