Author: jimtabor
Date: Thu Aug 11 15:53:05 2016
New Revision: 72197
URL:
http://svn.reactos.org/svn/reactos?rev=72197&view=rev
Log:
[NtUser]
- Fix up Language Layout Hotkey Toggle support for the new Keyboard switching. Support
registry settings. Dedicated to Dmitry Chapyshev.
- The registry entry it reads from is the wrong (the short number) one. Someone with
registry knowledge please help.
Also VK_LSHIFT is passed all the time and not VK_RSHIFT (WIP). Support for Left Alt and
Control work including SysParam.
- Side Tracks : Fixed CORE-5683. ReactOS can switch from keyboard processing or from
DeferWindowProc.
Modified:
trunk/reactos/win32ss/user/ntuser/input.h
trunk/reactos/win32ss/user/ntuser/keyboard.c
trunk/reactos/win32ss/user/ntuser/main.c
trunk/reactos/win32ss/user/ntuser/misc.c
trunk/reactos/win32ss/user/ntuser/msgqueue.c
trunk/reactos/win32ss/user/ntuser/ntuser.h
trunk/reactos/win32ss/user/ntuser/sysparams.c
Modified: trunk/reactos/win32ss/user/ntuser/input.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/input.…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/input.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/input.h [iso-8859-1] Thu Aug 11 15:53:05 2016
@@ -75,6 +75,8 @@
BOOL NTAPI UserSendKeyboardInput(KEYBDINPUT *pKbdInput, BOOL bInjected);
PKL NTAPI UserHklToKbl(HKL hKl);
BOOL NTAPI UserSetDefaultInputLang(HKL hKl);
+extern int gLanguageToggleKeyState;
+extern DWORD gdwLanguageToggleKey;
/* Mouse */
WORD FASTCALL UserGetMouseButtonsState(VOID);
Modified: trunk/reactos/win32ss/user/ntuser/keyboard.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/keyboa…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/keyboard.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/keyboard.c [iso-8859-1] Thu Aug 11 15:53:05 2016
@@ -15,6 +15,8 @@
static PKEYBOARD_INDICATOR_TRANSLATION gpKeyboardIndicatorTrans = NULL;
static KEYBOARD_INDICATOR_PARAMETERS gIndicators = {0, 0};
KEYBOARD_ATTRIBUTES gKeyboardInfo;
+int gLanguageToggleKeyState = 0;
+DWORD gdwLanguageToggleKey = 0;
/* FUNCTIONS *****************************************************************/
@@ -819,7 +821,7 @@
}
/* Check if this is a hotkey */
- if (co_UserProcessHotKeys(wSimpleVk, bIsDown))
+ if (co_UserProcessHotKeys(wSimpleVk, bIsDown)) //// Check if this is correct, refer
to hotkey sequence message tests.
{
TRACE("HotKey Processed\n");
bPostMsg = FALSE;
@@ -920,22 +922,6 @@
ERR("Set last input\n");
//ptiLastInput = pti;
}
- }
-
- // TODO: When initializing win32k: Reading from the registry hotkey combination
- // to switch the keyboard layout and store it to global variable.
- // Using this combination of hotkeys in this function
- if (wVk == VK_LSHIFT && IS_KEY_DOWN(gafAsyncKeyState, VK_LMENU))
- {
- PKL pkl = pti->KeyboardLayout;
-
- if (pkl != NULL)
- {
- UserPostMessage(UserHMGetHandle(Wnd),
- WM_INPUTLANGCHANGEREQUEST,
- INPUTLANGCHANGE_FORWARD,
- (LPARAM)pkl->hkl);
- }
}
/* If it is VK_PACKET, high word of wParam is used for wchar */
Modified: trunk/reactos/win32ss/user/ntuser/main.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/main.c…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/main.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/main.c [iso-8859-1] Thu Aug 11 15:53:05 2016
@@ -1004,6 +1004,8 @@
return Status;
}
+ gdwLanguageToggleKey = UserGetLanguageToggle();
+
gusLanguageID = UserGetLanguageID();
return STATUS_SUCCESS;
Modified: trunk/reactos/win32ss/user/ntuser/misc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/misc.c…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/misc.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/misc.c [iso-8859-1] Thu Aug 11 15:53:05 2016
@@ -49,6 +49,22 @@
_SEH2_END
ObDereferenceObject(Thread);
return pti;
+}
+
+DWORD
+FASTCALL
+UserGetLanguageToggle(VOID)
+{
+ NTSTATUS Status;
+ DWORD dwValue = 0;
+
+ Status = RegReadUserSetting(L"Keyboard Layout\\Toggle", L"Layout
Hotkey", REG_SZ, &dwValue, sizeof(dwValue));
+ if (NT_SUCCESS(Status))
+ {
+ dwValue = atoi((char *)&dwValue);
+ ERR("Layout Hotkey %d\n",dwValue);
+ }
+ return dwValue;
}
SHORT
Modified: trunk/reactos/win32ss/user/ntuser/msgqueue.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/msgque…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/msgqueue.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/msgqueue.c [iso-8859-1] Thu Aug 11 15:53:05 2016
@@ -1773,6 +1773,7 @@
PWND pWnd;
UINT ImmRet;
BOOL Ret = TRUE;
+ WPARAM wParam = Msg->wParam;
PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
if (Msg->message == VK_PACKET)
@@ -1833,6 +1834,81 @@
}
}
+ //// Key Down!
+ if ( *RemoveMessages && Msg->message == WM_SYSKEYDOWN )
+ {
+ if ( HIWORD(Msg->lParam) & KF_ALTDOWN )
+ {
+ if ( Msg->wParam == VK_ESCAPE || Msg->wParam == VK_TAB ) // Alt-Tab/ESC
Alt-Shift-Tab/ESC
+ {
+ WPARAM wParamTmp;
+
+ wParamTmp = UserGetKeyState(VK_SHIFT) & 0x8000 ? SC_PREVWINDOW :
SC_NEXTWINDOW;
+ TRACE("Send WM_SYSCOMMAND Alt-Tab/ESC Alt-Shift-Tab/ESC\n");
+ co_IntSendMessage( Msg->hwnd, WM_SYSCOMMAND, wParamTmp, Msg->wParam
);
+
+ //// Keep looping.
+ Ret = FALSE;
+ //// Skip the rest.
+ goto Exit;
+ }
+ }
+ }
+
+ if ( *RemoveMessages && (Msg->message == WM_SYSKEYDOWN || Msg->message
== WM_KEYDOWN) )
+ {
+ if (gdwLanguageToggleKey < 3)
+ {
+ if (IS_KEY_DOWN(gafAsyncKeyState, gdwLanguageToggleKey == 1 ? VK_LMENU :
VK_CONTROL)) // L Alt 1 or Ctrl 2 .
+ {
+ if ( wParam == VK_LSHIFT ) gLanguageToggleKeyState =
INPUTLANGCHANGE_FORWARD; // Left Alt - Left Shift, Next
+ //// FIXME : It seems to always be VK_LSHIFT.
+ if ( wParam == VK_RSHIFT ) gLanguageToggleKeyState =
INPUTLANGCHANGE_BACKWARD; // Left Alt - Right Shift, Previous
+ }
+ }
+ }
+
+ //// Key Up! Alt Key Ctrl Key
+ if ( *RemoveMessages && (Msg->message == WM_SYSKEYUP || Msg->message ==
WM_KEYUP) )
+ {
+ // When initializing win32k: Reading from the registry hotkey combination
+ // to switch the keyboard layout and store it to global variable.
+ // Using this combination of hotkeys in this function
+
+ if ( gdwLanguageToggleKey < 3 &&
+ IS_KEY_DOWN(gafAsyncKeyState, gdwLanguageToggleKey == 1 ? VK_LMENU :
VK_CONTROL) )
+ {
+ if ( Msg->wParam == VK_SHIFT && !(IS_KEY_DOWN(gafAsyncKeyState,
VK_SHIFT)))
+ {
+ PKL pkl = pti->KeyboardLayout;
+
+ if (pWnd) UserDerefObjectCo(pWnd);
+
+ //// Seems to override message window.
+ if (!(pWnd = pti->MessageQueue->spwndFocus))
+ {
+ pWnd = pti->MessageQueue->spwndActive;
+ }
+ if (pWnd) UserRefObjectCo(pWnd, &Ref);
+
+ if (pkl != NULL && gLanguageToggleKeyState)
+ {
+ TRACE("Posting WM_INPUTLANGCHANGEREQUEST KeyState %d\n",
gLanguageToggleKeyState );
+ UserPostMessage(UserHMGetHandle(pWnd),
+ WM_INPUTLANGCHANGEREQUEST,
+ gLanguageToggleKeyState,
+ (LPARAM)pkl->hkl);
+
+ gLanguageToggleKeyState = 0;
+ //// Keep looping.
+ Ret = FALSE;
+ //// Skip the rest.
+ goto Exit;
+ }
+ }
+ }
+ }
+
if (co_HOOK_CallHooks( WH_KEYBOARD,
*RemoveMessages ? HC_ACTION : HC_NOREMOVE,
LOWORD(Msg->wParam),
@@ -1865,7 +1941,7 @@
}
}
}
-
+Exit:
if (pWnd) UserDerefObjectCo(pWnd);
return Ret;
}
Modified: trunk/reactos/win32ss/user/ntuser/ntuser.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/ntuser…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/ntuser.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/ntuser.h [iso-8859-1] Thu Aug 11 15:53:05 2016
@@ -26,5 +26,6 @@
VOID FASTCALL UserLeave(VOID);
BOOL FASTCALL UserIsEntered(VOID);
BOOL FASTCALL UserIsEnteredExclusive(VOID);
+DWORD FASTCALL UserGetLanguageToggle(VOID);
/* EOF */
Modified: trunk/reactos/win32ss/user/ntuser/sysparams.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/syspar…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/sysparams.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/sysparams.c [iso-8859-1] Thu Aug 11 15:53:05 2016
@@ -1209,7 +1209,8 @@
}
case SPI_SETLANGTOGGLE:
- ERR("SPI_SETLANGTOGGLE is unimplemented\n");
+ gdwLanguageToggleKey = UserGetLanguageToggle();;
+ return gdwLanguageToggleKey;
break;
case SPI_GETWINDOWSEXTENSION: