From a153f6d9f869665e356a2959840034240a01c85d Mon Sep 17 00:00:00 2001 From: fxliang Date: Thu, 11 Apr 2024 16:53:28 +0800 Subject: [PATCH] refactor: drop HANT configuration for WeaselTSF, register both SUBLANG_CHINESE_TRADITIONAL and SUBLANG_CHINESE_SIMPLIFIED in the same DLL. --- WeaselSetup/imesetup.cpp | 15 +++++++++- WeaselTSF/Globals.h | 6 ++-- WeaselTSF/LanguageBar.cpp | 34 +++++++++++++++++++---- WeaselTSF/Register.cpp | 56 +++++++++++++++----------------------- WeaselTSF/WeaselTSF.rc | Bin 15442 -> 12084 bytes include/resource.h | Bin 2708 -> 2850 bytes output/install.nsi | 8 ------ weasel.sln | 4 --- 8 files changed, 66 insertions(+), 57 deletions(-) diff --git a/WeaselSetup/imesetup.cpp b/WeaselSetup/imesetup.cpp index bb312a7a3..34f9ec073 100644 --- a/WeaselSetup/imesetup.cpp +++ b/WeaselSetup/imesetup.cpp @@ -121,7 +121,10 @@ int install_ime_file(std::wstring& srcPath, WCHAR path[MAX_PATH]; GetModuleFileNameW(GetModuleHandle(NULL), path, _countof(path)); - std::wstring srcFileName = (hant ? L"weaselt" : L"weasel"); + std::wstring srcFileName = L"weasel"; + if (ext == L"ime") + srcFileName = (hant ? L"weaselt" : L"weasel"); + srcFileName += ext; WCHAR drive[_MAX_DRIVE]; WCHAR dir[_MAX_DIR]; @@ -492,6 +495,16 @@ int register_text_service(const std::wstring& tsf_path, // if (silent) // always silent { params = L" /s " + params; } + if (hant) { + if (!SetEnvironmentVariable(L"TEXTSERVICE_PROFILE", L"hant")) { + // bad luck + } + } else { + if (!SetEnvironmentVariable(L"TEXTSERVICE_PROFILE", L"hans")) { + // bad luck + } + } + std::wstring app = L"regsvr32.exe"; if (is_wowarm32) { WCHAR sysarm32[MAX_PATH]; diff --git a/WeaselTSF/Globals.h b/WeaselTSF/Globals.h index 6fc94a476..5175e2a97 100644 --- a/WeaselTSF/Globals.h +++ b/WeaselTSF/Globals.h @@ -4,11 +4,9 @@ #include "stdafx.h" #include -#ifdef WEASEL_HANT -#define TEXTSERVICE_LANGID MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL) -#else +#define TEXTSERVICE_LANGID_HANT \ + MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL) #define TEXTSERVICE_LANGID MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED) -#endif #define TEXTSERVICE_DESC WEASEL_IME_NAME #define TEXTSERVICE_DESC_A "Weasel" diff --git a/WeaselTSF/LanguageBar.cpp b/WeaselTSF/LanguageBar.cpp index 49c357698..429036fe5 100644 --- a/WeaselTSF/LanguageBar.cpp +++ b/WeaselTSF/LanguageBar.cpp @@ -103,12 +103,29 @@ STDAPI CLangBarItemButton::Show(BOOL fShow) { return S_OK; } +static LANGID GetActiveProfileLangId() { + CComPtr pInputProcessorProfileMgr; + HRESULT hr = pInputProcessorProfileMgr.CoCreateInstance( + CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_ALL); + if (FAILED(hr)) + return MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED); + + TF_INPUTPROCESSORPROFILE profile; + hr = pInputProcessorProfileMgr->GetActiveProfile(GUID_TFCAT_TIP_KEYBOARD, + &profile); + if (FAILED(hr)) + return MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED); + return profile.langid; +} + STDAPI CLangBarItemButton::GetTooltipString(BSTR* pbstrToolTip) { -#ifdef WEASEL_HANT - *pbstrToolTip = SysAllocString(L"左鍵切換模式,右鍵打開菜單"); -#else - *pbstrToolTip = SysAllocString(L"左键切换模式,右键打开菜单"); -#endif + LANGID langid = GetActiveProfileLangId(); + if (langid == TEXTSERVICE_LANGID) { + *pbstrToolTip = SysAllocString(L"左键切换模式,右键打开菜单"); + } else { + *pbstrToolTip = SysAllocString(L"左鍵切換模式,右鍵打開菜單"); + } + return (*pbstrToolTip == NULL) ? E_OUTOFMEMORY : S_OK; } @@ -126,7 +143,12 @@ STDAPI CLangBarItemButton::OnClick(TfLBIClick click, /* Open menu */ HWND hwnd = _pTextService->_GetFocusedContextWindow(); if (hwnd != NULL) { - HMENU menu = LoadMenuW(g_hInst, MAKEINTRESOURCE(IDR_MENU_POPUP)); + LANGID langid = GetActiveProfileLangId(); + + HMENU menu = + ((langid == TEXTSERVICE_LANGID) + ? LoadMenuW(g_hInst, MAKEINTRESOURCE(IDR_MENU_POPUP)) + : LoadMenuW(g_hInst, MAKEINTRESOURCE(IDR_MENU_POPUP_HANT))); HMENU popupMenu = GetSubMenu(menu, 0); UINT wID = TrackPopupMenuEx( popupMenu, TPM_NONOTIFY | TPM_RETURNCMD | TPM_HORPOSANIMATION, pt.x, diff --git a/WeaselTSF/Register.cpp b/WeaselTSF/Register.cpp index 4ad961d8f..2c0bd834a 100644 --- a/WeaselTSF/Register.cpp +++ b/WeaselTSF/Register.cpp @@ -9,38 +9,6 @@ static const char c_szTipKeyPrefix[] = "Software\\Microsft\\CTF\\TIP\\"; static const char c_szInProcSvr32[] = "InprocServer32"; static const char c_szModelName[] = "ThreadingModel"; -HKL FindIME() { - HKL hKL = NULL; - WCHAR key[9]; - HKEY hKey; - LSTATUS ret = - RegOpenKeyExW(HKEY_LOCAL_MACHINE, - L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts", 0, - KEY_READ, &hKey); - if (ret == ERROR_SUCCESS) { - for (DWORD id = (0xE0200000 | TEXTSERVICE_LANGID); - hKL == NULL && id <= (0xE0FF0000 | TEXTSERVICE_LANGID); - id += 0x10000) { - StringCchPrintfW(key, _countof(key), L"%08X", id); - HKEY hSubKey; - ret = RegOpenKeyExW(hKey, key, 0, KEY_READ, &hSubKey); - if (ret == ERROR_SUCCESS) { - WCHAR data[32]; - DWORD type; - DWORD size = sizeof data; - ret = RegQueryValueExW(hSubKey, L"Ime File", NULL, &type, (LPBYTE)data, - &size); - if (ret == ERROR_SUCCESS && type == REG_SZ && - _wcsicmp(data, L"weasel.ime") == 0) - hKL = (HKL)id; - } - RegCloseKey(hSubKey); - } - } - RegCloseKey(hKey); - return hKL; -} - BOOL RegisterProfiles() { WCHAR achIconFile[MAX_PATH]; ULONG cchIconFile = @@ -53,11 +21,29 @@ BOOL RegisterProfiles() { CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_ALL); if (FAILED(hr)) return FALSE; - + WCHAR szProfile[100]; + DWORD dwSize = GetEnvironmentVariable(L"TEXTSERVICE_PROFILE", szProfile, + ARRAYSIZE(szProfile)); + BOOL hansEnable = FALSE; + BOOL hantEnable = FALSE; + + if (dwSize > 0 && wcscmp(szProfile, L"hans") == 0) + hansEnable = TRUE; hr = pInputProcessorProfileMgr->RegisterProfile( c_clsidTextService, TEXTSERVICE_LANGID, c_guidProfile, TEXTSERVICE_DESC, (ULONG)wcslen(TEXTSERVICE_DESC), achIconFile, cchIconFile, - TEXTSERVICE_ICON_INDEX, FindIME(), 0, TRUE, 0); + TEXTSERVICE_ICON_INDEX, LoadKeyboardLayout(L"00000804", 0), 0, + hansEnable, 0); + if (FAILED(hr)) + return FALSE; + + if (dwSize > 0 && wcscmp(szProfile, L"hant") == 0) + hantEnable = TRUE; + hr = pInputProcessorProfileMgr->RegisterProfile( + c_clsidTextService, TEXTSERVICE_LANGID_HANT, c_guidProfile, + TEXTSERVICE_DESC, (ULONG)wcslen(TEXTSERVICE_DESC), achIconFile, + cchIconFile, TEXTSERVICE_ICON_INDEX, LoadKeyboardLayout(L"00000404", 0), + 0, hantEnable, 0); if (FAILED(hr)) return FALSE; } @@ -77,6 +63,8 @@ void UnregisterProfiles() { hr = pInputProcessorProfileMgr->UnregisterProfile( c_clsidTextService, TEXTSERVICE_LANGID, c_guidProfile, 0); + hr = pInputProcessorProfileMgr->UnregisterProfile( + c_clsidTextService, TEXTSERVICE_LANGID_HANT, c_guidProfile, 0); } } diff --git a/WeaselTSF/WeaselTSF.rc b/WeaselTSF/WeaselTSF.rc index bdc7a3f7ef3f5dd0056f8614b2c754f09e10f652..25c346a86972e24291165721fe3f7ee60256a726 100644 GIT binary patch delta 148 zcmcaqu_bOp9P?xoHoM7MEFzNwSPXz{m&swQLO{0K z9-<9wljS71Cf||f*<7a@!7@2QMs9MR0LSDDl6;dbWE3V}(=3>LLgvxtImX*K06fqy AH~;_u delta 817 zcma))-z!657{|Y}*V%U1VvRMC!+xACLu$zt8-|r%+3~x!8xtkD*o7-;7u-ncxfPNW zH`Gx|Dav2q!mWE({sW#flCg`^+xvFjo^RjteLl~7lX>2}&RByE__2y*EFs6If>|Vy zK$_1{WHG|uORyZNULAPRz4y_)i;grKVSJ{ucL|dn!j(n-i z{>74~CgHPuxt<7#0>b^zxyyWN_B$4JKYo8xUJ0*xuiAW>-WN;L>CVbk3oWSbma-rj zhk_6<1!0<3v-Bdl=t*r%4lwEzqfQplN4cKHH2Qf6#sG$S6s3wR*Hak7Br8%F;+@2x z{wg(Bk!+3WZ@z7bj(jr319s|dbkRy+pYI+$6I3j;6FQ@~B*}@b^hEW?dwOe~CZz_y ziHC4-?Cl)F9LLc(*wjxjtvKah^Do|w_u;2L;WY=tX0)gwLiehFxU^j}Ks3&iz#ya0 zcuz341V$OjMa4Igy9&La%m|7GH>eOgr-!giJ@TD?>2}#@#8F?;M1& delta 46 pcmZ1^Hbr#9E+$S+1}L0-m&u$T&SNlSFkmpByphFl^9klCb^y+J2-yGt diff --git a/output/install.nsi b/output/install.nsi index a70796bcc..eab2c68b6 100644 --- a/output/install.nsi +++ b/output/install.nsi @@ -183,14 +183,6 @@ program_files: File /nonfatal "weaselARM64.dll" File /nonfatal "weaselARM64X.dll" ${EndIf} - File "weaselt.dll" - ${If} ${RunningX64} - File "weaseltx64.dll" - ${EndIf} - ${If} ${IsNativeARM64} - File /nonfatal "weaseltARM.dll" - File /nonfatal "weaseltARM64.dll" - ${EndIf} File "weasel.ime" ${If} ${RunningX64} File "weaselx64.ime" diff --git a/weasel.sln b/weasel.sln index 0f56c9efe..35539ea48 100644 --- a/weasel.sln +++ b/weasel.sln @@ -76,13 +76,9 @@ Global {FF9B3625-BBD6-4972-8F23-7BA57F3127E8}.Release|x64.ActiveCfg = Release|x64 {FF9B3625-BBD6-4972-8F23-7BA57F3127E8}.Release|x64.Build.0 = Release|x64 {FF9B3625-BBD6-4972-8F23-7BA57F3127E8}.ReleaseHant|ARM.ActiveCfg = ReleaseHant|ARM - {FF9B3625-BBD6-4972-8F23-7BA57F3127E8}.ReleaseHant|ARM.Build.0 = ReleaseHant|ARM {FF9B3625-BBD6-4972-8F23-7BA57F3127E8}.ReleaseHant|ARM64.ActiveCfg = ReleaseHant|ARM64 - {FF9B3625-BBD6-4972-8F23-7BA57F3127E8}.ReleaseHant|ARM64.Build.0 = ReleaseHant|ARM64 {FF9B3625-BBD6-4972-8F23-7BA57F3127E8}.ReleaseHant|Win32.ActiveCfg = ReleaseHant|Win32 - {FF9B3625-BBD6-4972-8F23-7BA57F3127E8}.ReleaseHant|Win32.Build.0 = ReleaseHant|Win32 {FF9B3625-BBD6-4972-8F23-7BA57F3127E8}.ReleaseHant|x64.ActiveCfg = ReleaseHant|x64 - {FF9B3625-BBD6-4972-8F23-7BA57F3127E8}.ReleaseHant|x64.Build.0 = ReleaseHant|x64 {10B3B8BF-7294-4661-9A8A-2FFC920FA2F4}.Debug|ARM.ActiveCfg = Debug|ARM {10B3B8BF-7294-4661-9A8A-2FFC920FA2F4}.Debug|ARM.Build.0 = Debug|ARM {10B3B8BF-7294-4661-9A8A-2FFC920FA2F4}.Debug|ARM64.ActiveCfg = Debug|ARM64