mirror of
https://github.com/reactos/reactos.git
synced 2025-07-30 14:42:11 +00:00
[MSCTFIME] Add UIComposition Part 2 (#6520)
Supporting TIPs... JIRA issue: CORE-19360 - Add implementation to UIComposition class.
This commit is contained in:
parent
14d3b53cc6
commit
353edbd3f4
6 changed files with 504 additions and 32 deletions
|
@ -208,3 +208,28 @@ LONG CModeBias::ConvertModeBias(REFGUID guid)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
|
||||||
|
/// East-Asian language?
|
||||||
|
/// @implemented
|
||||||
|
BOOL IsEALang(VOID)
|
||||||
|
{
|
||||||
|
TLS *pTLS = TLS::GetTLS();
|
||||||
|
if (!pTLS || !pTLS->m_pProfile)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
LANGID LangID;
|
||||||
|
pTLS->m_pProfile->GetLangId(&LangID);
|
||||||
|
|
||||||
|
switch (PRIMARYLANGID(LangID))
|
||||||
|
{
|
||||||
|
case LANG_CHINESE:
|
||||||
|
case LANG_JAPANESE:
|
||||||
|
case LANG_KOREAN:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -54,3 +54,7 @@ public:
|
||||||
LONG ConvertModeBias(REFGUID guid);
|
LONG ConvertModeBias(REFGUID guid);
|
||||||
void SetModeBias(REFGUID rguid);
|
void SetModeBias(REFGUID rguid);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
|
||||||
|
BOOL IsEALang(VOID);
|
||||||
|
|
|
@ -54,3 +54,25 @@ BOOL TLS::InternalDestroyTLS()
|
||||||
::TlsSetValue(s_dwTlsIndex, NULL);
|
::TlsSetValue(s_dwTlsIndex, NULL);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
BOOL TLS::NonEACompositionEnabled()
|
||||||
|
{
|
||||||
|
if (!m_NonEAComposition)
|
||||||
|
{
|
||||||
|
DWORD dwValue = 1;
|
||||||
|
|
||||||
|
CicRegKey regKey;
|
||||||
|
LSTATUS error = regKey.Open(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\CTF\\CUAS"));
|
||||||
|
if (error == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
error = regKey.QueryDword(TEXT("NonEAComposition"), &dwValue);
|
||||||
|
if (error != ERROR_SUCCESS)
|
||||||
|
dwValue = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_NonEAComposition = dwValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (m_NonEAComposition == 2);
|
||||||
|
}
|
||||||
|
|
|
@ -71,4 +71,6 @@ public:
|
||||||
|
|
||||||
static TLS* InternalAllocateTLS();
|
static TLS* InternalAllocateTLS();
|
||||||
static BOOL InternalDestroyTLS();
|
static BOOL InternalDestroyTLS();
|
||||||
|
|
||||||
|
BOOL NonEACompositionEnabled();
|
||||||
};
|
};
|
||||||
|
|
|
@ -287,8 +287,8 @@ void CDefCompFrameWindow::SetCompStrRect(INT nWidth, INT nHeight, BOOL bShow)
|
||||||
|
|
||||||
Show(bShow);
|
Show(bShow);
|
||||||
|
|
||||||
::MoveWindow(m_hwndDefCompFrame, GripperWidth + 2, 7, nWidth, nHeight, TRUE);
|
::MoveWindow(m_hwndCompStr, GripperWidth + 2, 7, nWidth, nHeight, TRUE);
|
||||||
::ShowWindow(m_hwndDefCompFrame, (bShow ? SW_SHOWNOACTIVATE : SW_HIDE));
|
::ShowWindow(m_hwndCompStr, (bShow ? SW_SHOWNOACTIVATE : SW_HIDE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @implemented
|
/// @implemented
|
||||||
|
@ -342,11 +342,11 @@ STDMETHODIMP_(void) CDefCompFrameWindow::OnCreate(HWND hWnd)
|
||||||
/// @implemented
|
/// @implemented
|
||||||
STDMETHODIMP_(BOOL) CDefCompFrameWindow::OnSetCursor(UINT uMsg, LONG x, LONG y)
|
STDMETHODIMP_(BOOL) CDefCompFrameWindow::OnSetCursor(UINT uMsg, LONG x, LONG y)
|
||||||
{
|
{
|
||||||
if (!::IsWindow(m_hwndDefCompFrame))
|
if (!::IsWindow(m_hwndCompStr))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
RECT rc;
|
RECT rc;
|
||||||
::GetWindowRect(m_hwndDefCompFrame, &rc);
|
::GetWindowRect(m_hwndCompStr, &rc);
|
||||||
MyScreenToClient(NULL, &rc);
|
MyScreenToClient(NULL, &rc);
|
||||||
POINT pt = { x, y };
|
POINT pt = { x, y };
|
||||||
return ::PtInRect(&rc, pt);
|
return ::PtInRect(&rc, pt);
|
||||||
|
@ -365,15 +365,15 @@ CDefCompFrameWindow::OnWindowPosChanged(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
|
||||||
/// @implemented
|
/// @implemented
|
||||||
STDMETHODIMP_(void) CDefCompFrameWindow::HandleMouseMsg(UINT uMsg, LONG x, LONG y)
|
STDMETHODIMP_(void) CDefCompFrameWindow::HandleMouseMsg(UINT uMsg, LONG x, LONG y)
|
||||||
{
|
{
|
||||||
if (::IsWindow(m_hwndDefCompFrame))
|
if (::IsWindow(m_hwndCompStr))
|
||||||
{
|
{
|
||||||
RECT rc;
|
RECT rc;
|
||||||
::GetWindowRect(m_hwndDefCompFrame, &rc);
|
::GetWindowRect(m_hwndCompStr, &rc);
|
||||||
MyScreenToClient(NULL, &rc);
|
MyScreenToClient(NULL, &rc);
|
||||||
|
|
||||||
POINT pt = { x, y };
|
POINT pt = { x, y };
|
||||||
if (::PtInRect(&rc, pt))
|
if (::PtInRect(&rc, pt))
|
||||||
::SendMessage(m_hwndDefCompFrame, 0x7E8, 0, 0);
|
::SendMessage(m_hwndCompStr, 0x7E8, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
CUIFWindow::HandleMouseMsg(uMsg, x, y);
|
CUIFWindow::HandleMouseMsg(uMsg, x, y);
|
||||||
|
@ -381,10 +381,361 @@ STDMETHODIMP_(void) CDefCompFrameWindow::HandleMouseMsg(UINT uMsg, LONG x, LONG
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
POLYTEXTW *CPolyText::GetPolyAt(INT iItem)
|
||||||
|
{
|
||||||
|
return &m_PolyTextArray[iItem];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
HRESULT CPolyText::ShiftPolyText(INT xDelta, INT yDelta)
|
||||||
|
{
|
||||||
|
for (size_t iItem = 0; iItem < m_PolyTextArray.size(); ++iItem)
|
||||||
|
{
|
||||||
|
POLYTEXTW *pPolyText = &m_PolyTextArray[iItem];
|
||||||
|
pPolyText->x += xDelta;
|
||||||
|
pPolyText->y += yDelta;
|
||||||
|
::OffsetRect((LPRECT)&pPolyText->rcl, xDelta, yDelta);
|
||||||
|
}
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
HRESULT CPolyText::RemoveLastLine(BOOL bHorizontal)
|
||||||
|
{
|
||||||
|
size_t iItem, cItems = m_PolyTextArray.size();
|
||||||
|
if (!cItems)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
POLYTEXTW *pData1 = &m_PolyTextArray[cItems - 1];
|
||||||
|
|
||||||
|
for (iItem = 0; iItem < cItems; ++iItem)
|
||||||
|
{
|
||||||
|
POLYTEXTW *pData2 = &m_PolyTextArray[iItem];
|
||||||
|
if (bHorizontal)
|
||||||
|
{
|
||||||
|
if (pData1->x == pData2->x)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (pData1->y == pData2->y)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iItem >= cItems)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
m_PolyTextArray.Remove(iItem, cItems - iItem);
|
||||||
|
m_ValueArray.Remove(iItem, cItems - iItem);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
void CPolyText::RemoveAll()
|
||||||
|
{
|
||||||
|
m_PolyTextArray.clear();
|
||||||
|
m_ValueArray.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
void COMPWND::_ClientToScreen(LPRECT prc)
|
||||||
|
{
|
||||||
|
::ClientToScreen(m_hWnd, (LPPOINT)prc);
|
||||||
|
::ClientToScreen(m_hWnd, (LPPOINT)&prc->right);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
|
||||||
// For GetWindowLongPtr/SetWindowLongPtr
|
// For GetWindowLongPtr/SetWindowLongPtr
|
||||||
#define UIGWLP_HIMC 0
|
#define UICOMP_GWLP_INDEX 0
|
||||||
#define UIGWLP_UI sizeof(HIMC)
|
#define UICOMP_GWLP_SIZE (UICOMP_GWLP_INDEX + sizeof(INT))
|
||||||
#define UIGWLP_SIZE (UIGWLP_UI + sizeof(UI*))
|
|
||||||
|
/// @unimplemented
|
||||||
|
UIComposition::UIComposition(HWND hwndParent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
UIComposition::~UIComposition()
|
||||||
|
{
|
||||||
|
DestroyCompositionWindow();
|
||||||
|
|
||||||
|
if (m_hFont1)
|
||||||
|
{
|
||||||
|
::DeleteObject(m_hFont1);
|
||||||
|
m_hFont1 = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_hFont2)
|
||||||
|
{
|
||||||
|
::DeleteObject(m_hFont2);
|
||||||
|
m_hFont2 = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_strCompStr)
|
||||||
|
{
|
||||||
|
cicMemFree(m_strCompStr);
|
||||||
|
m_strCompStr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_cchCompStr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @implemented
|
||||||
|
BOOL UIComposition::SendMessageToUI(CicIMCLock& imcLock, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
HWND hImeWnd = ImmGetDefaultIMEWnd(0);
|
||||||
|
if (!::IsWindow(hImeWnd))
|
||||||
|
return TRUE;
|
||||||
|
TLS *pTLS = TLS::GetTLS();
|
||||||
|
LRESULT ret;
|
||||||
|
if (pTLS && pTLS->m_cWnds > 1)
|
||||||
|
ret = ::SendMessage(imcLock.get().hWnd, WM_IME_NOTIFY, wParam, lParam);
|
||||||
|
else
|
||||||
|
ret = ::SendMessage(hImeWnd, WM_IME_NOTIFY, wParam, lParam);
|
||||||
|
return !ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
HRESULT UIComposition::CreateDefFrameWnd(HWND hwndParent, HIMC hIMC)
|
||||||
|
{
|
||||||
|
if (!m_pDefCompFrameWindow)
|
||||||
|
{
|
||||||
|
m_pDefCompFrameWindow = new(cicNoThrow) CDefCompFrameWindow(hIMC, 0x800000A4);
|
||||||
|
if (!m_pDefCompFrameWindow)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
if (!m_pDefCompFrameWindow->Initialize())
|
||||||
|
{
|
||||||
|
delete m_pDefCompFrameWindow;
|
||||||
|
m_pDefCompFrameWindow = NULL;
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pDefCompFrameWindow->Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pDefCompFrameWindow->CreateWnd(hwndParent);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
HRESULT UIComposition::CreateCompButtonWnd(HWND hwndParent, HIMC hIMC)
|
||||||
|
{
|
||||||
|
TLS *pTLS = TLS::GetTLS();
|
||||||
|
if (!pTLS || !pTLS->NonEACompositionEnabled())
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
|
if (IsEALang())
|
||||||
|
{
|
||||||
|
if (m_pCompButtonFrameWindow)
|
||||||
|
{
|
||||||
|
delete m_pCompButtonFrameWindow;
|
||||||
|
m_pCompButtonFrameWindow = NULL;
|
||||||
|
}
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_pCompButtonFrameWindow)
|
||||||
|
{
|
||||||
|
m_pCompButtonFrameWindow = new(cicNoThrow) CCompButtonFrameWindow(hIMC, 0x800000B4);
|
||||||
|
if (!m_pCompButtonFrameWindow)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
if (!m_pCompButtonFrameWindow->Initialize())
|
||||||
|
{
|
||||||
|
if (m_pCompButtonFrameWindow)
|
||||||
|
{
|
||||||
|
delete m_pCompButtonFrameWindow;
|
||||||
|
m_pCompButtonFrameWindow = NULL;
|
||||||
|
}
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pCompButtonFrameWindow->Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pCompButtonFrameWindow->CreateWnd(hwndParent);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
HRESULT UIComposition::CreateCompositionWindow(CicIMCLock& imcLock, HWND hwndParent)
|
||||||
|
{
|
||||||
|
if (FAILED(imcLock.m_hr))
|
||||||
|
return imcLock.m_hr;
|
||||||
|
|
||||||
|
if (!::IsWindow(hwndParent) || m_bHasCompWnd)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
for (INT iCompStr = 0; iCompStr < 3; ++iCompStr)
|
||||||
|
{
|
||||||
|
DWORD style = WS_POPUP | WS_DISABLED;
|
||||||
|
HWND hwndCompStr = ::CreateWindowExW(0, L"MSCTFIME Composition", NULL, style,
|
||||||
|
0, 0, 0, 0, hwndParent, NULL, g_hInst, NULL);
|
||||||
|
m_CompStrs[iCompStr].m_hWnd = hwndCompStr;
|
||||||
|
::SetWindowLongPtrW(hwndCompStr, GWLP_USERDATA, (LONG_PTR)this);
|
||||||
|
::SetWindowLongPtrW(hwndCompStr, UICOMP_GWLP_INDEX, iCompStr);
|
||||||
|
m_CompStrs[iCompStr].m_Caret.CreateCaret(hwndCompStr, m_CaretSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT hr = CreateCompButtonWnd(hwndParent, imcLock.m_hIMC);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
DestroyCompositionWindow();
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = CreateDefFrameWnd(hwndParent, imcLock.m_hIMC);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
DestroyCompositionWindow();
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD style = WS_CHILD | WS_DISABLED;
|
||||||
|
HWND hwndCompStr = ::CreateWindowExW(WS_EX_CLIENTEDGE, L"MSCTFIME Composition", NULL, style,
|
||||||
|
0, 0, 0, 0, *m_pDefCompFrameWindow, NULL, g_hInst, NULL);
|
||||||
|
if (!hwndCompStr)
|
||||||
|
{
|
||||||
|
DestroyCompositionWindow();
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_CompStrs[3].m_hWnd = hwndCompStr;
|
||||||
|
m_pDefCompFrameWindow->m_hwndCompStr = hwndCompStr;
|
||||||
|
::SetWindowLongPtrW(hwndCompStr, GWLP_USERDATA, (LONG_PTR)this);
|
||||||
|
::SetWindowLongPtrW(hwndCompStr, UICOMP_GWLP_INDEX, -1);
|
||||||
|
m_CompStrs[3].m_Caret.CreateCaret(hwndCompStr, m_CaretSize);
|
||||||
|
m_bHasCompWnd = TRUE;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
HRESULT UIComposition::DestroyCompositionWindow()
|
||||||
|
{
|
||||||
|
for (INT i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
COMPWND *pCompStr = &m_CompStrs[i];
|
||||||
|
pCompStr->m_Caret.DestroyCaret();
|
||||||
|
if (::IsWindow(pCompStr->m_hWnd))
|
||||||
|
{
|
||||||
|
DestroyWindow(pCompStr->m_hWnd);
|
||||||
|
pCompStr->m_PolyText.RemoveAll();
|
||||||
|
}
|
||||||
|
pCompStr->m_hWnd = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_pCompButtonFrameWindow)
|
||||||
|
{
|
||||||
|
::DestroyWindow(*m_pCompButtonFrameWindow);
|
||||||
|
delete m_pCompButtonFrameWindow;
|
||||||
|
m_pCompButtonFrameWindow = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_pDefCompFrameWindow)
|
||||||
|
{
|
||||||
|
::DestroyWindow(*m_pDefCompFrameWindow);
|
||||||
|
delete m_pDefCompFrameWindow;
|
||||||
|
m_pDefCompFrameWindow = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @implemented
|
||||||
|
BOOL UIComposition::InquireImeUIWndState(CicIMCLock& imcLock)
|
||||||
|
{
|
||||||
|
BOOL bValue = FALSE;
|
||||||
|
UIComposition::SendMessageToUI(imcLock, 0x11u, (LPARAM)&bValue);
|
||||||
|
return bValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
HRESULT UIComposition::UpdateShowCompWndFlag(CicIMCLock& imcLock, DWORD *pdwCompStrLen)
|
||||||
|
{
|
||||||
|
if (FAILED(imcLock.m_hr))
|
||||||
|
return imcLock.m_hr;
|
||||||
|
if (!::IsWindow(imcLock.get().hWnd))
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
CicIMCCLock<COMPOSITIONSTRING> compStr(imcLock.get().hCompStr);
|
||||||
|
if (FAILED(compStr.m_hr))
|
||||||
|
return compStr.m_hr;
|
||||||
|
|
||||||
|
if ((m_dwUnknown56[0] & 0x80000000) && compStr.get().dwCompStrLen)
|
||||||
|
m_bHasCompStr = TRUE;
|
||||||
|
else
|
||||||
|
m_bHasCompStr = FALSE;
|
||||||
|
|
||||||
|
if (pdwCompStrLen)
|
||||||
|
*pdwCompStrLen = compStr.get().dwCompStrLen;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
HRESULT UIComposition::UpdateFont(CicIMCLock& imcLock)
|
||||||
|
{
|
||||||
|
if (FAILED(imcLock.m_hr))
|
||||||
|
return imcLock.m_hr;
|
||||||
|
|
||||||
|
if (m_hFont1)
|
||||||
|
::DeleteObject(m_hFont1);
|
||||||
|
if (m_hFont2)
|
||||||
|
::DeleteObject(m_hFont2);
|
||||||
|
|
||||||
|
LOGFONTW lf = imcLock.get().lfFont.W;
|
||||||
|
m_hFont2 = ::CreateFontIndirectW(&lf);
|
||||||
|
|
||||||
|
lf.lfEscapement = 0;
|
||||||
|
lf.lfOrientation = 0;
|
||||||
|
BOOL bVertical = (lf.lfFaceName[0] == L'@');
|
||||||
|
if (bVertical)
|
||||||
|
{
|
||||||
|
MoveMemory(lf.lfFaceName, &lf.lfFaceName[1], sizeof(lf.lfFaceName) - sizeof(WCHAR));
|
||||||
|
lf.lfFaceName[_countof(lf.lfFaceName) - 1] = UNICODE_NULL;
|
||||||
|
}
|
||||||
|
m_hFont1 = ::CreateFontIndirectW(&lf);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @implemented
|
||||||
|
void UIComposition::OnTimer(HWND hWnd)
|
||||||
|
{
|
||||||
|
INT iCompStr = (INT)::GetWindowLongPtrW(hWnd, UICOMP_GWLP_INDEX);
|
||||||
|
if (iCompStr == -1)
|
||||||
|
m_CompStrs[3].m_Caret.OnTimer();
|
||||||
|
else
|
||||||
|
m_CompStrs[iCompStr].m_Caret.OnTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
BOOL UIComposition::GetImeUIWndTextExtent(CicIMCLock& imcLock, LPARAM lParam)
|
||||||
|
{
|
||||||
|
return !UIComposition::SendMessageToUI(imcLock, 0x14, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @implemented
|
||||||
|
LPWSTR UIComposition::GetCompStrBuffer(INT cchStr)
|
||||||
|
{
|
||||||
|
if (!m_strCompStr)
|
||||||
|
{
|
||||||
|
m_strCompStr = (LPWSTR)cicMemAllocClear((cchStr + 1) * sizeof(WCHAR));
|
||||||
|
m_cchCompStr = cchStr;
|
||||||
|
}
|
||||||
|
if (m_cchCompStr < cchStr)
|
||||||
|
{
|
||||||
|
m_strCompStr = (LPWSTR)cicMemReAlloc(m_strCompStr, (cchStr + 1) * sizeof(WCHAR));
|
||||||
|
m_cchCompStr = cchStr;
|
||||||
|
}
|
||||||
|
return m_strCompStr;
|
||||||
|
}
|
||||||
|
|
||||||
/// @unimplemented
|
/// @unimplemented
|
||||||
void UIComposition::OnImeStartComposition(CicIMCLock& imcLock, HWND hUIWnd)
|
void UIComposition::OnImeStartComposition(CicIMCLock& imcLock, HWND hUIWnd)
|
||||||
|
@ -392,16 +743,18 @@ void UIComposition::OnImeStartComposition(CicIMCLock& imcLock, HWND hUIWnd)
|
||||||
//FIXME
|
//FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @unimplemented
|
/// @implemented
|
||||||
void UIComposition::OnImeCompositionUpdate(CicIMCLock& imcLock)
|
HRESULT UIComposition::OnImeCompositionUpdate(CicIMCLock& imcLock)
|
||||||
{
|
{
|
||||||
//FIXME
|
m_dwUnknown56[0] |= 0x8000;
|
||||||
|
return UIComposition::UpdateShowCompWndFlag(imcLock, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @unimplemented
|
/// @unimplemented
|
||||||
void UIComposition::OnImeEndComposition()
|
HRESULT UIComposition::OnImeEndComposition()
|
||||||
{
|
{
|
||||||
//FIXME
|
m_dwUnknown56[0] = 0;
|
||||||
|
return DestroyCompositionWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @unimplemented
|
/// @unimplemented
|
||||||
|
@ -416,10 +769,10 @@ void UIComposition::OnPaintTheme(WPARAM wParam)
|
||||||
//FIXME
|
//FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @unimplemented
|
/// @implemented
|
||||||
void UIComposition::OnDestroy()
|
HRESULT UIComposition::OnDestroy()
|
||||||
{
|
{
|
||||||
//FIXME
|
return DestroyCompositionWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @unimplemented
|
/// @unimplemented
|
||||||
|
@ -433,6 +786,11 @@ UIComposition::CompWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
|
||||||
|
// For GetWindowLongPtr/SetWindowLongPtr
|
||||||
|
#define UI_GWLP_HIMC 0
|
||||||
|
#define UI_GWLP_UI sizeof(HIMC)
|
||||||
|
#define UI_GWLP_SIZE (UI_GWLP_UI + sizeof(UI*))
|
||||||
|
|
||||||
/// @implemented
|
/// @implemented
|
||||||
UI::UI(HWND hWnd) : m_hWnd(hWnd)
|
UI::UI(HWND hWnd) : m_hWnd(hWnd)
|
||||||
{
|
{
|
||||||
|
@ -447,11 +805,11 @@ UI::~UI()
|
||||||
/// @implemented
|
/// @implemented
|
||||||
HRESULT UI::_Create()
|
HRESULT UI::_Create()
|
||||||
{
|
{
|
||||||
m_pComp = new(cicNoThrow) UIComposition();
|
m_pComp = new(cicNoThrow) UIComposition(m_hWnd);
|
||||||
if (!m_pComp)
|
if (!m_pComp)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
::SetWindowLongPtrW(m_hWnd, UIGWLP_UI, (LONG_PTR)this);
|
::SetWindowLongPtrW(m_hWnd, UI_GWLP_UI, (LONG_PTR)this);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,13 +817,13 @@ HRESULT UI::_Create()
|
||||||
void UI::_Destroy()
|
void UI::_Destroy()
|
||||||
{
|
{
|
||||||
m_pComp->OnDestroy();
|
m_pComp->OnDestroy();
|
||||||
::SetWindowLongPtrW(m_hWnd, UIGWLP_UI, 0);
|
::SetWindowLongPtrW(m_hWnd, UI_GWLP_UI, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @implemented
|
/// @implemented
|
||||||
void UI::OnCreate(HWND hWnd)
|
void UI::OnCreate(HWND hWnd)
|
||||||
{
|
{
|
||||||
UI *pUI = (UI*)::GetWindowLongPtrW(hWnd, UIGWLP_UI);
|
UI *pUI = (UI*)::GetWindowLongPtrW(hWnd, UI_GWLP_UI);
|
||||||
if (pUI)
|
if (pUI)
|
||||||
return;
|
return;
|
||||||
pUI = new(cicNoThrow) UI(hWnd);
|
pUI = new(cicNoThrow) UI(hWnd);
|
||||||
|
@ -476,7 +834,7 @@ void UI::OnCreate(HWND hWnd)
|
||||||
/// @implemented
|
/// @implemented
|
||||||
void UI::OnDestroy(HWND hWnd)
|
void UI::OnDestroy(HWND hWnd)
|
||||||
{
|
{
|
||||||
UI *pUI = (UI*)::GetWindowLongPtrW(hWnd, UIGWLP_UI);
|
UI *pUI = (UI*)::GetWindowLongPtrW(hWnd, UI_GWLP_UI);
|
||||||
if (!pUI)
|
if (!pUI)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -580,8 +938,8 @@ CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
|
||||||
case WM_IME_SELECT:
|
case WM_IME_SELECT:
|
||||||
case WM_TIMER:
|
case WM_TIMER:
|
||||||
{
|
{
|
||||||
HIMC hIMC = (HIMC)GetWindowLongPtrW(hWnd, UIGWLP_HIMC);
|
HIMC hIMC = (HIMC)GetWindowLongPtrW(hWnd, UI_GWLP_HIMC);
|
||||||
UI* pUI = (UI*)GetWindowLongPtrW(hWnd, UIGWLP_UI);
|
UI* pUI = (UI*)GetWindowLongPtrW(hWnd, UI_GWLP_UI);
|
||||||
CicIMCLock imcLock(hIMC);
|
CicIMCLock imcLock(hIMC);
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
|
@ -664,7 +1022,7 @@ BOOL RegisterImeClass(VOID)
|
||||||
{
|
{
|
||||||
ZeroMemory(&wcx, sizeof(wcx));
|
ZeroMemory(&wcx, sizeof(wcx));
|
||||||
wcx.cbSize = sizeof(WNDCLASSEXW);
|
wcx.cbSize = sizeof(WNDCLASSEXW);
|
||||||
wcx.cbWndExtra = UIGWLP_SIZE;
|
wcx.cbWndExtra = UI_GWLP_SIZE;
|
||||||
wcx.hIcon = LoadIconW(0, (LPCWSTR)IDC_ARROW);
|
wcx.hIcon = LoadIconW(0, (LPCWSTR)IDC_ARROW);
|
||||||
wcx.hInstance = g_hInst;
|
wcx.hInstance = g_hInst;
|
||||||
wcx.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW);
|
wcx.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW);
|
||||||
|
@ -680,7 +1038,7 @@ BOOL RegisterImeClass(VOID)
|
||||||
{
|
{
|
||||||
ZeroMemory(&wcx, sizeof(wcx));
|
ZeroMemory(&wcx, sizeof(wcx));
|
||||||
wcx.cbSize = sizeof(WNDCLASSEXW);
|
wcx.cbSize = sizeof(WNDCLASSEXW);
|
||||||
wcx.cbWndExtra = sizeof(DWORD);
|
wcx.cbWndExtra = UICOMP_GWLP_SIZE;
|
||||||
wcx.hIcon = NULL;
|
wcx.hIcon = NULL;
|
||||||
wcx.hInstance = g_hInst;
|
wcx.hInstance = g_hInst;
|
||||||
wcx.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_IBEAM);
|
wcx.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_IBEAM);
|
||||||
|
|
|
@ -94,7 +94,7 @@ public:
|
||||||
class CDefCompFrameWindow : public CCompFrameWindow
|
class CDefCompFrameWindow : public CCompFrameWindow
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
HWND m_hwndDefCompFrame;
|
HWND m_hwndCompStr;
|
||||||
CDefCompFrameGripper *m_pGripper;
|
CDefCompFrameGripper *m_pGripper;
|
||||||
CCompFinalizeButton *m_pFinalizeButton;
|
CCompFinalizeButton *m_pFinalizeButton;
|
||||||
MARGINS m_Margins;
|
MARGINS m_Margins;
|
||||||
|
@ -120,14 +120,74 @@ public:
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
|
||||||
struct UIComposition
|
struct CPolyText
|
||||||
{
|
{
|
||||||
|
CicArray<POLYTEXTW> m_PolyTextArray;
|
||||||
|
CicArray<DWORD> m_ValueArray;
|
||||||
|
|
||||||
|
HRESULT ShiftPolyText(INT xDelta, INT yDelta);
|
||||||
|
POLYTEXTW *GetPolyAt(INT iItem);
|
||||||
|
HRESULT RemoveLastLine(BOOL bHorizontal);
|
||||||
|
void RemoveAll();
|
||||||
|
};
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
|
||||||
|
struct COMPWND
|
||||||
|
{
|
||||||
|
HWND m_hWnd;
|
||||||
|
CPolyText m_PolyText;
|
||||||
|
CicCaret m_Caret;
|
||||||
|
DWORD m_dwUnknown57[3];
|
||||||
|
|
||||||
|
void _ClientToScreen(LPRECT prc);
|
||||||
|
};
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
|
||||||
|
class UIComposition
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
HWND m_hwndParent;
|
||||||
|
BOOL m_bHasCompWnd;
|
||||||
|
COMPWND m_CompStrs[4];
|
||||||
|
HFONT m_hFont1;
|
||||||
|
DWORD m_dwUnknown54;
|
||||||
|
HFONT m_hFont2;
|
||||||
|
DWORD m_dwUnknown55;
|
||||||
|
SIZE m_CaretSize;
|
||||||
|
DWORD m_dwUnknown56[2];
|
||||||
|
LPWSTR m_strCompStr;
|
||||||
|
INT m_cchCompStr;
|
||||||
|
BOOL m_bInComposition;
|
||||||
|
BOOL m_bHasCompStr;
|
||||||
|
CDefCompFrameWindow *m_pDefCompFrameWindow;
|
||||||
|
CCompButtonFrameWindow *m_pCompButtonFrameWindow;
|
||||||
|
|
||||||
|
public:
|
||||||
|
UIComposition(HWND hwndParent);
|
||||||
|
virtual ~UIComposition();
|
||||||
|
|
||||||
|
HRESULT CreateDefFrameWnd(HWND hwndParent, HIMC hIMC);
|
||||||
|
HRESULT CreateCompButtonWnd(HWND hwndParent, HIMC hIMC);
|
||||||
|
HRESULT CreateCompositionWindow(CicIMCLock& imcLock, HWND hwndParent);
|
||||||
|
HRESULT DestroyCompositionWindow();
|
||||||
|
|
||||||
|
HRESULT UpdateShowCompWndFlag(CicIMCLock& imcLock, DWORD *pdwCompStrLen);
|
||||||
|
HRESULT UpdateFont(CicIMCLock& imcLock);
|
||||||
|
LPWSTR GetCompStrBuffer(INT cchStr);
|
||||||
|
|
||||||
void OnImeStartComposition(CicIMCLock& imcLock, HWND hUIWnd);
|
void OnImeStartComposition(CicIMCLock& imcLock, HWND hUIWnd);
|
||||||
void OnImeCompositionUpdate(CicIMCLock& imcLock);
|
HRESULT OnImeCompositionUpdate(CicIMCLock& imcLock);
|
||||||
void OnImeEndComposition();
|
HRESULT OnImeEndComposition();
|
||||||
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 OnDestroy();
|
void OnTimer(HWND hWnd);
|
||||||
|
HRESULT OnDestroy();
|
||||||
|
|
||||||
|
static BOOL SendMessageToUI(CicIMCLock& imcLock, WPARAM wParam, LPARAM lParam);
|
||||||
|
static BOOL InquireImeUIWndState(CicIMCLock& imcLock);
|
||||||
|
static BOOL GetImeUIWndTextExtent(CicIMCLock& imcLock, LPARAM lParam);
|
||||||
|
|
||||||
static LRESULT CALLBACK CompWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
static LRESULT CALLBACK CompWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||||
};
|
};
|
||||||
|
@ -147,6 +207,7 @@ struct UI
|
||||||
|
|
||||||
static void OnCreate(HWND hWnd);
|
static void OnCreate(HWND hWnd);
|
||||||
static void OnDestroy(HWND hWnd);
|
static void OnDestroy(HWND hWnd);
|
||||||
|
|
||||||
void OnImeSetContext(CicIMCLock& imcLock, WPARAM wParam, LPARAM lParam);
|
void OnImeSetContext(CicIMCLock& imcLock, WPARAM wParam, LPARAM lParam);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue