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

commit 69b08be0e0f03f28ef5edfce46587f1b1cd42d32
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Fri Feb 23 13:45:00 2024 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Fri Feb 23 13:45:00 2024 +0900

    [MSCTFIME][CICERO] Half-implement CIMEUIWindowHandler (#6521)
    
    Supporting TIPs...
    JIRA issue: CORE-19360
    - Add implementation to
      CIMEUIWindowHandler class.
---
 dll/ime/msctfime/bridge.cpp       |   2 +-
 dll/ime/msctfime/inputcontext.cpp |  29 ++-
 dll/ime/msctfime/inputcontext.h   |  22 ++-
 dll/ime/msctfime/misc.h           |   2 +
 dll/ime/msctfime/msctfime.h       |   2 +
 dll/ime/msctfime/ui.cpp           | 365 ++++++++++++++++++++++++++++++++++++--
 dll/ime/msctfime/ui.h             |   4 +
 sdk/lib/cicero/ciccaret.h         |   1 +
 8 files changed, 407 insertions(+), 20 deletions(-)

diff --git a/dll/ime/msctfime/bridge.cpp b/dll/ime/msctfime/bridge.cpp
index ed74a566328..50ac6622614 100644
--- a/dll/ime/msctfime/bridge.cpp
+++ b/dll/ime/msctfime/bridge.cpp
@@ -231,7 +231,7 @@ CicBridge::SelectEx(
     if (fSelect)
     {
         if (pCicIC)
-            pCicIC->m_dwUnknown6[1] &= ~1;
+            pCicIC->m_bCandidateOpen = FALSE;
         if (imcLock.get().fOpen)
             OnSetOpenStatus(pTLS, pThreadMgr, imcLock, pCicIC);
     }
diff --git a/dll/ime/msctfime/inputcontext.cpp 
b/dll/ime/msctfime/inputcontext.cpp
index 7362040c8fb..a208fe8885a 100644
--- a/dll/ime/msctfime/inputcontext.cpp
+++ b/dll/ime/msctfime/inputcontext.cpp
@@ -16,7 +16,6 @@ CicInputContext::CicInputContext(
     _In_ HIMC hIMC)
 {
     m_hIMC = hIMC;
-    m_guid = GUID_NULL;
     m_dwQueryPos = 0;
     m_cRefs = 1;
 }
@@ -266,18 +265,44 @@ HRESULT CicInputContext::EscbCompComplete(CicIMCLock& 
imcLock)
     return E_NOTIMPL;
 }
 
+/// @unimplemented
+HRESULT CicInputContext::DelayedReconvertFuncCall(CicIMCLock& imcLock)
+{
+    return E_NOTIMPL;
+}
+
+/// @unimplemented
+HRESULT
+CicInputContext::MsImeMouseHandler(
+    DWORD dwUnknown58,
+    DWORD dwUnknown59,
+    UINT keys,
+    CicIMCLock& imcLock)
+{
+    return E_NOTIMPL;
+}
+
 /// @unimplemented
 HRESULT
 CicInputContext::SetupReconvertString(
     CicIMCLock& imcLock,
     ITfThreadMgr_P *pThreadMgr,
     UINT uCodePage,
-    DWORD dwUnknown61,
+    UINT uMsg,
     BOOL bUndo)
 {
     return E_NOTIMPL;
 }
 
+void CicInputContext::ClearPrevCandidatePos()
+{
+    m_dwUnknown8 = 0;
+    ZeroMemory(&m_rcCandidate1, sizeof(m_rcCandidate1));
+    ZeroMemory(&m_CandForm, sizeof(m_CandForm));
+    ZeroMemory(&m_rcCandidate2, sizeof(m_rcCandidate2));
+    m_dwQueryPos = 0;
+}
+
 /// @unimplemented
 HRESULT CicInputContext::EndReconvertString(CicIMCLock& imcLock)
 {
diff --git a/dll/ime/msctfime/inputcontext.h b/dll/ime/msctfime/inputcontext.h
index 185d9b8161b..695aa5a158c 100644
--- a/dll/ime/msctfime/inputcontext.h
+++ b/dll/ime/msctfime/inputcontext.h
@@ -8,6 +8,7 @@
 #pragma once
 
 #include "sinks.h"
+#include "misc.h"
 
 class CInputContextOwnerCallBack;
 class CInputContextOwner;
@@ -44,8 +45,10 @@ public:
     DWORD m_dwUnknown4[2];
     DWORD m_dwQueryPos;
     DWORD m_dwUnknown5;
-    GUID m_guid;
-    DWORD m_dwUnknown6[11];
+    CModeBias m_ModeBias;
+    DWORD m_dwUnknown6;
+    BOOL m_bCandidateOpen;
+    DWORD m_dwUnknown6_5[9];
     BOOL m_bSelecting;
     BOOL m_bReconverting;
     LONG m_cCompLocks;
@@ -53,7 +56,10 @@ public:
     WORD m_cGuidAtoms;
     WORD m_padding;
     DWORD m_adwGuidAtoms[256];
-    DWORD m_dwUnknown8[17];
+    DWORD m_dwUnknown8;
+    RECT m_rcCandidate1;
+    CANDIDATEFORM m_CandForm;
+    RECT m_rcCandidate2;
     TfClientId m_clientId;
     DWORD m_dwUnknown9;
 
@@ -96,7 +102,15 @@ public:
         CicIMCLock& imcLock,
         ITfThreadMgr_P *pThreadMgr,
         UINT uCodePage,
-        DWORD dwUnknown61,
+        UINT uMsg,
         BOOL bUndo);
+    HRESULT MsImeMouseHandler(
+        DWORD dwUnknown58,
+        DWORD dwUnknown59,
+        UINT keys,
+        CicIMCLock& imcLock);
+
     HRESULT EndReconvertString(CicIMCLock& imcLock);
+    HRESULT DelayedReconvertFuncCall(CicIMCLock& imcLock);
+    void ClearPrevCandidatePos();
 };
diff --git a/dll/ime/msctfime/misc.h b/dll/ime/msctfime/misc.h
index f1f600b4671..49cca38c0cc 100644
--- a/dll/ime/msctfime/misc.h
+++ b/dll/ime/msctfime/misc.h
@@ -50,6 +50,8 @@ class CModeBias
 public:
     GUID m_guid;
 
+    CModeBias() : m_guid(GUID_NULL) { }
+
     GUID ConvertModeBias(LONG bias);
     LONG ConvertModeBias(REFGUID guid);
     void SetModeBias(REFGUID rguid);
diff --git a/dll/ime/msctfime/msctfime.h b/dll/ime/msctfime/msctfime.h
index 28597863047..59a89d537f2 100644
--- a/dll/ime/msctfime/msctfime.h
+++ b/dll/ime/msctfime/msctfime.h
@@ -54,6 +54,8 @@ DEFINE_GUID(GUID_MODEBIAS_FILENAME,                  
0xD7F707FE, 0x44C6, 0x4FCA,
 DEFINE_GUID(GUID_MODEBIAS_NUMERIC,                   0x4021766C, 0xE872, 
0x48FD, 0x9C, 0xEE, 0x4E, 0xC5, 0xC7, 0x5E, 0x16, 0xC3);
 DEFINE_GUID(GUID_MODEBIAS_URLHISTORY,                0x8B0E54D9, 0x63F2, 
0x4C68, 0x84, 0xD4, 0x79, 0xAE, 0xE7, 0xA5, 0x9F, 0x09);
 DEFINE_GUID(GUID_MODEBIAS_DEFAULT,                   0xF3DA8BD4, 0x0786, 
0x49C2, 0x8C, 0x09, 0x68, 0x39, 0xD8, 0xB8, 0x4F, 0x58);
+DEFINE_GUID(GUID_PROP_MODEBIAS,                      0x372E0716, 0x974F, 
0x40AC, 0xA0, 0x88, 0x08, 0xCD, 0xC9, 0x2E, 0xBF, 0xBC);
+
 #define GUID_MODEBIAS_NONE GUID_NULL
 
 #include "resource.h"
diff --git a/dll/ime/msctfime/ui.cpp b/dll/ime/msctfime/ui.cpp
index ed8455782c2..7b6b5b2a2fc 100644
--- a/dll/ime/msctfime/ui.cpp
+++ b/dll/ime/msctfime/ui.cpp
@@ -784,6 +784,88 @@ UIComposition::CompWndProc(HWND hWnd, UINT uMsg, WPARAM 
wParam, LPARAM lParam)
     return 0;
 }
 
+/// @implemented
+HRESULT UIComposition::OnImeNotifySetCompositionWindow(CicIMCLock& imcLock)
+{
+    return UpdateCompositionRect(imcLock);
+}
+
+/// @unimplemented
+HRESULT UIComposition::UpdateCompositionRect(CicIMCLock& imcLock)
+{
+    return E_NOTIMPL;
+}
+
+/// @implemented
+INT UIComposition::GetLevelFromIMC(CicIMCLock& imcLock)
+{
+    DWORD dwStyle = imcLock.get().cfCompForm.dwStyle;
+    if (dwStyle == CFS_DEFAULT)
+        return 1;
+    if (!(dwStyle & (CFS_FORCE_POSITION | CFS_POINT | CFS_RECT)))
+        return 0;
+
+    RECT rc;
+    ::GetClientRect(imcLock.get().hWnd, &rc);
+    if (!::PtInRect(&rc, imcLock.get().cfCompForm.ptCurrentPos))
+        return 1;
+
+    INPUTCONTEXT *pIC = &imcLock.get();
+    if ((pIC->cfCompForm.dwStyle & CFS_RECT) &&
+        (pIC->cfCompForm.rcArea.top == pIC->cfCompForm.rcArea.bottom) &&
+        (pIC->cfCompForm.rcArea.left == pIC->cfCompForm.rcArea.right))
+    {
+        return 1;
+    }
+
+    return 2;
+}
+
+/// @implemented
+HRESULT UIComposition::OnImeSetContextAfter(CicIMCLock& imcLock)
+{
+    if ((!m_pDefCompFrameWindow || !::IsWindow(*m_pDefCompFrameWindow)) && 
!::IsWindow(m_CompStrs[0].m_hWnd))
+    {
+        m_dwUnknown56[0] &= ~0x8000;
+        return S_OK;
+    }
+
+    if (FAILED(imcLock.m_hr))
+        return imcLock.m_hr;
+
+    INT Level = GetLevelFromIMC(imcLock);
+    if ((Level == 1 || Level == 2) && (m_dwUnknown56[0] & 0x80000000) && 
m_dwUnknown56[1])
+    {
+        DWORD dwCompStrLen = 0;
+        UpdateShowCompWndFlag(imcLock, &dwCompStrLen);
+
+        if (Level == 1)
+        {
+            ::ShowWindow(*m_pDefCompFrameWindow, (m_bHasCompStr ? 
SW_SHOWNOACTIVATE : SW_HIDE));
+        }
+        else if (Level == 2 && !m_bHasCompStr && dwCompStrLen)
+        {
+            for (INT iCompStr = 0; iCompStr < 3; ++iCompStr)
+            {
+                m_CompStrs[iCompStr].m_Caret.HideCaret();
+                ::ShowWindow(m_CompStrs[iCompStr].m_Caret, SW_HIDE);
+            }
+        }
+    }
+    else
+    {
+        ::ShowWindow(*m_pDefCompFrameWindow, SW_HIDE);
+
+        for (INT iCompStr = 0; iCompStr < 3; ++iCompStr)
+        {
+            m_CompStrs[iCompStr].m_Caret.HideCaret();
+            ::ShowWindow(m_CompStrs[iCompStr].m_Caret, SW_HIDE);
+        }
+    }
+
+    return S_OK;
+}
+
 /***********************************************************************/
 
 // For GetWindowLongPtr/SetWindowLongPtr
@@ -853,31 +935,166 @@ void UI::OnImeSetContext(CicIMCLock& imcLock, WPARAM 
wParam, LPARAM lParam)
 struct CIMEUIWindowHandler
 {
     static LRESULT CALLBACK ImeUIMsImeHandler(HWND hWnd, UINT uMsg, WPARAM 
wParam, LPARAM lParam);
-    static LRESULT CALLBACK ImeUIMsImeMouseHandler(HWND hWnd, WPARAM wParam, 
LPARAM lParam);
+    static HRESULT CALLBACK ImeUIMsImeMouseHandler(HWND hWnd, WPARAM wParam, 
LPARAM lParam);
     static LRESULT CALLBACK ImeUIMsImeModeBiasHandler(HWND hWnd, WPARAM 
wParam, LPARAM lParam);
     static LRESULT CALLBACK ImeUIMsImeReconvertRequest(HWND hWnd, WPARAM 
wParam, LPARAM lParam);
     static LRESULT CALLBACK ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM 
wParam, LPARAM lParam);
+    static HRESULT CALLBACK ImeUIDelayedReconvertFuncCall(HWND hWnd);
+    static HRESULT CALLBACK ImeUIOnLayoutChange(LPARAM lParam);
+    static HRESULT CALLBACK ImeUIPrivateHandler(UINT uMsg, WPARAM wParam, 
LPARAM lParam);
+    static LRESULT CALLBACK ImeUINotifyHandler(HWND hWnd, UINT uMsg, WPARAM 
wParam, LPARAM lParam);
 };
 
-/// @unimplemented
-LRESULT CALLBACK
+/// @implemented
+HRESULT CALLBACK
 CIMEUIWindowHandler::ImeUIMsImeMouseHandler(HWND hWnd, WPARAM wParam, LPARAM 
lParam)
 {
-    return 0; //FIXME
+    if ((BYTE)wParam == 0xFF)
+        return TRUE;
+
+    CicIMCLock imcLock((HIMC)lParam);
+    if (FAILED(imcLock.m_hr))
+        return imcLock.m_hr;
+
+    CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
+    if (FAILED(imeContext.m_hr))
+        return FALSE;
+
+    HRESULT hr = E_FAIL;
+    CicInputContext *pCicIC = imeContext.get().m_pCicIC;
+    if (pCicIC)
+    {
+        UINT keys = 0;
+        if (wParam & MK_LBUTTON)
+            keys |= 0x1;
+        if (wParam & MK_SHIFT)
+            keys |= 0x10;
+        if (wParam & MK_RBUTTON)
+            keys |= 0x2;
+        if (wParam & MK_MBUTTON)
+            keys |= 0x780000;
+        else if (wParam & MK_ALT)
+            keys |= 0xFF880000;
+        hr = pCicIC->MsImeMouseHandler(HIWORD(wParam), HIBYTE(LOWORD(wParam)), 
keys, imcLock);
+    }
+
+    return hr;
 }
 
-/// @unimplemented
+/// @implemented
+HRESULT CALLBACK CIMEUIWindowHandler::ImeUIOnLayoutChange(LPARAM lParam)
+{
+    CicIMCLock imcLock((HIMC)lParam);
+    if (FAILED(imcLock.m_hr))
+        return S_OK;
+
+    CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
+    if (FAILED(imeContext.m_hr))
+        return S_OK;
+
+    CicInputContext *pCicIC = imeContext.get().m_pCicIC;
+    if (pCicIC)
+    {
+        auto pContextOwnerServices = pCicIC->m_pContextOwnerServices;
+        pContextOwnerServices->AddRef();
+        pContextOwnerServices->OnLayoutChange();
+        pContextOwnerServices->Release();
+    }
+
+    return S_OK;
+}
+
+/// @implemented
+HRESULT CALLBACK
+CIMEUIWindowHandler::ImeUIPrivateHandler(UINT uMsg, WPARAM wParam, LPARAM 
lParam)
+{
+    CicIMCLock imcLock((HIMC)lParam);
+    if (FAILED(imcLock.m_hr))
+        return imcLock.m_hr;
+
+    CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
+    if (FAILED(imeContext.m_hr))
+        return imeContext.m_hr;
+
+    CicInputContext *pCicIC = imeContext.get().m_pCicIC;
+    if (pCicIC && wParam == 0x10)
+        pCicIC->EscbClearDocFeedBuffer(imcLock, TRUE);
+
+    return S_OK;
+}
+
+/// @implemented
 LRESULT CALLBACK
 CIMEUIWindowHandler::ImeUIMsImeModeBiasHandler(HWND hWnd, WPARAM wParam, 
LPARAM lParam)
 {
-    return 0; //FIXME
+    if (!wParam)
+        return TRUE;
+
+    CicIMCLock imcLock((HIMC)lParam);
+    if (FAILED(imcLock.m_hr))
+        return imcLock.m_hr;
+
+    CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
+    if (FAILED(imeContext.m_hr))
+        return FALSE;
+
+    CicInputContext *pCicIC = imeContext.get().m_pCicIC;
+    if (!pCicIC)
+        return FALSE;
+
+    if (wParam == 1)
+    {
+        if (lParam == 0 || lParam == 1 || lParam == 4 || lParam == 0x10000)
+        {
+            GUID guid = pCicIC->m_ModeBias.ConvertModeBias((DWORD)lParam);
+            pCicIC->m_ModeBias.SetModeBias(guid);
+
+            pCicIC->m_dwUnknown7[2] |= 1;
+            pCicIC->m_pContextOwnerServices->AddRef();
+            
pCicIC->m_pContextOwnerServices->OnAttributeChange(GUID_PROP_MODEBIAS);
+            pCicIC->m_pContextOwnerServices->Release();
+            return TRUE;
+        }
+    }
+    else if (wParam == 2)
+    {
+        return pCicIC->m_ModeBias.ConvertModeBias(pCicIC->m_ModeBias.m_guid);
+    }
+
+    return FALSE;
 }
 
-/// @unimplemented
+/// @implemented
 LRESULT CALLBACK
 CIMEUIWindowHandler::ImeUIMsImeReconvertRequest(HWND hWnd, WPARAM wParam, 
LPARAM lParam)
 {
-    return 0; //FIXME
+    if (wParam == 0x10000000)
+        return TRUE;
+
+    HIMC hIMC = (HIMC)::GetWindowLongPtrW(hWnd, UI_GWLP_HIMC);
+    CicIMCLock imcLock(hIMC);
+    if (FAILED(imcLock.m_hr))
+        return FALSE;
+
+    CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
+    if (FAILED(imeContext.m_hr))
+        return FALSE;
+
+    CicInputContext *pCicIC = imeContext.get().m_pCicIC;
+    TLS *pTLS = TLS::GetTLS();
+    if (!pCicIC || !pTLS)
+        return FALSE;
+
+    auto pThreadMgr = pTLS->m_pThreadMgr;
+    auto pProfile = pTLS->m_pProfile;
+    if (!pThreadMgr || !pProfile)
+        return FALSE;
+
+    UINT uCodePage = 0;
+    pProfile->GetCodePageA(&uCodePage);
+    pCicIC->SetupReconvertString(imcLock, pThreadMgr, uCodePage, 
WM_MSIME_RECONVERT, FALSE);
+    pCicIC->EndReconvertString(imcLock);
+    return TRUE;
 }
 
 /// @implemented
@@ -905,8 +1122,114 @@ CIMEUIWindowHandler::ImeUIMsImeHandler(HWND hWnd, UINT 
uMsg, WPARAM wParam, LPAR
     return 0;
 }
 
+/// @implemented
+HRESULT CALLBACK
+CIMEUIWindowHandler::ImeUIDelayedReconvertFuncCall(HWND hWnd)
+{
+    HIMC hIMC = (HIMC)::GetWindowLongPtrW(hWnd, UI_GWLP_HIMC);
+    CicIMCLock imcLock(hIMC);
+    if (FAILED(imcLock.m_hr))
+        return imcLock.m_hr;
+    CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
+    if (FAILED(imeContext.m_hr))
+        return imeContext.m_hr;
+    CicInputContext *pCicIC = imeContext.get().m_pCicIC;
+    if (pCicIC)
+        pCicIC->DelayedReconvertFuncCall(imcLock);
+    return S_OK;
+}
+
 /// @unimplemented
 LRESULT CALLBACK
+CIMEUIWindowHandler::ImeUINotifyHandler(HWND hWnd, UINT uMsg, WPARAM wParam, 
LPARAM lParam)
+{
+    HIMC hIMC = (HIMC)::GetWindowLongPtrW(hWnd, UI_GWLP_HIMC);
+    CicIMCLock imcLock(hIMC);
+    if (FAILED(imcLock.m_hr))
+        return imcLock.m_hr;
+    CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
+    if (FAILED(imeContext.m_hr))
+        return imeContext.m_hr;
+
+    CicInputContext *pCicIC = imeContext.get().m_pCicIC;
+    if (pCicIC)
+    {
+        switch (wParam)
+        {
+            case IMN_CLOSECANDIDATE:
+            {
+                pCicIC->m_bCandidateOpen = FALSE;
+                HWND hImeWnd = ::ImmGetDefaultIMEWnd(NULL);
+                if (::IsWindow(hImeWnd))
+                    ::PostMessage(hImeWnd, WM_IME_NOTIFY, 0x10, (LPARAM)hIMC);
+                break;
+            }
+            case IMN_OPENCANDIDATE:
+            {
+                pCicIC->m_bCandidateOpen = TRUE;
+                pCicIC->ClearPrevCandidatePos();
+                break;
+            }
+            case IMN_SETCANDIDATEPOS:
+            {
+                //FIXME
+                break;
+            }
+            case IMN_SETCOMPOSITIONFONT:
+            {
+                //FIXME
+                break;
+            }
+            case IMN_SETCOMPOSITIONWINDOW:
+            {
+                //FIXME
+                break;
+            }
+            case 0xF:
+            {
+                CIMEUIWindowHandler::ImeUIOnLayoutChange(lParam);
+                break;
+            }
+            case 0x10:
+            {
+                CIMEUIWindowHandler::ImeUIPrivateHandler(uMsg, 0x10, lParam);
+                break;
+            }
+            case 0x13:
+            {
+                CIMEUIWindowHandler::ImeUIOnLayoutChange(lParam);
+                break;
+            }
+            case 0x14:
+            {
+                //FIXME
+                break;
+            }
+            case 0x16:
+            {
+                ::SetTimer(hWnd, 2, 100, NULL);
+                break;
+            }
+            case 0x17:
+            {
+                return (LRESULT)hWnd;
+            }
+            case 0x10D:
+            {
+                //FIXME
+                break;
+            }
+            case 0x10E:
+                pCicIC->m_dwQueryPos = 0;
+                break;
+        }
+    }
+
+    return 0;
+}
+
+/// @implemented
+LRESULT CALLBACK
 CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, 
LPARAM lParam)
 {
     TLS *pTLS = TLS::GetTLS();
@@ -914,7 +1237,7 @@ CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT 
uMsg, WPARAM wParam, LPA
     {
         if (uMsg == WM_CREATE)
             return -1;
-        return DefWindowProcW(hWnd, uMsg, wParam, lParam);
+        return ::DefWindowProcW(hWnd, uMsg, wParam, lParam);
     }
 
     switch (uMsg)
@@ -954,7 +1277,7 @@ CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT 
uMsg, WPARAM wParam, LPA
                     {
                         pUI->m_pComp->OnImeCompositionUpdate(imcLock);
                         ::SetTimer(hWnd, 0, 10, NULL);
-                        //FIXME
+                        pUI->m_pComp->m_bInComposition = TRUE;
                     }
                     break;
                 }
@@ -973,8 +1296,24 @@ CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT 
uMsg, WPARAM wParam, LPA
                 }
                 case WM_TIMER:
                 {
-                    //FIXME
-                    ::KillTimer(hWnd, wParam);
+                    switch (wParam)
+                    {
+                        case 0:
+                            ::KillTimer(hWnd, wParam);
+                            pUI->m_pComp->m_bInComposition = FALSE;
+                            
pUI->m_pComp->OnImeNotifySetCompositionWindow(imcLock);
+                            break;
+                        case 1:
+                            ::KillTimer(hWnd, wParam);
+                            pUI->m_pComp->OnImeSetContextAfter(imcLock);
+                            break;
+                        case 2:
+                            ::KillTimer(hWnd, wParam);
+                            
CIMEUIWindowHandler::ImeUIDelayedReconvertFuncCall(hWnd);
+                            break;
+                        default:
+                            break;
+                    }
                     break;
                 }
                 case WM_IME_NOTIFY:
@@ -991,7 +1330,7 @@ CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT 
uMsg, WPARAM wParam, LPA
         {
             if (IsMsImeMessage(uMsg))
                 return CIMEUIWindowHandler::ImeUIMsImeHandler(hWnd, uMsg, 
wParam, lParam);
-            return DefWindowProcW(hWnd, uMsg, wParam, lParam);
+            return ::DefWindowProcW(hWnd, uMsg, wParam, lParam);
         }
     }
 
diff --git a/dll/ime/msctfime/ui.h b/dll/ime/msctfime/ui.h
index 8d416312a72..72dd14c7761 100644
--- a/dll/ime/msctfime/ui.h
+++ b/dll/ime/msctfime/ui.h
@@ -175,11 +175,15 @@ public:
 
     HRESULT UpdateShowCompWndFlag(CicIMCLock& imcLock, DWORD *pdwCompStrLen);
     HRESULT UpdateFont(CicIMCLock& imcLock);
+    HRESULT UpdateCompositionRect(CicIMCLock& imcLock);
     LPWSTR GetCompStrBuffer(INT cchStr);
+    INT GetLevelFromIMC(CicIMCLock& imcLock);
 
     void OnImeStartComposition(CicIMCLock& imcLock, HWND hUIWnd);
     HRESULT OnImeCompositionUpdate(CicIMCLock& imcLock);
     HRESULT OnImeEndComposition();
+    HRESULT OnImeNotifySetCompositionWindow(CicIMCLock& imcLock);
+    HRESULT OnImeSetContextAfter(CicIMCLock& imcLock);
     void OnImeSetContext(CicIMCLock& imcLock, HWND hUIWnd, WPARAM wParam, 
LPARAM lParam);
     void OnPaintTheme(WPARAM wParam);
     void OnTimer(HWND hWnd);
diff --git a/sdk/lib/cicero/ciccaret.h b/sdk/lib/cicero/ciccaret.h
index 09044ee4884..503cd58049d 100644
--- a/sdk/lib/cicero/ciccaret.h
+++ b/sdk/lib/cicero/ciccaret.h
@@ -21,6 +21,7 @@ public:
     enum { TIMER_ID = 0x4F83AF91 };
     CicCaret();
     virtual ~CicCaret();
+    operator HWND() const { return m_hWnd; }
 
     void CreateCaret(HWND hWnd, SIZE size);
     void DestroyCaret();

Reply via email to