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

commit e8b830d6bfdf2786df197a803b7c6babc8a2430b
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Fri Aug 26 06:33:39 2022 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Fri Aug 26 06:33:39 2022 +0900

    [KBSWITCH] Fix GetNextLayout for three or more languages (#4629)
    
    Typing Alt+Shift should work cyclically.
    CORE-11737
---
 base/applications/kbswitch/kbswitch.c | 62 ++++++++++++++++++++++++++---------
 1 file changed, 46 insertions(+), 16 deletions(-)

diff --git a/base/applications/kbswitch/kbswitch.c 
b/base/applications/kbswitch/kbswitch.c
index c931aee98f5..aac2c895d9a 100644
--- a/base/applications/kbswitch/kbswitch.c
+++ b/base/applications/kbswitch/kbswitch.c
@@ -296,7 +296,8 @@ ActivateLayout(HWND hwnd, ULONG uLayoutNum)
     TCHAR szLayoutNum[CCH_ULONG_DEC + 1], szLCID[CCH_LAYOUT_ID + 1], 
szLangName[MAX_PATH];
     LANGID LangID;
 
-    if (uLayoutNum == (ULONG)-1 || uLayoutNum > 0xFF) /* Invalid */
+    /* The layout number starts from one. Zero is invalid */
+    if (uLayoutNum == 0 || uLayoutNum > 0xFF) /* Invalid */
         return;
 
     _ultot(uLayoutNum, szLayoutNum, 10);
@@ -349,6 +350,40 @@ BuildLeftPopupMenu(VOID)
     return hMenu;
 }
 
+static ULONG
+GetMaxLayoutNum(VOID)
+{
+    HKEY hKey;
+    ULONG dwIndex, dwSize, uLayoutNum, uMaxLayoutNum = 0;
+    TCHAR szLayoutNum[CCH_ULONG_DEC + 1], szLayoutID[CCH_LAYOUT_ID + 1];
+
+    /* Get the maximum layout number in the Preload key */
+    if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Preload"), 0,
+                     KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
+    {
+        for (dwIndex = 0; ; dwIndex++)
+        {
+            dwSize = sizeof(szLayoutNum);
+            if (RegEnumValue(hKey, dwIndex, szLayoutNum, &dwSize, NULL, NULL,
+                             NULL, NULL) != ERROR_SUCCESS)
+            {
+                break;
+            }
+
+            if (GetLayoutID(szLayoutNum, szLayoutID, ARRAYSIZE(szLayoutID)))
+            {
+                uLayoutNum = _ttoi(szLayoutNum);
+                if (uMaxLayoutNum < uLayoutNum)
+                    uMaxLayoutNum = uLayoutNum;
+            }
+        }
+
+        RegCloseKey(hKey);
+    }
+
+    return uMaxLayoutNum;
+}
+
 BOOL
 SetHooks(VOID)
 {
@@ -380,26 +415,21 @@ ULONG
 GetNextLayout(VOID)
 {
     TCHAR szLayoutNum[3 + 1], szLayoutID[CCH_LAYOUT_ID + 1];
-    ULONG Ret = ulCurrentLayoutNum;
+    ULONG uLayoutNum, uMaxNum = GetMaxLayoutNum();
 
-    _ultot(ulCurrentLayoutNum, szLayoutNum, 10);
-    if (!GetLayoutID(szLayoutNum, szLayoutID, ARRAYSIZE(szLayoutID)))
+    for (uLayoutNum = ulCurrentLayoutNum + 1; ; ++uLayoutNum)
     {
-        return -1;
-    }
-
-    _ultot(Ret + 1, szLayoutNum, 10);
+        if (uLayoutNum > uMaxNum)
+            uLayoutNum = 1;
+        if (uLayoutNum == ulCurrentLayoutNum)
+            break;
 
-    if (GetLayoutID(szLayoutNum, szLayoutID, ARRAYSIZE(szLayoutID)))
-    {
-        return (Ret + 1);
+        _ultot(uLayoutNum, szLayoutNum, 10);
+        if (GetLayoutID(szLayoutNum, szLayoutID, ARRAYSIZE(szLayoutID)))
+            return uLayoutNum;
     }
 
-    _ultot(Ret - 1, szLayoutNum, 10);
-    if (GetLayoutID(szLayoutNum, szLayoutID, ARRAYSIZE(szLayoutID)))
-        return (Ret - 1);
-
-    return -1;
+    return ulCurrentLayoutNum;
 }
 
 LRESULT

Reply via email to