mirror of
https://github.com/reactos/reactos.git
synced 2024-06-01 02:01:57 +00:00
[MSCTFIME][CICERO] Half-implement CIMEUIWindowHandler (#6521)
Supporting TIPs... JIRA issue: CORE-19360 - Add implementation to CIMEUIWindowHandler class.
This commit is contained in:
parent
353edbd3f4
commit
69b08be0e0
|
@ -231,7 +231,7 @@ CicBridge::SelectEx(
|
||||||
if (fSelect)
|
if (fSelect)
|
||||||
{
|
{
|
||||||
if (pCicIC)
|
if (pCicIC)
|
||||||
pCicIC->m_dwUnknown6[1] &= ~1;
|
pCicIC->m_bCandidateOpen = FALSE;
|
||||||
if (imcLock.get().fOpen)
|
if (imcLock.get().fOpen)
|
||||||
OnSetOpenStatus(pTLS, pThreadMgr, imcLock, pCicIC);
|
OnSetOpenStatus(pTLS, pThreadMgr, imcLock, pCicIC);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,6 @@ CicInputContext::CicInputContext(
|
||||||
_In_ HIMC hIMC)
|
_In_ HIMC hIMC)
|
||||||
{
|
{
|
||||||
m_hIMC = hIMC;
|
m_hIMC = hIMC;
|
||||||
m_guid = GUID_NULL;
|
|
||||||
m_dwQueryPos = 0;
|
m_dwQueryPos = 0;
|
||||||
m_cRefs = 1;
|
m_cRefs = 1;
|
||||||
}
|
}
|
||||||
|
@ -266,18 +265,44 @@ HRESULT CicInputContext::EscbCompComplete(CicIMCLock& imcLock)
|
||||||
return E_NOTIMPL;
|
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
|
/// @unimplemented
|
||||||
HRESULT
|
HRESULT
|
||||||
CicInputContext::SetupReconvertString(
|
CicInputContext::SetupReconvertString(
|
||||||
CicIMCLock& imcLock,
|
CicIMCLock& imcLock,
|
||||||
ITfThreadMgr_P *pThreadMgr,
|
ITfThreadMgr_P *pThreadMgr,
|
||||||
UINT uCodePage,
|
UINT uCodePage,
|
||||||
DWORD dwUnknown61,
|
UINT uMsg,
|
||||||
BOOL bUndo)
|
BOOL bUndo)
|
||||||
{
|
{
|
||||||
return E_NOTIMPL;
|
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
|
/// @unimplemented
|
||||||
HRESULT CicInputContext::EndReconvertString(CicIMCLock& imcLock)
|
HRESULT CicInputContext::EndReconvertString(CicIMCLock& imcLock)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "sinks.h"
|
#include "sinks.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
class CInputContextOwnerCallBack;
|
class CInputContextOwnerCallBack;
|
||||||
class CInputContextOwner;
|
class CInputContextOwner;
|
||||||
|
@ -44,8 +45,10 @@ public:
|
||||||
DWORD m_dwUnknown4[2];
|
DWORD m_dwUnknown4[2];
|
||||||
DWORD m_dwQueryPos;
|
DWORD m_dwQueryPos;
|
||||||
DWORD m_dwUnknown5;
|
DWORD m_dwUnknown5;
|
||||||
GUID m_guid;
|
CModeBias m_ModeBias;
|
||||||
DWORD m_dwUnknown6[11];
|
DWORD m_dwUnknown6;
|
||||||
|
BOOL m_bCandidateOpen;
|
||||||
|
DWORD m_dwUnknown6_5[9];
|
||||||
BOOL m_bSelecting;
|
BOOL m_bSelecting;
|
||||||
BOOL m_bReconverting;
|
BOOL m_bReconverting;
|
||||||
LONG m_cCompLocks;
|
LONG m_cCompLocks;
|
||||||
|
@ -53,7 +56,10 @@ public:
|
||||||
WORD m_cGuidAtoms;
|
WORD m_cGuidAtoms;
|
||||||
WORD m_padding;
|
WORD m_padding;
|
||||||
DWORD m_adwGuidAtoms[256];
|
DWORD m_adwGuidAtoms[256];
|
||||||
DWORD m_dwUnknown8[17];
|
DWORD m_dwUnknown8;
|
||||||
|
RECT m_rcCandidate1;
|
||||||
|
CANDIDATEFORM m_CandForm;
|
||||||
|
RECT m_rcCandidate2;
|
||||||
TfClientId m_clientId;
|
TfClientId m_clientId;
|
||||||
DWORD m_dwUnknown9;
|
DWORD m_dwUnknown9;
|
||||||
|
|
||||||
|
@ -96,7 +102,15 @@ public:
|
||||||
CicIMCLock& imcLock,
|
CicIMCLock& imcLock,
|
||||||
ITfThreadMgr_P *pThreadMgr,
|
ITfThreadMgr_P *pThreadMgr,
|
||||||
UINT uCodePage,
|
UINT uCodePage,
|
||||||
DWORD dwUnknown61,
|
UINT uMsg,
|
||||||
BOOL bUndo);
|
BOOL bUndo);
|
||||||
|
HRESULT MsImeMouseHandler(
|
||||||
|
DWORD dwUnknown58,
|
||||||
|
DWORD dwUnknown59,
|
||||||
|
UINT keys,
|
||||||
|
CicIMCLock& imcLock);
|
||||||
|
|
||||||
HRESULT EndReconvertString(CicIMCLock& imcLock);
|
HRESULT EndReconvertString(CicIMCLock& imcLock);
|
||||||
|
HRESULT DelayedReconvertFuncCall(CicIMCLock& imcLock);
|
||||||
|
void ClearPrevCandidatePos();
|
||||||
};
|
};
|
||||||
|
|
|
@ -50,6 +50,8 @@ class CModeBias
|
||||||
public:
|
public:
|
||||||
GUID m_guid;
|
GUID m_guid;
|
||||||
|
|
||||||
|
CModeBias() : m_guid(GUID_NULL) { }
|
||||||
|
|
||||||
GUID ConvertModeBias(LONG bias);
|
GUID ConvertModeBias(LONG bias);
|
||||||
LONG ConvertModeBias(REFGUID guid);
|
LONG ConvertModeBias(REFGUID guid);
|
||||||
void SetModeBias(REFGUID rguid);
|
void SetModeBias(REFGUID rguid);
|
||||||
|
|
|
@ -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_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_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_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
|
#define GUID_MODEBIAS_NONE GUID_NULL
|
||||||
|
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
|
|
|
@ -784,6 +784,88 @@ UIComposition::CompWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
return 0;
|
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
|
// For GetWindowLongPtr/SetWindowLongPtr
|
||||||
|
@ -853,31 +935,166 @@ void UI::OnImeSetContext(CicIMCLock& imcLock, WPARAM wParam, LPARAM lParam)
|
||||||
struct CIMEUIWindowHandler
|
struct CIMEUIWindowHandler
|
||||||
{
|
{
|
||||||
static LRESULT CALLBACK ImeUIMsImeHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
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 ImeUIMsImeModeBiasHandler(HWND hWnd, WPARAM wParam, LPARAM lParam);
|
||||||
static LRESULT CALLBACK ImeUIMsImeReconvertRequest(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 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
|
/// @implemented
|
||||||
LRESULT CALLBACK
|
HRESULT CALLBACK
|
||||||
CIMEUIWindowHandler::ImeUIMsImeMouseHandler(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
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
|
LRESULT CALLBACK
|
||||||
CIMEUIWindowHandler::ImeUIMsImeModeBiasHandler(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
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
|
LRESULT CALLBACK
|
||||||
CIMEUIWindowHandler::ImeUIMsImeReconvertRequest(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
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
|
/// @implemented
|
||||||
|
@ -905,8 +1122,114 @@ CIMEUIWindowHandler::ImeUIMsImeHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
|
||||||
return 0;
|
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
|
/// @unimplemented
|
||||||
LRESULT CALLBACK
|
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)
|
CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
TLS *pTLS = TLS::GetTLS();
|
TLS *pTLS = TLS::GetTLS();
|
||||||
|
@ -914,7 +1237,7 @@ CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
|
||||||
{
|
{
|
||||||
if (uMsg == WM_CREATE)
|
if (uMsg == WM_CREATE)
|
||||||
return -1;
|
return -1;
|
||||||
return DefWindowProcW(hWnd, uMsg, wParam, lParam);
|
return ::DefWindowProcW(hWnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
|
@ -954,7 +1277,7 @@ CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
|
||||||
{
|
{
|
||||||
pUI->m_pComp->OnImeCompositionUpdate(imcLock);
|
pUI->m_pComp->OnImeCompositionUpdate(imcLock);
|
||||||
::SetTimer(hWnd, 0, 10, NULL);
|
::SetTimer(hWnd, 0, 10, NULL);
|
||||||
//FIXME
|
pUI->m_pComp->m_bInComposition = TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -973,8 +1296,24 @@ CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
|
||||||
}
|
}
|
||||||
case WM_TIMER:
|
case WM_TIMER:
|
||||||
{
|
{
|
||||||
//FIXME
|
switch (wParam)
|
||||||
::KillTimer(hWnd, 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;
|
break;
|
||||||
}
|
}
|
||||||
case WM_IME_NOTIFY:
|
case WM_IME_NOTIFY:
|
||||||
|
@ -991,7 +1330,7 @@ CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
|
||||||
{
|
{
|
||||||
if (IsMsImeMessage(uMsg))
|
if (IsMsImeMessage(uMsg))
|
||||||
return CIMEUIWindowHandler::ImeUIMsImeHandler(hWnd, uMsg, wParam, lParam);
|
return CIMEUIWindowHandler::ImeUIMsImeHandler(hWnd, uMsg, wParam, lParam);
|
||||||
return DefWindowProcW(hWnd, uMsg, wParam, lParam);
|
return ::DefWindowProcW(hWnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -175,11 +175,15 @@ public:
|
||||||
|
|
||||||
HRESULT UpdateShowCompWndFlag(CicIMCLock& imcLock, DWORD *pdwCompStrLen);
|
HRESULT UpdateShowCompWndFlag(CicIMCLock& imcLock, DWORD *pdwCompStrLen);
|
||||||
HRESULT UpdateFont(CicIMCLock& imcLock);
|
HRESULT UpdateFont(CicIMCLock& imcLock);
|
||||||
|
HRESULT UpdateCompositionRect(CicIMCLock& imcLock);
|
||||||
LPWSTR GetCompStrBuffer(INT cchStr);
|
LPWSTR GetCompStrBuffer(INT cchStr);
|
||||||
|
INT GetLevelFromIMC(CicIMCLock& imcLock);
|
||||||
|
|
||||||
void OnImeStartComposition(CicIMCLock& imcLock, HWND hUIWnd);
|
void OnImeStartComposition(CicIMCLock& imcLock, HWND hUIWnd);
|
||||||
HRESULT OnImeCompositionUpdate(CicIMCLock& imcLock);
|
HRESULT OnImeCompositionUpdate(CicIMCLock& imcLock);
|
||||||
HRESULT OnImeEndComposition();
|
HRESULT OnImeEndComposition();
|
||||||
|
HRESULT OnImeNotifySetCompositionWindow(CicIMCLock& imcLock);
|
||||||
|
HRESULT OnImeSetContextAfter(CicIMCLock& imcLock);
|
||||||
void OnImeSetContext(CicIMCLock& imcLock, HWND hUIWnd, WPARAM wParam, LPARAM lParam);
|
void OnImeSetContext(CicIMCLock& imcLock, HWND hUIWnd, WPARAM wParam, LPARAM lParam);
|
||||||
void OnPaintTheme(WPARAM wParam);
|
void OnPaintTheme(WPARAM wParam);
|
||||||
void OnTimer(HWND hWnd);
|
void OnTimer(HWND hWnd);
|
||||||
|
|
|
@ -21,6 +21,7 @@ public:
|
||||||
enum { TIMER_ID = 0x4F83AF91 };
|
enum { TIMER_ID = 0x4F83AF91 };
|
||||||
CicCaret();
|
CicCaret();
|
||||||
virtual ~CicCaret();
|
virtual ~CicCaret();
|
||||||
|
operator HWND() const { return m_hWnd; }
|
||||||
|
|
||||||
void CreateCaret(HWND hWnd, SIZE size);
|
void CreateCaret(HWND hWnd, SIZE size);
|
||||||
void DestroyCaret();
|
void DestroyCaret();
|
||||||
|
|
Loading…
Reference in a new issue