https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f9489f48760fe3823b8d135087bb63967b97841f

commit f9489f48760fe3823b8d135087bb63967b97841f
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Tue Jan 2 15:33:37 2024 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Tue Jan 2 15:33:37 2024 +0900

    [MSCTFIME] Strengthen CicInputContext (#6273)
    
    Supporting Text Input Processors (TIPs)...
    JIRA issue: CORE-19360
---
 dll/ime/msctfime/msctfime.cpp | 112 +++++++++++++++++++++++++++++++++++-------
 1 file changed, 93 insertions(+), 19 deletions(-)

diff --git a/dll/ime/msctfime/msctfime.cpp b/dll/ime/msctfime/msctfime.cpp
index 28a1c55d4df..d0feb2008da 100644
--- a/dll/ime/msctfime/msctfime.cpp
+++ b/dll/ime/msctfime/msctfime.cpp
@@ -17,7 +17,8 @@ DWORD g_dwOSInfo = 0;
 BOOL gfTFInitLib = FALSE;
 CRITICAL_SECTION g_csLock;
 
-DEFINE_GUID(GUID_COMPARTMENT_CTFIME_DIMFLAGS, 0xA94C5FD2, 0xC471, 0x4031, 
0x95, 0x46, 0x70, 0x9C, 0x17, 0x30, 0x0C, 0xB9);
+DEFINE_GUID(GUID_COMPARTMENT_CTFIME_DIMFLAGS,        0xA94C5FD2, 0xC471, 
0x4031, 0x95, 0x46, 0x70, 0x9C, 0x17, 0x30, 0x0C, 0xB9);
+DEFINE_GUID(GUID_COMPARTMENT_CTFIME_CICINPUTCONTEXT, 0x85A688F7, 0x6DC8, 
0x4F17, 0xA8, 0x3A, 0xB1, 0x1C, 0x09, 0xCD, 0xD7, 0xBF);
 
 EXTERN_C void __cxa_pure_virtual(void)
 {
@@ -148,6 +149,14 @@ HRESULT InitDisplayAttrbuteLib(PCIC_LIBTHREAD pLibThread)
     return E_NOTIMPL;
 }
 
+HIMC GetActiveContext(VOID)
+{
+    HWND hwndFocus = ::GetFocus();
+    if (!hwndFocus)
+        hwndFocus = ::GetActiveWindow();
+    return ::ImmGetContext(hwndFocus);
+}
+
 /**
  * @implemented
  */
@@ -588,6 +597,8 @@ HRESULT CCompartmentEventSink::_Unadvise()
 }
 
 class CInputContextOwnerCallBack;
+class CTextEventSink;
+class CInputContextOwner;
 
 /***********************************************************************
  *      CicInputContext
@@ -600,29 +611,32 @@ class CicInputContext
     , public ITfCompositionSink
 {
 public:
-    ITfContextOwnerCompositionSink *m_pContextOwnerCompositionSink;
-    DWORD m_dwUnknown0;
     LONG m_cRefs;
     HIMC m_hIMC;
     ITfDocumentMgr *m_pDocumentMgr;
     ITfContext *m_pContext;
-    DWORD m_dwUnknown1;
+    IUnknown *m_pUnknown1;
     CInputContextOwnerCallBack *m_pICOwnerCallback;
-    LPVOID m_pTextEventSink;
+    CTextEventSink *m_pTextEventSink;
     CCompartmentEventSink *m_pCompEventSink1;
     CCompartmentEventSink *m_pCompEventSink2;
-    DWORD m_dwUnknown3[4];
+    CInputContextOwner *m_pInputContextOwner;
+    DWORD m_dwUnknown3[3];
     DWORD m_dwUnknown4[2];
     DWORD m_dwQueryPos;
     DWORD m_dwUnknown5;
     GUID m_guid;
     DWORD m_dwUnknown6[11];
     BOOL m_bSelecting;
-    DWORD m_dwUnknown7[7];
+    DWORD m_dwUnknown6_5;
+    LONG m_cCompLocks;
+    DWORD m_dwUnknown7[5];
     WORD m_cGuidAtoms;
     WORD m_padding;
     DWORD m_adwGuidAtoms[256];
-    DWORD m_dwUnknown8[19];
+    DWORD m_dwUnknown8[17];
+    TfClientId m_clientId;
+    DWORD m_dwUnknown9;
 
 public:
     CicInputContext(
@@ -672,7 +686,7 @@ CicInputContext::CicInputContext(
 }
 
 /**
- * @unimplemented
+ * @implemented
  */
 STDMETHODIMP CicInputContext::QueryInterface(REFIID riid, LPVOID* ppvObj)
 {
@@ -680,11 +694,11 @@ STDMETHODIMP CicInputContext::QueryInterface(REFIID riid, 
LPVOID* ppvObj)
 
     if (IsEqualIID(riid, IID_ITfContextOwnerCompositionSink))
     {
-        *ppvObj = (ITfContextOwnerCompositionSink*)this;
+        *ppvObj = static_cast<ITfContextOwnerCompositionSink*>(this);
         AddRef();
         return S_OK;
     }
-    if (IsEqualIID(riid, IID_IUnknown))
+    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, 
IID_ITfCleanupContextSink))
     {
         *ppvObj = this;
         AddRef();
@@ -716,35 +730,45 @@ STDMETHODIMP_(ULONG) CicInputContext::Release()
 }
 
 /**
- * @unimplemented
+ * @implemented
  */
 STDMETHODIMP
 CicInputContext::OnStartComposition(
     ITfCompositionView *pComposition,
     BOOL *pfOk)
 {
-    return E_NOTIMPL;
+    if ((m_cCompLocks <= 0) || m_dwUnknown6_5)
+    {
+        *pfOk = TRUE;
+        ++m_cCompLocks;
+    }
+    else
+    {
+        *pfOk = FALSE;
+    }
+    return S_OK;
 }
 
 /**
- * @unimplemented
+ * @implemented
  */
 STDMETHODIMP
 CicInputContext::OnUpdateComposition(
     ITfCompositionView *pComposition,
     ITfRange *pRangeNew)
 {
-    return E_NOTIMPL;
+    return S_OK;
 }
 
 /**
- * @unimplemented
+ * @implemented
  */
 STDMETHODIMP
 CicInputContext::OnEndComposition(
     ITfCompositionView *pComposition)
 {
-    return E_NOTIMPL;
+    --m_cCompLocks;
+    return S_OK;
 }
 
 /**
@@ -791,8 +815,58 @@ CicInputContext::CreateInputContext(
 HRESULT
 CicInputContext::DestroyInputContext()
 {
-    // FIXME
-    return E_NOTIMPL;
+    ITfSourceSingle *pSource = NULL;
+
+    if (m_pContext && m_pContext->QueryInterface(IID_ITfSourceSingle, (void 
**)&pSource) == S_OK)
+        pSource->UnadviseSingleSink(m_clientId, IID_ITfCleanupContextSink);
+
+    //FIXME: m_dwUnknown5
+    //FIXME: m_pTextEventSink
+
+    if (m_pCompEventSink2)
+    {
+        //FIXME: m_pCompEventSink2->_Unadvise();
+        m_pCompEventSink2->Release();
+        m_pCompEventSink2 = NULL;
+    }
+
+    if (m_pCompEventSink1)
+    {
+        //FIXME: m_pCompEventSink1->_Unadvise();
+        m_pCompEventSink1->Release();
+        m_pCompEventSink1 = NULL;
+    }
+
+    //FIXME: m_pInputContextOwner
+
+    if (m_pDocumentMgr)
+        m_pDocumentMgr->Pop(1);
+
+    if (m_pContext)
+    {
+        ClearCompartment(m_clientId, m_pContext, 
GUID_COMPARTMENT_CTFIME_CICINPUTCONTEXT, 0);
+        m_pContext->Release();
+        m_pContext = NULL;
+    }
+
+    if (m_pUnknown1)
+    {
+        m_pUnknown1->Release();
+        m_pUnknown1 = NULL;
+    }
+
+    // FIXME: m_pICOwnerCallback
+
+    if (m_pDocumentMgr)
+    {
+        m_pDocumentMgr->Release();
+        m_pDocumentMgr = NULL;
+    }
+
+    if (pSource)
+        pSource->Release();
+
+    return S_OK;
 }
 
 /**

Reply via email to