https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c1dfd580ab6900eb72550…
commit c1dfd580ab6900eb725502d2125ff42028dbcb1f
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Wed Jan 31 20:32:21 2024 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Wed Jan 31 20:32:21 2024 +0900
[MSUTB][SDK] Add InitFromReg (#6425)
Supporting Language Bar...
JIRA issue: CORE-19363
- Add many global variables
to add UTB settings.
- Add IsSkipRedrawHKL, IsBiDiLocalizedSystem,
InitSkipRedrawHKLArray helper functions.
- Add InitFromReg helper function to
load the settings from registry.
- Add CicRegKey::EnumValue method.
---
dll/win32/msutb/msutb.cpp | 291 +++++++++++++++++++++++++++++++++---
sdk/include/reactos/cicero/cicreg.h | 13 ++
2 files changed, 287 insertions(+), 17 deletions(-)
diff --git a/dll/win32/msutb/msutb.cpp b/dll/win32/msutb/msutb.cpp
index 26816ecb962..1a8ee45cc03 100644
--- a/dll/win32/msutb/msutb.cpp
+++ b/dll/win32/msutb/msutb.cpp
@@ -16,7 +16,42 @@ DWORD g_dwOSInfo = 0;
CRITICAL_SECTION g_cs;
LONG g_DllRefCount = 0;
+BOOL g_bShowTipbar = TRUE;
+BOOL g_bShowDebugMenu = FALSE;
+BOOL g_bNewLook = TRUE;
+BOOL g_bIntelliSense = FALSE;
+BOOL g_bShowCloseMenu = FALSE;
+UINT g_uTimeOutNonIntentional = 60 * 1000;
+UINT g_uTimeOutIntentional = 10 * 60 * 1000;
+UINT g_uTimeOutMax = 60 * 60 * 1000;
+BOOL g_bShowMinimizedBalloon = TRUE;
+POINT g_ptTipbar = { -1, -1 };
+BOOL g_bExcludeCaptionButtons = TRUE;
+BOOL g_bShowShadow = FALSE;
+BOOL g_fTaskbarTheme = TRUE;
+BOOL g_fVertical = FALSE;
+UINT g_uTimerElapseSTUBSTART = 100;
+UINT g_uTimerElapseSTUBEND = 2 * 1000;
+UINT g_uTimerElapseBACKTOALPHA = 3 * 1000;
+UINT g_uTimerElapseONTHREADITEMCHANGE = 200;
+UINT g_uTimerElapseSETWINDOWPOS = 100;
+UINT g_uTimerElapseONUPDATECALLED = 50;
+UINT g_uTimerElapseSYSCOLORCHANGED = 20;
+UINT g_uTimerElapseDISPLAYCHANGE = 20;
+UINT g_uTimerElapseUPDATEUI = 70;
+UINT g_uTimerElapseSHOWWINDOW = 50;
+UINT g_uTimerElapseMOVETOTRAY = 50;
+UINT g_uTimerElapseTRAYWNDONDELAYMSG = 50;
UINT g_uTimerElapseDOACCDEFAULTACTION = 200;
+UINT g_uTimerElapseENSUREFOCUS = 50;
+BOOL g_bShowDeskBand = FALSE;
+UINT g_uTimerElapseSHOWDESKBAND = 3 * 1000;
+BOOL g_fPolicyDisableCloseButton = FALSE;
+BOOL g_fPolicyEnableLanguagebarInFullscreen = FALSE;
+DWORD g_dwWndStyle = 0;
+DWORD g_dwMenuStyle = 0;
+DWORD g_dwChildWndStyle = 0;
+BOOL g_fRTL = FALSE;
#define TIMER_ID_DOACCDEFAULTACTION 11
@@ -45,6 +80,76 @@ class CButtonIconItem;
CTipbarWnd *g_pTipbarWnd = NULL;
+CicArray<HKL> *g_prghklSkipRedrawing = NULL;
+
+BOOL IsSkipRedrawHKL(HKL hSkipKL)
+{
+ if (LOWORD(hSkipKL) == MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT))
+ return FALSE; // Japanese HKL will be skipped
+ if (!g_prghklSkipRedrawing)
+ return FALSE;
+
+ for (size_t iItem = 0; iItem < g_prghklSkipRedrawing->size(); ++iItem)
+ {
+ if ((*g_prghklSkipRedrawing)[iItem] == hSkipKL)
+ return TRUE; // To be skipped
+ }
+
+ return FALSE; // To be not skipped
+}
+
+BOOL IsBiDiLocalizedSystem(void)
+{
+ LOCALESIGNATURE Sig;
+ LANGID LangID = ::GetUserDefaultUILanguage();
+ if (!LangID)
+ return FALSE;
+
+ INT size = sizeof(Sig) / sizeof(WCHAR);
+ if (!::GetLocaleInfoW(LangID, LOCALE_FONTSIGNATURE, (LPWSTR)&Sig, size))
+ return FALSE;
+ return (Sig.lsUsb[3] & 0x8000000) != 0;
+}
+
+void InitSkipRedrawHKLArray(void)
+{
+ g_prghklSkipRedrawing = new(cicNoThrow) CicArray<HKL>();
+ if (!g_prghklSkipRedrawing)
+ return;
+
+ g_prghklSkipRedrawing->Add((HKL)UlongToHandle(0xE0010411)); // Japanese IME will
be skipped
+
+ CicRegKey regKey;
+ LSTATUS error = regKey.Open(HKEY_LOCAL_MACHINE,
+
TEXT("SOFTWARE\\Microsoft\\CTF\\MSUTB\\SkipRedrawHKL"));
+ if (error != ERROR_SUCCESS)
+ return;
+
+ TCHAR szValueName[256];
+ for (DWORD dwIndex = 0; ; ++dwIndex)
+ {
+ error = regKey.EnumValue(dwIndex, szValueName, _countof(szValueName));
+ if (error != ERROR_SUCCESS)
+ break;
+
+ if (szValueName[0] == TEXT('0') &&
+ (szValueName[1] == TEXT('x') || szValueName[1] ==
TEXT('X')))
+ {
+ HKL hKL = (HKL)UlongToHandle(_tcstoul(szValueName, NULL, 16));
+ g_prghklSkipRedrawing->Add(hKL); // This hKL will be skipped
+ }
+ }
+}
+
+void UninitSkipRedrawHKLArray(void)
+{
+ if (g_prghklSkipRedrawing)
+ {
+ delete g_prghklSkipRedrawing;
+ g_prghklSkipRedrawing = NULL;
+ }
+}
+
HRESULT GetGlobalCompartment(REFGUID rguid, ITfCompartment **ppComp)
{
ITfCompartmentMgr *pCompMgr = NULL;
@@ -123,6 +228,166 @@ void DoCloseLangbar(void)
::RegDeleteValue(regKey, TEXT("ctfmon.exe"));
}
+BOOL InitFromReg(void)
+{
+ DWORD dwValue;
+ LSTATUS error;
+
+ CicRegKey regKey1;
+ error = regKey1.Open(HKEY_CURRENT_USER,
TEXT("SOFTWARE\\Microsoft\\CTF\\"));
+ if (error == ERROR_SUCCESS)
+ {
+ error = regKey1.QueryDword(TEXT("ShowTipbar"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_bShowTipbar = !!dwValue;
+ }
+
+ CicRegKey regKey2;
+ error = regKey2.Open(HKEY_CURRENT_USER,
TEXT("SOFTWARE\\Microsoft\\CTF\\MSUTB\\"));
+ if (error == ERROR_SUCCESS)
+ {
+ error = regKey2.QueryDword(TEXT("ShowDebugMenu"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_bShowDebugMenu = !!dwValue;
+ error = regKey2.QueryDword(TEXT("NewLook"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_bNewLook = !!dwValue;
+ error = regKey2.QueryDword(TEXT("IntelliSense"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_bIntelliSense = !!dwValue;
+ error = regKey2.QueryDword(TEXT("ShowCloseMenu"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_bShowCloseMenu = !!dwValue;
+ error = regKey2.QueryDword(TEXT("TimeOutNonIntentional"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimeOutNonIntentional = 1000 * dwValue;
+ error = regKey2.QueryDword(TEXT("TimeOutIntentional"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ {
+ g_uTimeOutIntentional = 1000 * dwValue;
+ g_uTimeOutMax = 6000 * dwValue;
+ }
+ error = regKey2.QueryDword(TEXT("ShowMinimizedBalloon"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_bShowMinimizedBalloon = !!dwValue;
+ error = regKey2.QueryDword(TEXT("Left"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_ptTipbar.x = dwValue;
+ error = regKey2.QueryDword(TEXT("Top"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_ptTipbar.y = dwValue;
+ error = regKey2.QueryDword(TEXT("ExcludeCaptionButtons"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_bExcludeCaptionButtons = !!dwValue;
+ error = regKey2.QueryDword(TEXT("ShowShadow"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_bShowShadow = !!dwValue;
+ error = regKey2.QueryDword(TEXT("TaskbarTheme"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_fTaskbarTheme = !!dwValue;
+ error = regKey2.QueryDword(TEXT("Vertical"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_fVertical = !!dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseSTUBSTART"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseSTUBSTART = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseSTUBEND"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseSTUBEND = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseBACKTOALPHA"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseBACKTOALPHA = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseONTHREADITEMCHANGE"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseONTHREADITEMCHANGE = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseSETWINDOWPOS"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseSETWINDOWPOS = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseONUPDATECALLED"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseONUPDATECALLED = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseSYSCOLORCHANGED"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseSYSCOLORCHANGED = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseDISPLAYCHANGE"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseDISPLAYCHANGE = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseUPDATEUI"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseUPDATEUI = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseSHOWWINDOW"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseSHOWWINDOW = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseMOVETOTRAY"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseMOVETOTRAY = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseTRAYWNDONDELAYMSG"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseTRAYWNDONDELAYMSG = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseDOACCDEFAULTACTION"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseDOACCDEFAULTACTION = dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseENSUREFOCUS"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseENSUREFOCUS = dwValue;
+ error = regKey2.QueryDword(TEXT("ShowDeskBand"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_bShowDeskBand = !!dwValue;
+ error = regKey2.QueryDword(TEXT("TimerElapseSHOWWDESKBAND"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_uTimerElapseSHOWDESKBAND = dwValue;
+ }
+
+ CicRegKey regKey3;
+ error = regKey3.Open(HKEY_CURRENT_USER,
TEXT("SOFTWARE\\Policies\\Microsoft\\MSCTF"));
+ if (error == ERROR_SUCCESS)
+ {
+ error = regKey3.QueryDword(TEXT("DisableCloseButton"), &dwValue);
+ if (error == ERROR_SUCCESS)
+ g_fPolicyDisableCloseButton = !!dwValue;
+ }
+
+ CicRegKey regKey4;
+ error = regKey4.Open(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Policies\\Microsoft\\MSCTF"));
+ if (error == ERROR_SUCCESS)
+ {
+ error = regKey4.QueryDword(TEXT("EnableLanguagebarInFullscreen"),
&dwValue);
+ if (error == ERROR_SUCCESS)
+ g_fPolicyEnableLanguagebarInFullscreen = !!dwValue;
+ }
+
+ InitSkipRedrawHKLArray();
+
+ if (g_bNewLook)
+ {
+ g_dwWndStyle = UIF_WINDOW_ENABLETHEMED | UIF_WINDOW_WORKAREA | UIF_WINDOW_TOOLTIP
|
+ UIF_WINDOW_TOOLWINDOW | UIF_WINDOW_TOPMOST;
+ if (g_bShowShadow)
+ g_dwWndStyle |= UIF_WINDOW_SHADOW;
+ g_dwMenuStyle = 0x10000000 | UIF_WINDOW_MONITOR | UIF_WINDOW_SHADOW |
+ UIF_WINDOW_TOOLWINDOW | UIF_WINDOW_TOPMOST;
+ }
+ else
+ {
+ g_dwWndStyle = UIF_WINDOW_WORKAREA | UIF_WINDOW_TOOLTIP | UIF_WINDOW_DLGFRAME |
+ UIF_WINDOW_TOPMOST;
+ g_dwMenuStyle = UIF_WINDOW_MONITOR | UIF_WINDOW_DLGFRAME | UIF_WINDOW_TOPMOST;
+ }
+
+ g_dwChildWndStyle =
+ UIF_WINDOW_ENABLETHEMED | UIF_WINDOW_NOMOUSEMSG | UIF_WINDOW_TOOLTIP |
UIF_WINDOW_CHILD;
+
+ if (IsBiDiLocalizedSystem())
+ {
+ g_dwWndStyle |= UIF_WINDOW_LAYOUTRTL;
+ g_dwChildWndStyle |= UIF_WINDOW_LAYOUTRTL;
+ g_dwMenuStyle |= UIF_WINDOW_LAYOUTRTL;
+ g_fRTL = TRUE;
+ }
+
+ return TRUE;
+}
+
/***********************************************************************/
class CUTBLangBarDlg
@@ -487,7 +752,10 @@ public:
CTrayIconWnd();
~CTrayIconWnd();
- BOOL RegisterClass();
+ static BOOL RegisterClass();
+ static CTrayIconWnd *GetThis(HWND hWnd);
+ static void SetThis(HWND hWnd, LPCREATESTRUCT pCS);
+
HWND CreateWnd();
void DestroyWnd();
@@ -502,9 +770,6 @@ public:
HWND GetNotifyWnd();
BOOL OnIconMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
- static CTrayIconWnd *GetThis(HWND hWnd);
- static void SetThis(HWND hWnd, LPCREATESTRUCT pCS);
-
void CallOnDelayMsg();
};
@@ -2188,9 +2453,7 @@ STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
return gModule.DllGetClassObject(rclsid, riid, ppv);
}
-/**
- * @implemented
- */
+/// @implemented
HRESULT APIENTRY
MsUtbCoCreateInstance(
REFCLSID rclsid,
@@ -2206,9 +2469,7 @@ MsUtbCoCreateInstance(
return cicRealCoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, ppv);
}
-/**
- * @unimplemented
- */
+/// @implemented
BOOL ProcessAttach(HINSTANCE hinstDLL)
{
::InitializeCriticalSectionAndSpinCount(&g_cs, 0);
@@ -2220,7 +2481,7 @@ BOOL ProcessAttach(HINSTANCE hinstDLL)
TFInitLib(MsUtbCoCreateInstance);
cicInitUIFLib();
- //CTrayIconWnd::RegisterClassW(); //FIXME
+ CTrayIconWnd::RegisterClass();
g_wmTaskbarCreated = RegisterWindowMessageW(L"TaskbarCreated");
@@ -2230,9 +2491,7 @@ BOOL ProcessAttach(HINSTANCE hinstDLL)
return TRUE;
}
-/**
- * @implemented
- */
+/// @implemented
VOID ProcessDetach(HINSTANCE hinstDLL)
{
cicDoneUIFLib();
@@ -2241,9 +2500,7 @@ VOID ProcessDetach(HINSTANCE hinstDLL)
gModule.Term();
}
-/**
- * @implemented
- */
+/// @implemented
EXTERN_C BOOL WINAPI
DllMain(
_In_ HINSTANCE hinstDLL,
diff --git a/sdk/include/reactos/cicero/cicreg.h b/sdk/include/reactos/cicero/cicreg.h
index ec3718da046..b5a99658a15 100644
--- a/sdk/include/reactos/cicero/cicreg.h
+++ b/sdk/include/reactos/cicero/cicreg.h
@@ -65,6 +65,8 @@ public:
}
LSTATUS RecurseDeleteKey(LPCTSTR lpSubKey);
+
+ LSTATUS EnumValue(DWORD dwIndex, LPTSTR lpValueName, DWORD cchValueName);
};
/******************************************************************************/
@@ -162,3 +164,14 @@ CicRegKey::RecurseDeleteKey(LPCTSTR lpSubKey)
return DeleteSubKey(lpSubKey);
}
+
+inline LSTATUS
+CicRegKey::EnumValue(DWORD dwIndex, LPTSTR lpValueName, DWORD cchValueName)
+{
+ DWORD dwSaveLen = cchValueName;
+ LSTATUS error = ::RegEnumValue(m_hKey, dwIndex, lpValueName, &cchValueName,
+ NULL, NULL, NULL, NULL);
+ if (dwSaveLen)
+ lpValueName[error == ERROR_SUCCESS ? dwSaveLen - 1 : 0] = 0;
+ return error;
+}