From 519232df78db79342bd98a1d8cc59e388950c521 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Thu, 17 Jul 2025 21:17:28 +0900 Subject: [PATCH] [MSCTF] Support TF_CreateCategoryMgr etc. (#8260) Implementing missing features... JIRA issue: CORE-19361 - Implement TF_CreateCategoryMgr and TF_CreateDisplayAttributeMgr. - Rename g_tlsIndex as g_dwTLSIndex. - Use ProcessAttach and ProcessDetach in DllMain. --- base/ctf/msctf/msctf.cpp | 12 +++++------- base/ctf/msctf/precomp.h | 5 ++++- base/ctf/msctf/threadmgr.cpp | 8 ++++---- base/ctf/msctf/utils.cpp | 27 ++++++++++----------------- 4 files changed, 23 insertions(+), 29 deletions(-) diff --git a/base/ctf/msctf/msctf.cpp b/base/ctf/msctf/msctf.cpp index 43ab7a44579..9a26d383853 100644 --- a/base/ctf/msctf/msctf.cpp +++ b/base/ctf/msctf/msctf.cpp @@ -41,7 +41,6 @@ static UINT array_size; static struct list AtsList = LIST_INIT(AtsList); static UINT activated = 0; -DWORD g_tlsIndex = 0; TfClientId g_processId = 0; ITfCompartmentMgr *g_globalCompartmentMgr = NULL; @@ -372,7 +371,7 @@ HRESULT add_active_textservice(TF_LANGUAGEPROFILE *lp) ActivatedTextService *actsvr; ITfCategoryMgr *catmgr; AtsEntry *entry; - ITfThreadMgrEx *tm = (ITfThreadMgrEx *)TlsGetValue(g_tlsIndex); + ITfThreadMgrEx *tm = (ITfThreadMgrEx *)TlsGetValue(g_dwTLSIndex); ITfClientId *clientid; if (!tm) @@ -544,11 +543,10 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad) { case DLL_PROCESS_ATTACH: MSCTF_hinstance = hinst; - g_tlsIndex = TlsAlloc(); - break; + return ProcessAttach(hinst); + case DLL_PROCESS_DETACH: - if (fImpLoad) break; - TlsFree(g_tlsIndex); + ProcessDetach(hinst); break; } return TRUE; @@ -613,7 +611,7 @@ HRESULT WINAPI TF_CreateThreadMgr(ITfThreadMgr **pptim) HRESULT WINAPI TF_GetThreadMgr(ITfThreadMgr **pptim) { TRACE("\n"); - *pptim = (ITfThreadMgr *)TlsGetValue(g_tlsIndex); + *pptim = (ITfThreadMgr *)TlsGetValue(g_dwTLSIndex); if (*pptim) (*pptim)->AddRef(); diff --git a/base/ctf/msctf/precomp.h b/base/ctf/msctf/precomp.h index dc1165cc357..8be89f01087 100644 --- a/base/ctf/msctf/precomp.h +++ b/base/ctf/msctf/precomp.h @@ -43,7 +43,7 @@ extern "C" { #define COOKIE_MAGIC_INPUTPROCESSORPROFILEACTIVATIONSINK 0x00b0 #define COOKIE_MAGIC_ACTIVELANGSINK 0x00c0 -extern DWORD g_tlsIndex; +extern DWORD g_dwTLSIndex; extern TfClientId g_processId; extern ITfCompartmentMgr *g_globalCompartmentMgr; @@ -108,6 +108,9 @@ void free_sinks(struct list *sink_list); HRESULT __wine_register_resources(HMODULE module); HRESULT __wine_unregister_resources(HMODULE module); +BOOL ProcessAttach(HINSTANCE hinstDLL); +VOID ProcessDetach(HINSTANCE hinstDLL); + #ifdef __cplusplus } // extern "C" #endif diff --git a/base/ctf/msctf/threadmgr.cpp b/base/ctf/msctf/threadmgr.cpp index 8cee2c6d035..b887831408c 100644 --- a/base/ctf/msctf/threadmgr.cpp +++ b/base/ctf/msctf/threadmgr.cpp @@ -308,7 +308,7 @@ CThreadMgr::~CThreadMgr() if (m_focusHook) UnhookWindowsHookEx(m_focusHook); - TlsSetValue(g_tlsIndex, NULL); + TlsSetValue(g_dwTLSIndex, NULL); TRACE("destroying %p\n", this); if (m_focus) @@ -527,7 +527,7 @@ LRESULT CThreadMgr::_ThreadFocusHookProc(INT nCode, WPARAM wParam, LPARAM lParam LRESULT CALLBACK CThreadMgr::ThreadFocusHookProc(INT nCode, WPARAM wParam, LPARAM lParam) { - CThreadMgr *This = (CThreadMgr *)TlsGetValue(g_tlsIndex); + CThreadMgr *This = (CThreadMgr *)TlsGetValue(g_dwTLSIndex); if (!This) { ERR("Hook proc but no ThreadMgr for this thread. Serious Error\n"); @@ -1215,7 +1215,7 @@ HRESULT CThreadMgr::CreateInstance(IUnknown *pUnkOuter, CThreadMgr **ppOut) return CLASS_E_NOAGGREGATION; /* Only 1 ThreadMgr is created per thread */ - CThreadMgr *This = (CThreadMgr *)TlsGetValue(g_tlsIndex); + CThreadMgr *This = (CThreadMgr *)TlsGetValue(g_dwTLSIndex); if (This) { This->AddRef(); @@ -1227,7 +1227,7 @@ HRESULT CThreadMgr::CreateInstance(IUnknown *pUnkOuter, CThreadMgr **ppOut) if (!This) return E_OUTOFMEMORY; - TlsSetValue(g_tlsIndex, This); + TlsSetValue(g_dwTLSIndex, This); ITfCompartmentMgr *pCompMgr = NULL; CompartmentMgr_Constructor(static_cast(This), IID_IUnknown, (IUnknown **)&pCompMgr); diff --git a/base/ctf/msctf/utils.cpp b/base/ctf/msctf/utils.cpp index 6beb80de1d8..6e97df1c41f 100644 --- a/base/ctf/msctf/utils.cpp +++ b/base/ctf/msctf/utils.cpp @@ -250,15 +250,13 @@ TF_GetThreadFlags( /*********************************************************************** * TF_CreateCategoryMgr (MSCTF.@) * - * @unimplemented + * @implemented */ EXTERN_C HRESULT WINAPI TF_CreateCategoryMgr(_Out_ ITfCategoryMgr **ppcat) { - FIXME("(%p)\n", ppcat); - if (ppcat) - *ppcat = NULL; - return E_NOTIMPL; + TRACE("(%p)\n", ppcat); + return CategoryMgr_Constructor(NULL, (IUnknown **)ppcat); } /*********************************************************************** @@ -279,14 +277,13 @@ TF_CreateCicLoadMutex(_Out_ LPBOOL pfWinLogon) /*********************************************************************** * TF_CreateDisplayAttributeMgr (MSCTF.@) * - * @unimplemented + * @implemented */ EXTERN_C HRESULT WINAPI TF_CreateDisplayAttributeMgr(_Out_ ITfDisplayAttributeMgr **ppdam) { - FIXME("(%p)\n", ppdam); - *ppdam = NULL; - return E_NOTIMPL; + TRACE("(%p)\n", ppdam); + return DisplayAttributeMgr_Constructor(NULL, (IUnknown **)ppdam); } /*********************************************************************** @@ -765,10 +762,8 @@ EXTERN_C VOID TFUninitLib(VOID) // Do nothing } -/** - * @unimplemented - */ -BOOL ProcessAttach(HINSTANCE hinstDLL) // FIXME: Call me from DllMain +/// @unimplemented +BOOL ProcessAttach(HINSTANCE hinstDLL) { gf_CRT_INIT = TRUE; @@ -841,10 +836,8 @@ BOOL ProcessAttach(HINSTANCE hinstDLL) // FIXME: Call me from DllMain return TRUE; } -/** - * @unimplemented - */ -VOID ProcessDetach(HINSTANCE hinstDLL) // FIXME: Call me from DllMain +/// @unimplemented +VOID ProcessDetach(HINSTANCE hinstDLL) { if (!gf_CRT_INIT) {