Keyboard Modifier LEDs not working in usetup.
Patch by Carlo Bramini.
CORE-3368 #resolve #comment Thanks a lot!

svn path=/trunk/; revision=71976
This commit is contained in:
Eric Kohl 2016-07-21 20:53:43 +00:00
parent ac99dacfb5
commit ad68bb1dc2
3 changed files with 58 additions and 23 deletions

View file

@ -218,7 +218,7 @@ ReadConsoleInput(
return FALSE; return FALSE;
lpBuffer->EventType = KEY_EVENT; lpBuffer->EventType = KEY_EVENT;
Status = IntTranslateKey(&InputData, &lpBuffer->Event.KeyEvent); Status = IntTranslateKey(hConsoleInput, &InputData, &lpBuffer->Event.KeyEvent);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
return FALSE; return FALSE;

View file

@ -117,13 +117,6 @@ static WORD KeyTableEnhanced[] = {
0, 0, 0, 0 0, 0, 0, 0
}; };
/*
* Note how the keyboard lights are not handled, so while NUMLOCK_ON can
* be on, the light will never be. If this starts to be a problem it can be
* fixed, but it's too much work for too little gain to do now.
* Look in win32k/ntuser/input.c for an example.
*/
static WORD KeyTableNumlock[] = { static WORD KeyTableNumlock[] = {
/* 0x00 */ /* 0x00 */
0, 0, 0, 0, 0, 0, 0, 0,
@ -255,13 +248,16 @@ SCANTOASCII ScanToAscii[] = {
static void static void
IntUpdateControlKeyState(LPDWORD State, PKEYBOARD_INPUT_DATA InputData) IntUpdateControlKeyState(HANDLE hConsoleInput, LPDWORD State, PKEYBOARD_INPUT_DATA InputData)
{ {
DWORD Value = 0; DWORD Value = 0;
DWORD oldState, newState;
if (InputData->Flags & KEY_E1) /* Only the pause key has E1 */ if (InputData->Flags & KEY_E1) /* Only the pause key has E1 */
return; return;
oldState = newState = *State;
if (!(InputData->Flags & KEY_E0)) { if (!(InputData->Flags & KEY_E0)) {
switch (InputData->MakeCode) { switch (InputData->MakeCode) {
case 0x2a: case 0x2a:
@ -278,22 +274,19 @@ IntUpdateControlKeyState(LPDWORD State, PKEYBOARD_INPUT_DATA InputData)
break; break;
case 0x3A: case 0x3A:
Value = CAPSLOCK_ON;
if (!(InputData->Flags & KEY_BREAK)) if (!(InputData->Flags & KEY_BREAK))
*State ^= Value; newState ^= CAPSLOCK_ON;
return; break;
case 0x45: case 0x45:
Value = NUMLOCK_ON;
if (!(InputData->Flags & KEY_BREAK)) if (!(InputData->Flags & KEY_BREAK))
*State ^= Value; newState ^= NUMLOCK_ON;
return; break;
case 0x46: case 0x46:
Value = SCROLLLOCK_ON;
if (!(InputData->Flags & KEY_BREAK)) if (!(InputData->Flags & KEY_BREAK))
*State ^= Value; newState ^= SCROLLLOCK_ON;
return; break;
default: default:
return; return;
@ -313,10 +306,52 @@ IntUpdateControlKeyState(LPDWORD State, PKEYBOARD_INPUT_DATA InputData)
} }
} }
/* Check if the state of the indicators has been changed */
if ((oldState ^ newState) & (NUMLOCK_ON | CAPSLOCK_ON | SCROLLLOCK_ON))
{
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
KEYBOARD_INDICATOR_PARAMETERS kip;
kip.LedFlags = 0;
kip.UnitId = 0;
if ((newState & NUMLOCK_ON))
kip.LedFlags |= KEYBOARD_NUM_LOCK_ON;
if ((newState & CAPSLOCK_ON))
kip.LedFlags |= KEYBOARD_CAPS_LOCK_ON;
if ((newState & SCROLLLOCK_ON))
kip.LedFlags |= KEYBOARD_SCROLL_LOCK_ON;
/* Update the state of the leds on primary keyboard */
DPRINT("NtDeviceIoControlFile dwLeds=%x\n", kip.LedFlags);
Status = NtDeviceIoControlFile(
hConsoleInput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_KEYBOARD_SET_INDICATORS,
&kip,
sizeof(kip),
NULL,
0);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtDeviceIoControlFile(IOCTL_KEYBOARD_SET_INDICATORS) failed (Status %lx)\n", Status);
}
} else
/* Normal press/release state handling */
if (InputData->Flags & KEY_BREAK) if (InputData->Flags & KEY_BREAK)
*State &= ~Value; newState &= ~Value;
else else
*State |= Value; newState |= Value;
*State = newState;
} }
static DWORD static DWORD
@ -379,7 +414,7 @@ IntAsciiFromInput(PKEYBOARD_INPUT_DATA InputData, DWORD KeyState)
* in the app so I'll just fill the others with somewhat sane values * in the app so I'll just fill the others with somewhat sane values
*/ */
NTSTATUS NTSTATUS
IntTranslateKey(PKEYBOARD_INPUT_DATA InputData, KEY_EVENT_RECORD *Event) IntTranslateKey(HANDLE hConsoleInput, PKEYBOARD_INPUT_DATA InputData, KEY_EVENT_RECORD *Event)
{ {
static DWORD dwControlKeyState; static DWORD dwControlKeyState;
@ -395,7 +430,7 @@ IntTranslateKey(PKEYBOARD_INPUT_DATA InputData, KEY_EVENT_RECORD *Event)
DPRINT("Translating: %x\n", InputData->MakeCode); DPRINT("Translating: %x\n", InputData->MakeCode);
IntUpdateControlKeyState(&dwControlKeyState, InputData); IntUpdateControlKeyState(hConsoleInput, &dwControlKeyState, InputData);
Event->dwControlKeyState = dwControlKeyState; Event->dwControlKeyState = dwControlKeyState;
if (InputData->Flags & KEY_E0) if (InputData->Flags & KEY_E0)

View file

@ -28,6 +28,6 @@
#include <ntddkbd.h> #include <ntddkbd.h>
NTSTATUS NTSTATUS
IntTranslateKey(PKEYBOARD_INPUT_DATA InputData, KEY_EVENT_RECORD *Event); IntTranslateKey(HANDLE hConsoleInput, PKEYBOARD_INPUT_DATA InputData, KEY_EVENT_RECORD *Event);
/* EOF */ /* EOF */