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

commit 152af475b19eafce551f625d1ca38c78285432f5
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Sat Feb 10 16:04:33 2024 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Sat Feb 10 16:04:33 2024 +0900

    [MSUTB][SDK] Implement SetRegisterLangBand (#6471)
    
    Supporting Language Bar...
    JIRA issue: CORE-19363
    - Add some helper functions.
    - Implement SetRegisterLangBand
      function.
---
 dll/win32/msutb/msutb.cpp           | 69 +++++++++++++++++++++++++++++++++++--
 sdk/include/reactos/cicero/cicutb.h |  2 ++
 2 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/dll/win32/msutb/msutb.cpp b/dll/win32/msutb/msutb.cpp
index bc9c2ff510d..be242369160 100644
--- a/dll/win32/msutb/msutb.cpp
+++ b/dll/win32/msutb/msutb.cpp
@@ -375,6 +375,7 @@ FindEAEnumFontProc(ENUMLOGFONT *pLF, NEWTEXTMETRIC *pTM, 
INT nFontType, LPARAM l
     return FALSE;
 }
 
+/// Are there East-Asian vertical fonts?
 BOOL CheckEAFonts(void)
 {
     BOOL bHasVertical = FALSE;
@@ -384,6 +385,55 @@ BOOL CheckEAFonts(void)
     return bHasVertical;
 }
 
+BOOL IsDeskBandFromReg()
+{
+    if (!(g_dwOSInfo & CIC_OSINFO_XPPLUS)) // Desk band is for XP+
+        return FALSE;
+
+    CicRegKey regKey;
+    if (regKey.Open(HKEY_CURRENT_USER, 
TEXT("SOFTWARE\\Microsoft\\CTF\\MSUTB\\")))
+    {
+        DWORD dwValue = 0;
+        regKey.QueryDword(TEXT("ShowDeskBand"), &dwValue);
+        return !!dwValue;
+    }
+
+    return FALSE;
+}
+
+void SetDeskBandToReg(BOOL bShow)
+{
+    CicRegKey regKey;
+    if (regKey.Open(HKEY_CURRENT_USER, 
TEXT("SOFTWARE\\Microsoft\\CTF\\MSUTB\\"), KEY_ALL_ACCESS))
+        regKey.SetDword(TEXT("ShowDeskBand"), bShow);
+}
+
+BOOL RegisterComCat(REFCLSID rclsid, REFCATID rcatid, BOOL bRegister)
+{
+    if (FAILED(::CoInitialize(NULL)))
+        return FALSE;
+
+    ICatRegister *pCat;
+    HRESULT hr = ::CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, 
CLSCTX_INPROC_SERVER,
+                                    IID_ICatRegister, (void**)&pCat);
+    if (SUCCEEDED(hr))
+    {
+        if (bRegister)
+            hr = pCat->RegisterClassImplCategories(rclsid, 1, 
const_cast<CATID*>(&rcatid));
+        else
+            hr = pCat->UnRegisterClassImplCategories(rclsid, 1, 
const_cast<CATID*>(&rcatid));
+
+        pCat->Release();
+    }
+
+    ::CoUninitialize();
+
+    //if (IsIE5())
+    //    ::RegDeleteKey(HKEY_CLASSES_ROOT, TEXT("Component 
Categories\\{00021492-0000-0000-C000-000000000046}\\Enum"));
+
+    return SUCCEEDED(hr);
+}
+
 BOOL InitFromReg(void)
 {
     DWORD dwValue;
@@ -4801,13 +4851,26 @@ GetPopupTipbar(HWND hWnd, BOOL fWinLogon)
 /***********************************************************************
  *              SetRegisterLangBand (MSUTB.@)
  *
- * @unimplemented
+ * @implemented
  */
 EXTERN_C HRESULT WINAPI
 SetRegisterLangBand(BOOL bRegister)
 {
-    FIXME("stub:(%d)\n", bRegister);
-    return E_NOTIMPL;
+    TRACE("(%d)\n", bRegister);
+
+    if (!(g_dwOSInfo & CIC_OSINFO_XPPLUS)) // Desk band is for XP+
+        return E_FAIL;
+
+    BOOL bDeskBand = IsDeskBandFromReg();
+    if (bDeskBand == bRegister)
+        return S_OK;
+
+    SetDeskBandToReg(bRegister);
+
+    if (!RegisterComCat(CLSID_MSUTBDeskBand, CATID_DeskBand, bRegister))
+        return TF_E_NOLOCK;
+
+    return S_OK;
 }
 
 /***********************************************************************
diff --git a/sdk/include/reactos/cicero/cicutb.h 
b/sdk/include/reactos/cicero/cicutb.h
index e1f517d1915..774be036cb4 100644
--- a/sdk/include/reactos/cicero/cicutb.h
+++ b/sdk/include/reactos/cicero/cicutb.h
@@ -15,6 +15,8 @@ DEFINE_GUID(GUID_TFCAT_TIP_KEYBOARD,           0x34745C63, 
0xB2F0, 0x4784, 0x8B,
 DEFINE_GUID(CLSID_SYSTEMLANGBARITEM,           0xBEBACC94, 0x5CD3, 0x4662, 
0xA1, 0xE0, 0xF3, 0x31, 0x99, 0x49, 0x36, 0x69);
 DEFINE_GUID(IID_ITfLangBarMgr_P,               0xD72C0FA9, 0xADD5, 0x4AF0, 
0x87, 0x06, 0x4F, 0xA9, 0xAE, 0x3E, 0x2E, 0xFF);
 DEFINE_GUID(IID_ITfLangBarEventSink_P,         0x7A460360, 0xDA21, 0x4B09, 
0xA8, 0xA0, 0x8A, 0x69, 0xE7, 0x28, 0xD8, 0x93);
+DEFINE_GUID(CLSID_MSUTBDeskBand,               0x540D8A8B, 0x1C3F, 0x4E32, 
0x81, 0x32, 0x53, 0x0F, 0x6A, 0x50, 0x20, 0x90);
+DEFINE_GUID(CATID_DeskBand,                    0x00021492, 0x0000, 0x0000, 
0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
 
 EXTERN_C LPVOID WINAPI GetLibTls(VOID);
 EXTERN_C BOOL WINAPI GetPopupTipbar(HWND hWnd, BOOL fWinLogon);

Reply via email to