https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b9e8fb9ea4fd919449635b5f2f68652f3cced8b8
commit b9e8fb9ea4fd919449635b5f2f68652f3cced8b8 Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Wed Dec 27 15:08:17 2023 +0900 Commit: GitHub <nore...@github.com> CommitDate: Wed Dec 27 15:08:17 2023 +0900 [MSCTFIME][SDK] Implement CtfImeProcessCicHotkey (#6236) Supporting TIPs... JIRA issue: CORE-19360 - Define ITfSysHookSink and IID_ITfThreadMgr_P interfaces in <cicero/cictf.h>. - Implement CtfImeProcessCicHotkey function. --- dll/ime/msctfime/msctfime.cpp | 41 ++++++++++++++++++++++++++++---------- dll/ime/msctfime/msctfime.h | 1 + sdk/include/ddk/immdev.h | 1 + sdk/include/reactos/cicero/cictf.h | 31 ++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 11 deletions(-) diff --git a/dll/ime/msctfime/msctfime.cpp b/dll/ime/msctfime/msctfime.cpp index 376416110a5..246f924ecbe 100644 --- a/dll/ime/msctfime/msctfime.cpp +++ b/dll/ime/msctfime/msctfime.cpp @@ -765,15 +765,6 @@ Inquire( return S_OK; } -DEFINE_GUID(IID_ITfSysHookSink, 0x495388DA, 0x21A5, 0x4852, 0x8B, 0xB1, 0xED, 0x2F, 0x29, 0xDA, 0x8D, 0x60); - -struct ITfSysHookSink : IUnknown -{ - STDMETHOD(OnPreFocusDIM)(HWND hwnd) = 0; - STDMETHOD(OnSysKeyboardProc)(UINT, LONG) = 0; - STDMETHOD(OnSysShellProc)(INT, UINT, LONG) = 0; -}; - class TLS; typedef INT (CALLBACK *FN_INITDOCMGR)(UINT, ITfDocumentMgr *, ITfDocumentMgr *, LPVOID); @@ -2649,14 +2640,42 @@ CtfImeSetActiveContextAlways( return E_NOTIMPL; } + +/*********************************************************************** + * CtfImeProcessCicHotkey (MSCTFIME.@) + * + * @implemented + */ EXTERN_C HRESULT WINAPI CtfImeProcessCicHotkey( _In_ HIMC hIMC, _In_ UINT vKey, _In_ LPARAM lParam) { - FIXME("stub:(%p, %u, %p)\n", hIMC, vKey, lParam); - return E_NOTIMPL; + TRACE("(%p, %u, %p)\n", hIMC, vKey, lParam); + + TLS *pTLS = TLS::GetTLS(); + if (!pTLS) + return S_OK; + + HRESULT hr = S_OK; + ITfThreadMgr *pThreadMgr = NULL; + ITfThreadMgr_P *pThreadMgr_P = NULL; + if ((TF_GetThreadMgr(&pThreadMgr) == S_OK) && + (pThreadMgr->QueryInterface(IID_ITfThreadMgr_P, (void**)&pThreadMgr_P) == S_OK) && + CtfImmIsCiceroStartedInThread()) + { + HRESULT hr2; + if (SUCCEEDED(pThreadMgr_P->CallImm32HotkeyHandler(vKey, lParam, &hr2))) + hr = hr2; + } + + if (pThreadMgr) + pThreadMgr->Release(); + if (pThreadMgr_P) + pThreadMgr_P->Release(); + + return hr; } /*********************************************************************** diff --git a/dll/ime/msctfime/msctfime.h b/dll/ime/msctfime/msctfime.h index a5273e11d2d..8ab6bf3f5ad 100644 --- a/dll/ime/msctfime/msctfime.h +++ b/dll/ime/msctfime/msctfime.h @@ -26,6 +26,7 @@ #include <cicero/cicbase.h> #include <cicero/cicarray.h> #include <cicero/cicimc.h> +#include <cicero/cictf.h> class CicInputContext; diff --git a/sdk/include/ddk/immdev.h b/sdk/include/ddk/immdev.h index 2d955dd81c6..3d3b4b5686a 100644 --- a/sdk/include/ddk/immdev.h +++ b/sdk/include/ddk/immdev.h @@ -18,6 +18,7 @@ extern "C" { #endif BOOL WINAPI ImmDisableTextFrameService(_In_ DWORD dwThreadId); +BOOL WINAPI CtfImmIsCiceroStartedInThread(VOID); typedef struct tagSOFTKBDDATA { diff --git a/sdk/include/reactos/cicero/cictf.h b/sdk/include/reactos/cicero/cictf.h new file mode 100644 index 00000000000..33598b1c5b1 --- /dev/null +++ b/sdk/include/reactos/cicero/cictf.h @@ -0,0 +1,31 @@ +/* + * PROJECT: ReactOS Cicero + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Cicero Text Framework + * COPYRIGHT: Copyright 2023 Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> + */ + +#pragma once + +DEFINE_GUID(IID_ITfSysHookSink, 0x495388DA, 0x21A5, 0x4852, 0x8B, 0xB1, 0xED, 0x2F, 0x29, 0xDA, 0x8D, 0x60); + +struct ITfSysHookSink : IUnknown +{ + STDMETHOD(OnPreFocusDIM)(HWND hwnd) = 0; + STDMETHOD(OnSysKeyboardProc)(UINT, LONG) = 0; + STDMETHOD(OnSysShellProc)(INT, UINT, LONG) = 0; +}; + +DEFINE_GUID(IID_ITfThreadMgr_P, 0x7C6247A1, 0x2884, 0x4B7C, 0xAF, 0x24, 0xF1, 0x98, 0x04, 0x7A, 0xA7, 0x28); + +struct ITfThreadMgr_P : ITfThreadMgr +{ + STDMETHOD(GetAssociated)(HWND hwnd, ITfDocumentMgr **ppDocMgr) = 0; + STDMETHOD(SetSysHookSink)(ITfSysHookSink *pSysHookSink) = 0; + STDMETHOD(RequestPostponedLock)(ITfContext *pContext) = 0; + STDMETHOD(IsKeystrokeFeedEnabled)(int *) = 0; + STDMETHOD(CallImm32HotkeyHandler)(UINT vKey, LPARAM lParam, HRESULT* phrResult) = 0; + STDMETHOD(ActivateEx)(LPDWORD, DWORD) = 0; +}; + +DEFINE_GUID(IID_ITfKeystrokeMgr_P, 0x53FA1BEC, 0x5BE1, 0x458E, 0xAE, 0x70, 0xA9, 0xF1, 0xDC, 0x84, 0x3E, 0x81);