From c1dfd580ab6900eb725502d2125ff42028dbcb1f Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Wed, 31 Jan 2024 20:32:21 +0900 Subject: [PATCH] [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 *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(); + 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; +}