mirror of
https://github.com/reactos/reactos.git
synced 2024-09-05 18:26:53 +00:00
147 lines
4.2 KiB
C
147 lines
4.2 KiB
C
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS Console Server DLL
|
|
* FILE: win32ss/user/winsrv/consrv_new/frontends/input.c
|
|
* PURPOSE: Common Front-Ends Input functions
|
|
* PROGRAMMERS: Jeffrey Morlan
|
|
* Hermes Belusca-Maito (hermes.belusca@sfr.fr)
|
|
*/
|
|
|
|
/* INCLUDES *******************************************************************/
|
|
|
|
#include "consrv.h"
|
|
#include "include/conio.h"
|
|
#include "include/conio2.h"
|
|
#include "coninput.h"
|
|
|
|
#define NDEBUG
|
|
#include <debug.h>
|
|
|
|
|
|
/* PRIVATE FUNCTIONS **********************************************************/
|
|
|
|
static DWORD FASTCALL
|
|
ConioGetShiftState(PBYTE KeyState, LPARAM lParam)
|
|
{
|
|
DWORD ssOut = 0;
|
|
|
|
if (KeyState[VK_CAPITAL] & 0x01)
|
|
ssOut |= CAPSLOCK_ON;
|
|
|
|
if (KeyState[VK_NUMLOCK] & 0x01)
|
|
ssOut |= NUMLOCK_ON;
|
|
|
|
if (KeyState[VK_SCROLL] & 0x01)
|
|
ssOut |= SCROLLLOCK_ON;
|
|
|
|
if (KeyState[VK_SHIFT] & 0x80)
|
|
ssOut |= SHIFT_PRESSED;
|
|
|
|
if (KeyState[VK_LCONTROL] & 0x80)
|
|
ssOut |= LEFT_CTRL_PRESSED;
|
|
if (KeyState[VK_RCONTROL] & 0x80)
|
|
ssOut |= RIGHT_CTRL_PRESSED;
|
|
|
|
if (KeyState[VK_LMENU] & 0x80)
|
|
ssOut |= LEFT_ALT_PRESSED;
|
|
if (KeyState[VK_RMENU] & 0x80)
|
|
ssOut |= RIGHT_ALT_PRESSED;
|
|
|
|
/* See WM_CHAR MSDN documentation for instance */
|
|
if (lParam & 0x01000000)
|
|
ssOut |= ENHANCED_KEY;
|
|
|
|
return ssOut;
|
|
}
|
|
|
|
VOID WINAPI
|
|
ConioProcessKey(PCONSOLE Console, MSG* msg)
|
|
{
|
|
static BYTE KeyState[256] = { 0 };
|
|
/* MSDN mentions that you should use the last virtual key code received
|
|
* when putting a virtual key identity to a WM_CHAR message since multiple
|
|
* or translated keys may be involved. */
|
|
static UINT LastVirtualKey = 0;
|
|
DWORD ShiftState;
|
|
WCHAR UnicodeChar;
|
|
UINT VirtualKeyCode;
|
|
UINT VirtualScanCode;
|
|
BOOL Down = FALSE;
|
|
BOOLEAN Fake; // synthesized, not a real event
|
|
BOOLEAN NotChar; // message should not be used to return a character
|
|
|
|
if (NULL == Console)
|
|
{
|
|
DPRINT1("No Active Console!\n");
|
|
return;
|
|
}
|
|
|
|
VirtualScanCode = HIWORD(msg->lParam) & 0xFF;
|
|
Down = msg->message == WM_KEYDOWN || msg->message == WM_CHAR ||
|
|
msg->message == WM_SYSKEYDOWN || msg->message == WM_SYSCHAR;
|
|
|
|
GetKeyboardState(KeyState);
|
|
ShiftState = ConioGetShiftState(KeyState, msg->lParam);
|
|
|
|
if (msg->message == WM_CHAR || msg->message == WM_SYSCHAR)
|
|
{
|
|
VirtualKeyCode = LastVirtualKey;
|
|
UnicodeChar = msg->wParam;
|
|
}
|
|
else
|
|
{
|
|
WCHAR Chars[2];
|
|
INT RetChars = 0;
|
|
|
|
VirtualKeyCode = msg->wParam;
|
|
RetChars = ToUnicodeEx(VirtualKeyCode,
|
|
VirtualScanCode,
|
|
KeyState,
|
|
Chars,
|
|
2,
|
|
0,
|
|
NULL);
|
|
UnicodeChar = (1 == RetChars ? Chars[0] : 0);
|
|
}
|
|
|
|
if (ConioProcessKeyCallback(Console,
|
|
msg,
|
|
KeyState[VK_MENU],
|
|
ShiftState,
|
|
VirtualKeyCode,
|
|
Down))
|
|
{
|
|
return;
|
|
}
|
|
|
|
Fake = UnicodeChar &&
|
|
(msg->message != WM_CHAR && msg->message != WM_SYSCHAR &&
|
|
msg->message != WM_KEYUP && msg->message != WM_SYSKEYUP);
|
|
NotChar = (msg->message != WM_CHAR && msg->message != WM_SYSCHAR);
|
|
if (NotChar) LastVirtualKey = msg->wParam;
|
|
|
|
DPRINT("CONSRV: %s %s %s %s %02x %02x '%lc' %04x\n",
|
|
Down ? "down" : "up ",
|
|
(msg->message == WM_CHAR || msg->message == WM_SYSCHAR) ?
|
|
"char" : "key ",
|
|
Fake ? "fake" : "real",
|
|
NotChar ? "notc" : "char",
|
|
VirtualScanCode,
|
|
VirtualKeyCode,
|
|
(UnicodeChar >= L' ') ? UnicodeChar : L'.',
|
|
ShiftState);
|
|
|
|
if (Fake) return;
|
|
|
|
/* Send the key press to the console driver */
|
|
ConDrvProcessKey(Console,
|
|
Down,
|
|
VirtualKeyCode,
|
|
VirtualScanCode,
|
|
UnicodeChar,
|
|
ShiftState,
|
|
KeyState[VK_CONTROL]);
|
|
}
|
|
|
|
/* EOF */
|