mirror of
https://github.com/reactos/reactos.git
synced 2024-07-11 07:05:12 +00:00
Commits for bug 193, merged from release branch.
svn path=/trunk/; revision=8259
This commit is contained in:
parent
a884236737
commit
82bad008ac
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: conio.c,v 1.3 2004/01/11 17:31:16 gvg Exp $
|
/* $Id: conio.c,v 1.4 2004/02/19 06:59:50 arty Exp $
|
||||||
*
|
*
|
||||||
* reactos/subsys/csrss/win32csr/conio.c
|
* reactos/subsys/csrss/win32csr/conio.c
|
||||||
*
|
*
|
||||||
|
@ -1125,30 +1125,6 @@ ConioGetShiftState(PBYTE KeyState)
|
||||||
UINT vk = MapVirtualKeyExW(i, 3, 0) & 0xff;
|
UINT vk = MapVirtualKeyExW(i, 3, 0) & 0xff;
|
||||||
switch(vk)
|
switch(vk)
|
||||||
{
|
{
|
||||||
case VK_LSHIFT:
|
|
||||||
case VK_RSHIFT:
|
|
||||||
case VK_SHIFT:
|
|
||||||
ssOut |= SHIFT_PRESSED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VK_LCONTROL:
|
|
||||||
case VK_CONTROL:
|
|
||||||
ssOut |= LEFT_CTRL_PRESSED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VK_RCONTROL:
|
|
||||||
ssOut |= RIGHT_CTRL_PRESSED | ENHANCED_KEY;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VK_LMENU:
|
|
||||||
case VK_MENU:
|
|
||||||
ssOut |= LEFT_ALT_PRESSED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VK_RMENU:
|
|
||||||
ssOut |= RIGHT_ALT_PRESSED | ENHANCED_KEY;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VK_CAPITAL:
|
case VK_CAPITAL:
|
||||||
ssOut |= CAPSLOCK_ON;
|
ssOut |= CAPSLOCK_ON;
|
||||||
break;
|
break;
|
||||||
|
@ -1164,6 +1140,19 @@ ConioGetShiftState(PBYTE KeyState)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (KeyState[VK_LSHIFT] || KeyState[VK_RSHIFT] & 0x80)
|
||||||
|
ssOut |= SHIFT_PRESSED;
|
||||||
|
|
||||||
|
if (KeyState[VK_LCONTROL] & 0x80)
|
||||||
|
ssOut |= RIGHT_CTRL_PRESSED;
|
||||||
|
else if (KeyState[VK_RCONTROL] & 0x80)
|
||||||
|
ssOut |= LEFT_CTRL_PRESSED;
|
||||||
|
|
||||||
|
if (KeyState[VK_LMENU] & 0x80)
|
||||||
|
ssOut |= RIGHT_ALT_PRESSED;
|
||||||
|
else if (KeyState[VK_RMENU] & 0x80)
|
||||||
|
ssOut |= LEFT_ALT_PRESSED;
|
||||||
|
|
||||||
return ssOut;
|
return ssOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1270,7 +1259,7 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
ConInRec->InputEvent = er;
|
ConInRec->InputEvent = er;
|
||||||
ConInRec->Fake = AsciiChar &&
|
ConInRec->Fake =
|
||||||
(msg->message != WM_CHAR && msg->message != WM_SYSCHAR &&
|
(msg->message != WM_CHAR && msg->message != WM_SYSCHAR &&
|
||||||
msg->message != WM_KEYUP && msg->message != WM_SYSKEYUP);
|
msg->message != WM_KEYUP && msg->message != WM_SYSKEYUP);
|
||||||
ConInRec->NotChar = (msg->message != WM_CHAR && msg->message != WM_SYSCHAR);
|
ConInRec->NotChar = (msg->message != WM_CHAR && msg->message != WM_SYSCHAR);
|
||||||
|
@ -1278,16 +1267,16 @@ ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode)
|
||||||
if (ConInRec->NotChar)
|
if (ConInRec->NotChar)
|
||||||
LastVirtualKey = msg->wParam;
|
LastVirtualKey = msg->wParam;
|
||||||
|
|
||||||
DPRINT("csrss: %s %s %s %s %02x %02x '%c' %04x\n",
|
DPRINT ("csrss: %s %s %s %s %02x %02x '%c' %04x\n",
|
||||||
Down ? "down" : "up ",
|
Down ? "down" : "up ",
|
||||||
(msg->message == WM_CHAR || msg->message == WM_SYSCHAR) ?
|
(msg->message == WM_CHAR || msg->message == WM_SYSCHAR) ?
|
||||||
"char" : "key ",
|
"char" : "key ",
|
||||||
ConInRec->Fake ? "fake" : "real",
|
ConInRec->Fake ? "fake" : "real",
|
||||||
ConInRec->NotChar ? "notc" : "char",
|
ConInRec->NotChar ? "notc" : "char",
|
||||||
VirtualScanCode,
|
VirtualScanCode,
|
||||||
VirtualKeyCode,
|
VirtualKeyCode,
|
||||||
(AsciiChar >= ' ') ? AsciiChar : '.',
|
(AsciiChar >= ' ') ? AsciiChar : '.',
|
||||||
ShiftState);
|
ShiftState);
|
||||||
|
|
||||||
if (! ConInRec->Fake || ! ConInRec->NotChar)
|
if (! ConInRec->Fake || ! ConInRec->NotChar)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $Id: makefile,v 1.92 2004/02/08 21:37:52 weiden Exp $
|
# $Id: makefile,v 1.93 2004/02/19 06:59:50 arty Exp $
|
||||||
|
|
||||||
PATH_TO_TOP = ../..
|
PATH_TO_TOP = ../..
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ ENG_OBJECTS= eng/debug.o eng/error.o eng/mem.o eng/brush.o eng/bitblt.o \
|
||||||
eng/clip.o eng/copybits.o eng/device.o eng/handle.o eng/lineto.o \
|
eng/clip.o eng/copybits.o eng/device.o eng/handle.o eng/lineto.o \
|
||||||
eng/paint.o eng/palette.o eng/perfcnt.o eng/semaphor.o eng/surface.o \
|
eng/paint.o eng/palette.o eng/perfcnt.o eng/semaphor.o eng/surface.o \
|
||||||
eng/xlate.o eng/transblt.o eng/mouse.o eng/misc.o eng/nls.o eng/sort.o \
|
eng/xlate.o eng/transblt.o eng/mouse.o eng/misc.o eng/nls.o eng/sort.o \
|
||||||
eng/gradient.o
|
eng/gradient.o
|
||||||
|
|
||||||
MAIN_OBJECTS = main/dllmain.o main/svctabm.o
|
MAIN_OBJECTS = main/dllmain.o main/svctabm.o
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: keyboard.c,v 1.22 2004/02/19 03:45:44 arty Exp $
|
/* $Id: keyboard.c,v 1.23 2004/02/19 06:59:50 arty Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -55,7 +55,6 @@
|
||||||
/* Key States */
|
/* Key States */
|
||||||
#define KS_DOWN_MASK 0xc0
|
#define KS_DOWN_MASK 0xc0
|
||||||
#define KS_DOWN_BIT 0x80
|
#define KS_DOWN_BIT 0x80
|
||||||
#define KS_EXT_BIT 0x40
|
|
||||||
#define KS_LOCK_BIT 0x01
|
#define KS_LOCK_BIT 0x01
|
||||||
/* lParam bits */
|
/* lParam bits */
|
||||||
#define LP_EXT_BIT (1<<24)
|
#define LP_EXT_BIT (1<<24)
|
||||||
|
@ -78,25 +77,43 @@ NTSTATUS FASTCALL InitKeyboardImpl(VOID) {
|
||||||
|
|
||||||
/*** Statics used by TranslateMessage ***/
|
/*** Statics used by TranslateMessage ***/
|
||||||
|
|
||||||
/*** Shift state code needs to be cleaned up here. Sorry, I let it get out
|
/*** Shift state code was out of hand, sorry. --- arty */
|
||||||
* of hand. */
|
|
||||||
|
|
||||||
static UINT DontDistinguishShifts( UINT ret ) {
|
static UINT DontDistinguishShifts( UINT ret ) {
|
||||||
if( ret == VK_LSHIFT || ret == VK_RSHIFT ) ret = VK_SHIFT;
|
if( ret == VK_LSHIFT || ret == VK_RSHIFT ) ret = VK_LSHIFT;
|
||||||
if( ret == VK_LCONTROL || ret == VK_RCONTROL ) ret = VK_CONTROL;
|
if( ret == VK_LCONTROL || ret == VK_RCONTROL ) ret = VK_LCONTROL;
|
||||||
if( ret == VK_LMENU || ret == VK_RMENU ) ret = VK_MENU;
|
if( ret == VK_LMENU || ret == VK_RMENU ) ret = VK_LMENU;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID STDCALL SetKeyState(DWORD key, DWORD vk, DWORD ext, BOOL down) {
|
static VOID STDCALL SetKeyState(DWORD key, DWORD vk, DWORD ext, BOOL down) {
|
||||||
/* Special handling for toggles like numpad and caps lock */
|
/* Special handling for toggles like numpad and caps lock */
|
||||||
|
|
||||||
if (vk == VK_CAPITAL || vk == VK_NUMLOCK)
|
if (vk == VK_CAPITAL || vk == VK_NUMLOCK)
|
||||||
{
|
{
|
||||||
if (down) QueueKeyStateTable[key] ^= 1;
|
if (down) QueueKeyStateTable[key] ^= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (vk == VK_LSHIFT && ext) {
|
||||||
|
SetKeyState(VK_RSHIFT, 0, 0, down);
|
||||||
|
} else if (vk == VK_LSHIFT || vk == VK_SHIFT) {
|
||||||
|
SetKeyState(VK_LSHIFT, 0, 0, down);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vk == VK_LCONTROL && ext) {
|
||||||
|
SetKeyState(VK_RCONTROL, 0, 0, down);
|
||||||
|
} else if (vk == VK_LCONTROL || vk == VK_CONTROL) {
|
||||||
|
SetKeyState(VK_LCONTROL, 0, 0, down);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vk == VK_LMENU && ext) {
|
||||||
|
SetKeyState(VK_RMENU, 0, 0, down);
|
||||||
|
} else if (vk == VK_LMENU || vk == VK_MENU) {
|
||||||
|
SetKeyState(VK_LMENU, 0, 0, down);
|
||||||
|
}
|
||||||
|
|
||||||
if (down)
|
if (down)
|
||||||
QueueKeyStateTable[key] |= KS_DOWN_BIT | (ext ? KS_EXT_BIT : 0);
|
QueueKeyStateTable[key] |= KS_DOWN_BIT;
|
||||||
else
|
else
|
||||||
QueueKeyStateTable[key] &= ~KS_DOWN_MASK;
|
QueueKeyStateTable[key] &= ~KS_DOWN_MASK;
|
||||||
}
|
}
|
||||||
|
@ -112,71 +129,64 @@ VOID DumpKeyState( PBYTE KeyState ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static BYTE KeysSet( PKBDTABLES pkKT, PBYTE KeyState,
|
static BYTE KeysSet( PKBDTABLES pkKT, PBYTE KeyState,
|
||||||
int Mod, int FakeModLeft, int FakeModRight ) {
|
int FakeModLeft, int FakeModRight ) {
|
||||||
int i;
|
|
||||||
UINT Vk = 0;
|
|
||||||
|
|
||||||
if( !KeyState || !pkKT ) return 0;
|
if( !KeyState || !pkKT ) return 0;
|
||||||
|
|
||||||
for( i = 0; i < pkKT->bMaxVSCtoVK; i++ ) {
|
/* Search special codes first */
|
||||||
Vk = pkKT->pusVSCtoVK[i] & 0xff;
|
if( FakeModLeft && KeyState[FakeModLeft] )
|
||||||
if( KeyState[i] &&
|
return KeyState[FakeModLeft];
|
||||||
((Vk == Mod) ||
|
else if( FakeModRight && KeyState[FakeModRight] )
|
||||||
(FakeModLeft && Vk == FakeModLeft) ||
|
return KeyState[FakeModRight];
|
||||||
(FakeModRight && Vk == FakeModRight)) ) {
|
|
||||||
return KeyState[i];
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/* Search the keyboard layout modifiers table for the shift bit. I don't
|
||||||
|
* want to count on the shift bit not moving, because it can be specified
|
||||||
|
* in the layout */
|
||||||
|
|
||||||
|
static DWORD FASTCALL GetShiftBit( PKBDTABLES pkKT, DWORD Vk ) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for( i = 0; pkKT->pCharModifiers->pVkToBit[i].Vk; i++ )
|
||||||
|
if( pkKT->pCharModifiers->pVkToBit[i].Vk == Vk )
|
||||||
|
return pkKT->pCharModifiers->pVkToBit[i].ModBits;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DWORD ModBits( PKBDTABLES pkKT, PBYTE KeyState ) {
|
static DWORD ModBits( PKBDTABLES pkKT, PBYTE KeyState ) {
|
||||||
int i;
|
|
||||||
DWORD ModBits = 0;
|
DWORD ModBits = 0;
|
||||||
BYTE Mask;
|
|
||||||
|
|
||||||
if( !KeyState ) return 0;
|
if( !KeyState ) return 0;
|
||||||
|
|
||||||
/* DumpKeyState( KeyState ); */
|
/* DumpKeyState( KeyState ); */
|
||||||
|
|
||||||
for( i = 0; pkKT->pCharModifiers->pVkToBit[i].Vk; i++ ) {
|
if (KeysSet( pkKT, KeyState, VK_LSHIFT, VK_RSHIFT ) &
|
||||||
int Vk = pkKT->pCharModifiers->pVkToBit[i].Vk;
|
KS_DOWN_BIT)
|
||||||
switch(Vk)
|
ModBits |= GetShiftBit( pkKT, VK_SHIFT );
|
||||||
{
|
|
||||||
case VK_SHIFT:
|
if (KeysSet( pkKT, KeyState, VK_LCONTROL, VK_RCONTROL ) &
|
||||||
Mask = KeysSet( pkKT, KeyState, Vk, VK_LSHIFT, VK_RSHIFT );
|
KS_DOWN_BIT )
|
||||||
if (Mask & KS_DOWN_MASK)
|
ModBits |= GetShiftBit( pkKT, VK_CONTROL );
|
||||||
ModBits |= pkKT->pCharModifiers->pVkToBit[i].ModBits;
|
|
||||||
break;
|
|
||||||
case VK_CONTROL:
|
|
||||||
Mask = KeysSet( pkKT, KeyState, Vk, VK_LCONTROL, VK_RCONTROL );
|
|
||||||
if (Mask & KS_DOWN_MASK)
|
|
||||||
ModBits |= pkKT->pCharModifiers->pVkToBit[i].ModBits;
|
|
||||||
break;
|
|
||||||
case VK_MENU:
|
|
||||||
Mask = KeysSet( pkKT, KeyState, Vk, VK_LMENU, VK_RMENU );
|
|
||||||
if (Mask & KS_DOWN_MASK)
|
|
||||||
ModBits |= pkKT->pCharModifiers->pVkToBit[i].ModBits;
|
|
||||||
if (Mask & KS_EXT_BIT)
|
|
||||||
ModBits |= MOD_KCTRL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Mask = KeysSet( pkKT, KeyState, Vk, 0, 0 );
|
|
||||||
if (Mask & KS_DOWN_BIT)
|
|
||||||
ModBits |= pkKT->pCharModifiers->pVkToBit[i].ModBits;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Deal with VK_CAPITAL */
|
if (KeysSet( pkKT, KeyState, VK_LMENU, VK_RMENU ) &
|
||||||
if (KeysSet( pkKT, KeyState, VK_CAPITAL, 0, 0 ) & KS_LOCK_BIT)
|
KS_DOWN_BIT )
|
||||||
|
ModBits |= GetShiftBit( pkKT, VK_MENU );
|
||||||
|
|
||||||
|
/* Handle Alt+Gr */
|
||||||
|
if (KeysSet( pkKT, KeyState, VK_RMENU, 0 ) &
|
||||||
|
KS_DOWN_BIT )
|
||||||
|
ModBits |= GetShiftBit( pkKT, VK_CONTROL );
|
||||||
|
|
||||||
|
/* Deal with VK_CAPITAL */
|
||||||
|
if (KeysSet( pkKT, KeyState, VK_CAPITAL, 0 ) & KS_LOCK_BIT)
|
||||||
{
|
{
|
||||||
ModBits |= CAPITAL_BIT;
|
ModBits |= CAPITAL_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deal with VK_NUMLOCK */
|
/* Deal with VK_NUMLOCK */
|
||||||
if (KeysSet( pkKT, KeyState, VK_NUMLOCK, 0, 0 ) & KS_LOCK_BIT)
|
if (KeysSet( pkKT, KeyState, VK_NUMLOCK, 0 ) & KS_LOCK_BIT)
|
||||||
{
|
{
|
||||||
ModBits |= NUMLOCK_BIT;
|
ModBits |= NUMLOCK_BIT;
|
||||||
}
|
}
|
||||||
|
@ -209,13 +219,9 @@ static BOOL TryToTranslateChar(WORD wVirtKey,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
shift = keyLayout->pCharModifiers->ModNumber[ModBits];
|
shift = keyLayout->pCharModifiers->ModNumber[ModBits];
|
||||||
|
|
||||||
for (nMod = 0; keyLayout->pVkToWcharTable[nMod].nModifications; nMod++)
|
for (nMod = 0; keyLayout->pVkToWcharTable[nMod].nModifications; nMod++)
|
||||||
{
|
{
|
||||||
if (shift > keyLayout->pVkToWcharTable[nMod].nModifications)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
vtwTbl = &keyLayout->pVkToWcharTable[nMod];
|
vtwTbl = &keyLayout->pVkToWcharTable[nMod];
|
||||||
size_this_entry = vtwTbl->cbSize;
|
size_this_entry = vtwTbl->cbSize;
|
||||||
vkPtr = (PVK_TO_WCHARS10)((BYTE *)vtwTbl->pVkToWchars);
|
vkPtr = (PVK_TO_WCHARS10)((BYTE *)vtwTbl->pVkToWchars);
|
||||||
|
@ -225,13 +231,24 @@ static BOOL TryToTranslateChar(WORD wVirtKey,
|
||||||
{
|
{
|
||||||
CapsMod =
|
CapsMod =
|
||||||
shift | ((CapsState & CAPITAL_BIT) ? vkPtr->Attributes : 0);
|
shift | ((CapsState & CAPITAL_BIT) ? vkPtr->Attributes : 0);
|
||||||
|
|
||||||
|
if( CapsMod > keyLayout->pVkToWcharTable[nMod].nModifications ) {
|
||||||
|
DWORD MaxBit = 1;
|
||||||
|
while( MaxBit <
|
||||||
|
keyLayout->pVkToWcharTable[nMod].nModifications )
|
||||||
|
MaxBit <<= 1;
|
||||||
|
|
||||||
|
CapsMod &= MaxBit - 1; /* Guarantee that CapsMod lies
|
||||||
|
in bounds. */
|
||||||
|
}
|
||||||
|
|
||||||
*pbDead = vkPtr->wch[CapsMod] == WCH_DEAD;
|
*pbDead = vkPtr->wch[CapsMod] == WCH_DEAD;
|
||||||
*pbLigature = vkPtr->wch[CapsMod] == WCH_LGTR;
|
*pbLigature = vkPtr->wch[CapsMod] == WCH_LGTR;
|
||||||
*pwcTranslatedChar = vkPtr->wch[CapsMod];
|
*pwcTranslatedChar = vkPtr->wch[CapsMod];
|
||||||
|
|
||||||
DPRINT("CapsMod %08x CapsState %08x shift %08x Char %04x\n",
|
DPRINT("%d %04x: CapsMod %08x CapsState %08x shift %08x Char %04x\n",
|
||||||
CapsMod, CapsState, shift, *pwcTranslatedChar);
|
nMod, wVirtKey,
|
||||||
|
CapsMod, CapsState, shift, *pwcTranslatedChar);
|
||||||
|
|
||||||
if( *pbDead )
|
if( *pbDead )
|
||||||
{
|
{
|
||||||
|
@ -299,7 +316,6 @@ NtUserGetKeyState(
|
||||||
ExAcquireFastMutex(&QueueStateLock);
|
ExAcquireFastMutex(&QueueStateLock);
|
||||||
if( key < 0x100 ) {
|
if( key < 0x100 ) {
|
||||||
ret = ((DWORD)(QueueKeyStateTable[key] & KS_DOWN_BIT) << 8 ) |
|
ret = ((DWORD)(QueueKeyStateTable[key] & KS_DOWN_BIT) << 8 ) |
|
||||||
(QueueKeyStateTable[key] & KS_EXT_BIT) |
|
|
||||||
(QueueKeyStateTable[key] & KS_LOCK_BIT);
|
(QueueKeyStateTable[key] & KS_LOCK_BIT);
|
||||||
}
|
}
|
||||||
ExReleaseFastMutex(&QueueStateLock);
|
ExReleaseFastMutex(&QueueStateLock);
|
||||||
|
@ -780,6 +796,7 @@ static UINT IntMapVirtualKeyEx( UINT Code, UINT Type, PKBDTABLES keyLayout ) {
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
|
|
||||||
ret = ScanToVk( Code, FALSE, keyLayout );
|
ret = ScanToVk( Code, FALSE, keyLayout );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -914,20 +931,6 @@ NtUserGetKeyNameText( LONG lParam, LPWSTR lpString, int nSize ) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Search the keyboard layout modifiers table for the shift bit. I don't
|
|
||||||
* want to count on the shift bit not moving, because it can be specified
|
|
||||||
* in the layout */
|
|
||||||
|
|
||||||
static DWORD FASTCALL GetShiftBit( PKBDTABLES pkKT ) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for( i = 0; pkKT->pCharModifiers->pVkToBit[i].Vk; i++ )
|
|
||||||
if( pkKT->pCharModifiers->pVkToBit[i].Vk == VK_SHIFT )
|
|
||||||
return pkKT->pCharModifiers->pVkToBit[i].ModBits;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Filter this message according to the current key layout, setting wParam
|
* Filter this message according to the current key layout, setting wParam
|
||||||
* appropriately.
|
* appropriately.
|
||||||
|
@ -975,7 +978,7 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) {
|
||||||
RawVk = KeyboardLayout->pusVSCtoVK[ScanCode];
|
RawVk = KeyboardLayout->pusVSCtoVK[ScanCode];
|
||||||
|
|
||||||
if ((ModifierBits & NUMLOCK_BIT) &&
|
if ((ModifierBits & NUMLOCK_BIT) &&
|
||||||
!(ModifierBits & GetShiftBit(KeyboardLayout)) &&
|
!(ModifierBits & GetShiftBit(KeyboardLayout, VK_SHIFT)) &&
|
||||||
(RawVk & KNUMP) &&
|
(RawVk & KNUMP) &&
|
||||||
!(Msg->lParam & LP_EXT_BIT))
|
!(Msg->lParam & LP_EXT_BIT))
|
||||||
{
|
{
|
||||||
|
@ -1006,6 +1009,12 @@ VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyboardLayout) {
|
||||||
FALSE ); /* Release key */
|
FALSE ); /* Release key */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We need to unset SYSKEYDOWN if the ALT key is an ALT+Gr */
|
||||||
|
if( QueueKeyStateTable[VK_RMENU] & KS_DOWN_BIT ) {
|
||||||
|
if( Msg->message == WM_SYSKEYDOWN ) Msg->message = WM_KEYDOWN;
|
||||||
|
else Msg->message = WM_KEYUP;
|
||||||
|
}
|
||||||
|
|
||||||
ExReleaseFastMutex(&QueueStateLock);
|
ExReleaseFastMutex(&QueueStateLock);
|
||||||
}
|
}
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
Loading…
Reference in a new issue