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

commit ec0695c26ba520b0fbfb2e3f0791d3c20376c21b
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Wed Dec 27 11:43:01 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Wed Dec 27 11:43:01 2023 +0900

    [MSCTF][SDK] Implement InitLangChangeHotKey (#6234)
    
    Supporting TIPs and Language Bar...
    JIRA issue: CORE-19361
    - Implement InitLangChangeHotKey function.
    - Add some global variables about hot-keys.
    - Fix CicRegKey in <cicero/cicreg.h>.
---
 dll/win32/msctf/utils.cpp           | 131 +++++++++++++++++++++++++++++++++++-
 sdk/include/reactos/cicero/cicreg.h |   4 +-
 2 files changed, 130 insertions(+), 5 deletions(-)

diff --git a/dll/win32/msctf/utils.cpp b/dll/win32/msctf/utils.cpp
index 4066714f89e..dfad480ea0b 100644
--- a/dll/win32/msctf/utils.cpp
+++ b/dll/win32/msctf/utils.cpp
@@ -78,6 +78,14 @@ CicMutex g_mutexTMD;
 // File mapping
 CicFileMappingStatic g_SharedMemory;
 
+// Hot-Keys
+UINT g_uLangHotKeyModifiers = 0;
+UINT g_uLangHotKeyVKey = 0;
+UINT g_uLangHotKeyVKey2 = 0;
+UINT g_uKeyTipHotKeyModifiers = 0;
+UINT g_uKeyTipHotKeyVKey = 0;
+UINT g_uKeyTipHotKeyVKey2 = 0;
+
 /**
  * @implemented
  */
@@ -346,11 +354,126 @@ TF_IsCtfmonRunning(VOID)
 }
 
 /**
- * @unimplemented
+ * @implemented
  */
-VOID InitLangChangeHotKey(VOID)
+BOOL InitLangChangeHotKey(VOID)
 {
-    //FIXME
+    CicRegKey regKey;
+    TCHAR szLanguage[2], szLayout[2];
+    LSTATUS error;
+
+    szLanguage[0] = szLayout[0] = TEXT('3');
+    szLanguage[1] = szLayout[1] = TEXT('\0');
+
+    error = regKey.Open(HKEY_CURRENT_USER, "Keyboard Layout\\Toggle");
+    if (error == ERROR_SUCCESS)
+    {
+        error = regKey.QuerySz(TEXT("Language Hotkey"), szLanguage, 
_countof(szLanguage));
+        if (error != ERROR_SUCCESS)
+        {
+            if (g_dwOSInfo & CIC_OSINFO_NT)
+            {
+                error = regKey.QuerySz(TEXT("Hotkey"), szLanguage, 
_countof(szLanguage));
+                if (error != ERROR_SUCCESS)
+                    szLanguage[0] = TEXT('1');
+            }
+            else
+            {
+                error = regKey.QuerySz(NULL, szLanguage, _countof(szLanguage));
+                if (error != ERROR_SUCCESS)
+                    szLanguage[0] = TEXT('1');
+            }
+
+            if (PRIMARYLANGID(GetSystemDefaultLCID()) == LANG_CHINESE)
+                szLanguage[0] = TEXT('1');
+        }
+
+        error = regKey.QuerySz(TEXT("Layout Hotkey"), szLayout, 
_countof(szLayout));
+        if (error != ERROR_SUCCESS)
+        {
+            szLayout[0] = TEXT('1');
+            if (szLanguage[0] != TEXT('2'))
+                szLayout[0] = TEXT('2');
+            if (GetSystemMetrics(SM_MIDEASTENABLED))
+                szLayout[0] = TEXT('3');
+        }
+
+        szLanguage[1] = TEXT('\0');
+        szLayout[1] = TEXT('\0');
+    }
+
+    if (szLanguage[0] == szLayout[0])
+    {
+        if (szLanguage[0] == TEXT('1'))
+            szLayout[0] = TEXT('2');
+        else if (szLanguage[0] == TEXT('2'))
+            szLayout[0] = TEXT('1');
+        else
+            szLayout[0] = TEXT('3');
+    }
+
+    ::EnterCriticalSection(&g_csInDllMain);
+
+    switch (szLanguage[0])
+    {
+        case TEXT('2'):
+            g_uLangHotKeyModifiers = MOD_SHIFT | MOD_CONTROL;
+            g_uLangHotKeyVKey2 = VK_CONTROL;
+            g_uLangHotKeyVKey = VK_SHIFT;
+            break;
+
+        case TEXT('3'):
+            g_uLangHotKeyVKey = 0;
+            g_uLangHotKeyModifiers = 0;
+            g_uLangHotKeyVKey2 = 0;
+            break;
+
+        case TEXT('4'):
+            g_uLangHotKeyVKey = VK_NUMPAD0;
+            g_uLangHotKeyModifiers = 0;
+            g_uLangHotKeyVKey2 = 0;
+            break;
+
+        case TEXT('1'):
+        default:
+            g_uLangHotKeyModifiers = MOD_SHIFT | MOD_ALT;
+            g_uLangHotKeyVKey2 = VK_MENU;
+            g_uLangHotKeyVKey = VK_SHIFT;
+            break;
+    }
+
+    switch (szLayout[0])
+    {
+        case TEXT('2'):
+            g_uKeyTipHotKeyModifiers = MOD_SHIFT | MOD_CONTROL;
+            g_uKeyTipHotKeyVKey = VK_SHIFT;
+            g_uKeyTipHotKeyVKey2 = VK_CONTROL;
+            break;
+
+        case TEXT('3'):
+            g_uKeyTipHotKeyModifiers = 0;
+            g_uKeyTipHotKeyVKey = 0;
+            g_uKeyTipHotKeyVKey2 = 0;
+            break;
+
+        case TEXT('4'):
+            g_uKeyTipHotKeyModifiers = 0;
+            g_uKeyTipHotKeyVKey = VK_OEM_3;
+            g_uKeyTipHotKeyVKey2 = 0;
+            break;
+
+        case TEXT('1'):
+        default:
+            g_uKeyTipHotKeyModifiers = 0x40 | MOD_SHIFT;
+            g_uKeyTipHotKeyVKey = VK_SHIFT;
+            g_uKeyTipHotKeyVKey2 = VK_MENU;
+            break;
+    }
+
+    ::LeaveCriticalSection(&g_csInDllMain);
+
+    TRACE("HotKey: %c, %c\n", szLanguage[0], szLayout[0]);
+    return TRUE;
 }
 
 /**
@@ -408,6 +531,8 @@ BOOL ProcessAttach(HINSTANCE hinstDLL) // FIXME: Call me 
from DllMain
     }
 
     cicGetOSInfo(&g_uACP, &g_dwOSInfo);
+    TRACE("cicGetOSInfo: %u, 0x%lX\n", g_uACP, g_dwOSInfo);
+
     InitUniqueString();
 
     //FIXME
diff --git a/sdk/include/reactos/cicero/cicreg.h 
b/sdk/include/reactos/cicero/cicreg.h
index f6c090bef4e..ec3718da046 100644
--- a/sdk/include/reactos/cicero/cicreg.h
+++ b/sdk/include/reactos/cicero/cicreg.h
@@ -46,7 +46,7 @@ public:
         return ::RegSetValueEx(m_hKey, pszValueName, 0, REG_DWORD, 
(LPBYTE)&dwValue, sizeof(dwValue));
     }
 
-    LSTATUS QuerySz(LPCTSTR pszValueName, LPWSTR pszValue, DWORD cchValueMax);
+    LSTATUS QuerySz(LPCTSTR pszValueName, LPTSTR pszValue, DWORD cchValueMax);
 
     LSTATUS SetSz(LPCTSTR pszValueName, LPCTSTR pszValue)
     {
@@ -124,7 +124,7 @@ CicRegKey::Create(
 }
 
 inline LSTATUS
-CicRegKey::QuerySz(LPCTSTR pszValueName, LPWSTR pszValue, DWORD cchValueMax)
+CicRegKey::QuerySz(LPCTSTR pszValueName, LPTSTR pszValue, DWORD cchValueMax)
 {
     DWORD cchSaveMax = cchValueMax;
 

Reply via email to