ReactOS  0.4.13-dev-92-gf251225
keytrans.c File Reference
#include <usetup.h>
#include "keytrans.h"
#include <debug.h>
Include dependency graph for keytrans.c:

Go to the source code of this file.

Classes

struct  _SCANTOASCII
 

Macros

#define NDEBUG
 

Typedefs

typedef struct _SCANTOASCII SCANTOASCII
 
typedef struct _SCANTOASCIIPSCANTOASCII
 

Functions

static void IntUpdateControlKeyState (HANDLE hConsoleInput, LPDWORD State, PKEYBOARD_INPUT_DATA InputData)
 
static DWORD IntVKFromKbdInput (PKEYBOARD_INPUT_DATA InputData, DWORD KeyState)
 
static UCHAR IntAsciiFromInput (PKEYBOARD_INPUT_DATA InputData, DWORD KeyState)
 
NTSTATUS IntTranslateKey (HANDLE hConsoleInput, PKEYBOARD_INPUT_DATA InputData, KEY_EVENT_RECORD *Event)
 

Variables

static WORD KeyTable []
 
static WORD KeyTableEnhanced []
 
static WORD KeyTableNumlock []
 
SCANTOASCII ScanToAscii []
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 31 of file keytrans.c.

Typedef Documentation

◆ PSCANTOASCII

◆ SCANTOASCII

Function Documentation

◆ IntAsciiFromInput()

static UCHAR IntAsciiFromInput ( PKEYBOARD_INPUT_DATA  InputData,
DWORD  KeyState 
)
static

Definition at line 376 of file keytrans.c.

377 {
378  UINT Counter = 0;
379  USHORT Enhanced = 0;
380 
381  if (KeyState & ENHANCED_KEY) Enhanced = 1;
382 
383  while (ScanToAscii[Counter].ScanCode != 0) {
384  if ((ScanToAscii[Counter].ScanCode == InputData->MakeCode) &&
385  (ScanToAscii[Counter].Enhanced == Enhanced)) {
386  if (ScanToAscii[Counter].NumLock) {
387  if ((KeyState & NUMLOCK_ON) &&
388  !(KeyState & SHIFT_PRESSED)) {
389  return ScanToAscii[Counter].NumLock;
390  } else {
391  return ScanToAscii[Counter].Normal;
392  }
393  }
394 
395  if ((KeyState & CAPSLOCK_ON) && ScanToAscii[Counter].bCAPS)
396  KeyState ^= SHIFT_PRESSED;
397 
398  if (KeyState & SHIFT_PRESSED)
399  return ScanToAscii[Counter].Shift;
400 
401  return ScanToAscii[Counter].Normal;
402  }
403  Counter++;
404  }
405 
406  return 0;
407 }
ULONG ScanCode
Definition: api.c:39
#define SHIFT_PRESSED
Definition: wincon.h:135
USHORT Enhanced
Definition: keytrans.c:165
UCHAR Shift
Definition: keytrans.c:167
#define ENHANCED_KEY
Definition: wincon.h:139
UCHAR Normal
Definition: keytrans.c:166
SCANTOASCII ScanToAscii[]
Definition: keytrans.c:172
unsigned short USHORT
Definition: pedump.c:61
UCHAR NumLock
Definition: keytrans.c:168
unsigned int UINT
Definition: ndis.h:50
static LARGE_INTEGER Counter
Definition: clock.c:43
#define NUMLOCK_ON
Definition: wincon.h:136
#define CAPSLOCK_ON
Definition: wincon.h:138

Referenced by IntTranslateKey().

◆ IntTranslateKey()

NTSTATUS IntTranslateKey ( HANDLE  hConsoleInput,
PKEYBOARD_INPUT_DATA  InputData,
KEY_EVENT_RECORD Event 
)

Definition at line 417 of file keytrans.c.

418 {
419  static DWORD dwControlKeyState;
420 
422 
423  if (!(InputData->Flags & KEY_BREAK))
424  Event->bKeyDown = TRUE;
425  else
426  Event->bKeyDown = FALSE;
427 
428  Event->wRepeatCount = 1;
429  Event->wVirtualScanCode = InputData->MakeCode;
430 
431  DPRINT("Translating: %x\n", InputData->MakeCode);
432 
433  IntUpdateControlKeyState(hConsoleInput, &dwControlKeyState, InputData);
434  Event->dwControlKeyState = dwControlKeyState;
435 
436  if (InputData->Flags & KEY_E0)
437  Event->dwControlKeyState |= ENHANCED_KEY;
438 
439  Event->wVirtualKeyCode = IntVKFromKbdInput(InputData,
440  Event->dwControlKeyState);
441 
442  DPRINT("Result: %x\n", Event->wVirtualKeyCode);
443 
444  if (Event->bKeyDown) {
445  Event->uChar.AsciiChar =
446  IntAsciiFromInput(InputData,
447  Event->dwControlKeyState);
448  DPRINT("Char: %x\n", Event->uChar.AsciiChar);
449  } else {
450  Event->uChar.AsciiChar = 0;
451  }
452 
453  return STATUS_SUCCESS;
454 }
static void IntUpdateControlKeyState(HANDLE hConsoleInput, LPDWORD State, PKEYBOARD_INPUT_DATA InputData)
Definition: keytrans.c:251
#define TRUE
Definition: types.h:120
static UCHAR IntAsciiFromInput(PKEYBOARD_INPUT_DATA InputData, DWORD KeyState)
Definition: keytrans.c:376
#define KEY_BREAK
Definition: ntddkbd.h:71
void DPRINT(...)
Definition: polytest.cpp:61
#define ENHANCED_KEY
Definition: wincon.h:139
unsigned long DWORD
Definition: ntddk_ex.h:95
#define KEY_E0
Definition: ntddkbd.h:72
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
static DWORD IntVKFromKbdInput(PKEYBOARD_INPUT_DATA InputData, DWORD KeyState)
Definition: keytrans.c:358
return STATUS_SUCCESS
Definition: btrfs.c:2725

Referenced by PeekConsoleInput(), and ReadConsoleInput().

◆ IntUpdateControlKeyState()

static void IntUpdateControlKeyState ( HANDLE  hConsoleInput,
LPDWORD  State,
PKEYBOARD_INPUT_DATA  InputData 
)
static

Definition at line 251 of file keytrans.c.

252 {
253  DWORD Value = 0;
254  DWORD oldState, newState;
255 
256  if (InputData->Flags & KEY_E1) /* Only the pause key has E1 */
257  return;
258 
259  oldState = newState = *State;
260 
261  if (!(InputData->Flags & KEY_E0)) {
262  switch (InputData->MakeCode) {
263  case 0x2a:
264  case 0x36:
266  break;
267 
268  case 0x1d:
270  break;
271 
272  case 0x38:
274  break;
275 
276  case 0x3A:
277  if (!(InputData->Flags & KEY_BREAK))
278  newState ^= CAPSLOCK_ON;
279  break;
280 
281  case 0x45:
282  if (!(InputData->Flags & KEY_BREAK))
283  newState ^= NUMLOCK_ON;
284  break;
285 
286  case 0x46:
287  if (!(InputData->Flags & KEY_BREAK))
288  newState ^= SCROLLLOCK_ON;
289  break;
290 
291  default:
292  return;
293  }
294  } else {
295  switch (InputData->MakeCode) {
296  case 0x1d:
298  break;
299 
300  case 0x38:
302  break;
303 
304  default:
305  return;
306  }
307  }
308 
309  /* Check if the state of the indicators has been changed */
310  if ((oldState ^ newState) & (NUMLOCK_ON | CAPSLOCK_ON | SCROLLLOCK_ON))
311  {
315 
316  kip.LedFlags = 0;
317  kip.UnitId = 0;
318 
319  if ((newState & NUMLOCK_ON))
321 
322  if ((newState & CAPSLOCK_ON))
324 
325  if ((newState & SCROLLLOCK_ON))
327 
328  /* Update the state of the leds on primary keyboard */
329  DPRINT("NtDeviceIoControlFile dwLeds=%x\n", kip.LedFlags);
330 
332  hConsoleInput,
333  NULL,
334  NULL,
335  NULL,
336  &IoStatusBlock,
338  &kip,
339  sizeof(kip),
340  NULL,
341  0);
342 
343  if (!NT_SUCCESS(Status))
344  {
345  DPRINT1("NtDeviceIoControlFile(IOCTL_KEYBOARD_SET_INDICATORS) failed (Status %lx)\n", Status);
346  }
347  } else
348  /* Normal press/release state handling */
349  if (InputData->Flags & KEY_BREAK)
350  newState &= ~Value;
351  else
352  newState |= Value;
353 
354  *State = newState;
355 }
_In_opt_ ULONG _Out_ PULONG Value
Definition: rtlfuncs.h:2327
#define SCROLLLOCK_ON
Definition: wincon.h:137
LONG NTSTATUS
Definition: precomp.h:26
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
#define KEYBOARD_CAPS_LOCK_ON
Definition: ntddkbd.h:81
#define SHIFT_PRESSED
Definition: wincon.h:135
#define KEY_BREAK
Definition: ntddkbd.h:71
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
#define LEFT_ALT_PRESSED
Definition: wincon.h:132
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
unsigned long DWORD
Definition: ntddk_ex.h:95
#define LEFT_CTRL_PRESSED
Definition: wincon.h:134
#define KEY_E1
Definition: ntddkbd.h:73
Status
Definition: gdiplustypes.h:24
enum State_ State
Definition: pofuncs.h:54
#define KEY_E0
Definition: ntddkbd.h:72
#define KEYBOARD_SCROLL_LOCK_ON
Definition: ntddkbd.h:83
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define DPRINT1
Definition: precomp.h:8
#define KEYBOARD_NUM_LOCK_ON
Definition: ntddkbd.h:82
#define RIGHT_CTRL_PRESSED
Definition: wincon.h:133
#define IOCTL_KEYBOARD_SET_INDICATORS
Definition: ntddkbd.h:47
#define NUMLOCK_ON
Definition: wincon.h:136
#define RIGHT_ALT_PRESSED
Definition: wincon.h:131
#define CAPSLOCK_ON
Definition: wincon.h:138

Referenced by IntTranslateKey().

◆ IntVKFromKbdInput()

static DWORD IntVKFromKbdInput ( PKEYBOARD_INPUT_DATA  InputData,
DWORD  KeyState 
)
static

Definition at line 358 of file keytrans.c.

359 {
360  if (!(KeyState & ENHANCED_KEY)) {
361  if ((KeyState & NUMLOCK_ON) &&
362  KeyTableNumlock[InputData->MakeCode & 0x7f]) {
363  DPRINT("Numlock, using %x\n",
364  InputData->MakeCode & 0x7f);
365  return KeyTableNumlock[InputData->MakeCode & 0x7f];
366  }
367  DPRINT("Not enhanced, using %x\n", InputData->MakeCode & 0x7f);
368  return KeyTable[InputData->MakeCode & 0x7f];
369  }
370 
371  DPRINT("Enhanced, using %x\n", InputData->MakeCode & 0x7f);
372  return KeyTableEnhanced[InputData->MakeCode & 0x7f];
373 }
void DPRINT(...)
Definition: polytest.cpp:61
#define ENHANCED_KEY
Definition: wincon.h:139
static WORD KeyTable[]
Definition: keytrans.c:34
static WORD KeyTableNumlock[]
Definition: keytrans.c:120
static WORD KeyTableEnhanced[]
Definition: keytrans.c:77
#define NUMLOCK_ON
Definition: wincon.h:136

Referenced by IntTranslateKey().

Variable Documentation

◆ KeyTable

WORD KeyTable[]
static

Definition at line 34 of file keytrans.c.

Referenced by IntVKFromKbdInput().

◆ KeyTableEnhanced

WORD KeyTableEnhanced[]
static

Definition at line 77 of file keytrans.c.

Referenced by IntVKFromKbdInput().

◆ KeyTableNumlock

WORD KeyTableNumlock[]
static

Definition at line 120 of file keytrans.c.

Referenced by IntVKFromKbdInput().

◆ ScanToAscii

SCANTOASCII ScanToAscii[]

Definition at line 172 of file keytrans.c.

Referenced by IntAsciiFromInput().