https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b4f73f040f1c329b4fdc2c46efd600c2f538a411

commit b4f73f040f1c329b4fdc2c46efd600c2f538a411
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Wed Aug 24 07:31:46 2022 +0900
Commit:     GitHub <[email protected]>
CommitDate: Wed Aug 24 07:31:46 2022 +0900

    [KBSWITCH][NTUSER] Realize Shift+Alt language switch (#4622)
    
    - Fix co_UserProcessHotKeys on modifiers-only hot-keys.
    - Add Alt+Shift hot-keys to kbswitch window.
    CORE-11737
---
 base/applications/kbswitch/kbswitch.c | 37 ++++++++++++++++++++++++++++++++---
 win32ss/user/ntuser/hotkey.c          |  4 +++-
 2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/base/applications/kbswitch/kbswitch.c 
b/base/applications/kbswitch/kbswitch.c
index 61fa5cc4cb8..5057fda8e42 100644
--- a/base/applications/kbswitch/kbswitch.c
+++ b/base/applications/kbswitch/kbswitch.c
@@ -4,6 +4,7 @@
  * PURPOSE:         Switching Keyboard Layouts
  * PROGRAMMERS:     Dmitry Chapyshev ([email protected])
  *                  Colin Finck ([email protected])
+ *                  Katayama Hirofumi MZ ([email protected])
  */
 
 #include "kbswitch.h"
@@ -13,7 +14,7 @@
 PKBSWITCHSETHOOKS KbSwitchSetHooks    = NULL;
 PKBSWITCHDELETEHOOKS KbSwitchDeleteHooks = NULL;
 UINT ShellHookMessage = 0;
-
+DWORD dwAltShiftHotKeyId = 0, dwShiftAltHotKeyId = 0;
 
 static BOOL
 GetLayoutID(LPTSTR szLayoutNum, LPTSTR szLCID, SIZE_T LCIDLength);
@@ -414,6 +415,25 @@ UpdateLanguageDisplayCurrent(HWND hwnd, WPARAM wParam)
     return UpdateLanguageDisplay(hwnd, 
GetKeyboardLayout(GetWindowThreadProcessId((HWND)wParam, 0)));
 }
 
+VOID DoRegisterAltShiftHotKeys(HWND hwnd)
+{
+    dwAltShiftHotKeyId = GlobalAddAtom(TEXT("ReactOS Alt+Shift"));
+    dwShiftAltHotKeyId = GlobalAddAtom(TEXT("ReactOS Shift+Alt"));
+
+    RegisterHotKey(hwnd, dwAltShiftHotKeyId, MOD_ALT | MOD_SHIFT, VK_SHIFT);
+    RegisterHotKey(hwnd, dwShiftAltHotKeyId, MOD_ALT | MOD_SHIFT, VK_MENU);
+}
+
+VOID DoUnregisterAltShiftHotKeys(HWND hwnd)
+{
+    UnregisterHotKey(hwnd, dwAltShiftHotKeyId);
+    UnregisterHotKey(hwnd, dwShiftAltHotKeyId);
+
+    GlobalDeleteAtom(dwAltShiftHotKeyId);
+    GlobalDeleteAtom(dwShiftAltHotKeyId);
+    dwAltShiftHotKeyId = dwShiftAltHotKeyId = 0;
+}
+
 LRESULT CALLBACK
 WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
 {
@@ -431,6 +451,7 @@ WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM 
lParam)
             ActivateLayout(hwnd, ulCurrentLayoutNum);
             s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
 
+            DoRegisterAltShiftHotKeys(hwnd);
             return 0;
         }
 
@@ -439,10 +460,19 @@ WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM 
lParam)
             return UpdateLanguageDisplay(hwnd, (HKL)lParam);
         }
 
-        case WM_LOAD_LAYOUT:
+        case WM_HOTKEY:
         {
-            ActivateLayout(hwnd, GetNextLayout());
+            if (wParam != dwAltShiftHotKeyId && wParam != dwShiftAltHotKeyId)
+                break;
 
+            /* FALL THROUGH */
+        }
+
+        case WM_LOAD_LAYOUT:
+        {
+            ULONG uNextNum = GetNextLayout();
+            if (ulCurrentLayoutNum != uNextNum)
+                ActivateLayout(hwnd, uNextNum);
             return 0;
         }
 
@@ -526,6 +556,7 @@ WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM 
lParam)
 
         case WM_DESTROY:
         {
+            DoUnregisterAltShiftHotKeys(hwnd);
             DeleteHooks();
             DestroyMenu(hRightPopupMenu);
             DelTrayIcon(hwnd);
diff --git a/win32ss/user/ntuser/hotkey.c b/win32ss/user/ntuser/hotkey.c
index 02b504fe668..e9e11772a11 100644
--- a/win32ss/user/ntuser/hotkey.c
+++ b/win32ss/user/ntuser/hotkey.c
@@ -211,7 +211,9 @@ co_UserProcessHotKeys(WORD wVk, BOOL bIsDown)
         if (IsModifier)
         {
             /* Modifier key up -- modifier-only keys are triggered here */
-            pHotKey = IsHotKey(gfsModOnlyCandidate, 0);
+            pHotKey = IsHotKey(gfsModOnlyCandidate, wVk);
+            if (!pHotKey)
+                pHotKey = IsHotKey(gfsModOnlyCandidate, 0);
             gfsModOnlyCandidate = 0;
         }
         else

Reply via email to