[NTUSER][KBSWITCH] Realize Alt+Shift keyboard switch (retry) (#4721)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Sun, 25 Sep 2022 23:07:50 +0000 (08:07 +0900)
committerGitHub <noreply@github.com>
Sun, 25 Sep 2022 23:07:50 +0000 (08:07 +0900)
Alt+Shift is a useful key combination to switch the current keyboard layout. CORE-11737
- Add ID_NEXTLAYOUT command to kbswitch.
- Send command ID_NEXTLAYOUT to kbswitch on Alt+Shift key combination in WM_SYSKEYDOWN handling of IntDefWindowProc function.
- Make IntFindWindow a non-static function.

base/applications/kbswitch/kbswitch.c
base/applications/kbswitch/resource.h
win32ss/user/ntuser/defwnd.c
win32ss/user/ntuser/window.c
win32ss/user/ntuser/window.h

index d1b3932..187661e 100644 (file)
@@ -546,6 +546,12 @@ WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
                     break;
                 }
 
+                case ID_NEXTLAYOUT:
+                {
+                    ActivateLayout(hwnd, GetNextLayout());
+                    break;
+                }
+
                 default:
                 {
                     ActivateLayout(hwnd, LOWORD(wParam));
index b7410bd..ef71d84 100644 (file)
@@ -9,3 +9,4 @@
 /* Menu items */
 #define ID_EXIT        10001
 #define ID_PREFERENCES 10002
+#define ID_NEXTLAYOUT  10003
index 846a131..9d2021a 100644 (file)
@@ -945,6 +945,24 @@ IntDefWindowProc(
                    wParamTmp = UserGetKeyState(VK_SHIFT) & 0x8000 ? SC_PREVWINDOW : SC_NEXTWINDOW;
                    co_IntSendMessage( Active, WM_SYSCOMMAND, wParamTmp, wParam );
                 }
+                else if (wParam == VK_SHIFT) // Alt+Shift
+                {
+                    RTL_ATOM ClassAtom = 0;
+                    UNICODE_STRING ustrClass, ustrWindow;
+                    HWND hwndSwitch;
+
+                    RtlInitUnicodeString(&ustrClass, L"kbswitcher");
+                    RtlInitUnicodeString(&ustrWindow, L"");
+
+                    IntGetAtomFromStringOrAtom(&ustrClass, &ClassAtom);
+
+                    hwndSwitch = IntFindWindow(UserGetDesktopWindow(), NULL, ClassAtom, &ustrWindow);
+                    if (hwndSwitch)
+                    {
+#define ID_NEXTLAYOUT 10003
+                        UserPostMessage(hwndSwitch, WM_COMMAND, ID_NEXTLAYOUT, 0);
+                    }
+                }
             }
             else if( wParam == VK_F10 )
             {
index a2b9e24..c880ddc 100644 (file)
@@ -3040,7 +3040,7 @@ CLEANUP:
 }
 
 
-static HWND FASTCALL
+HWND FASTCALL
 IntFindWindow(PWND Parent,
               PWND ChildAfter,
               RTL_ATOM ClassAtom,
index b68c165..0efbd49 100644 (file)
@@ -98,6 +98,8 @@ extern PWINDOWLIST gpwlCache;
 
 PWINDOWLIST FASTCALL IntBuildHwndList(PWND pwnd, DWORD dwFlags, PTHREADINFO pti);
 VOID FASTCALL IntFreeHwndList(PWINDOWLIST pwlTarget);
+HWND FASTCALL IntFindWindow(PWND Parent, PWND ChildAfter, RTL_ATOM ClassAtom,
+                            PUNICODE_STRING WindowName);
 
 /* Undocumented dwFlags for IntBuildHwndList */
 #define IACE_LIST  0x0002