mirror of
https://github.com/reactos/reactos.git
synced 2025-03-27 15:40:45 +00:00
[MSCTFIME][SDK] Implement CicBridge::ActivateIMMX etc. (#6237)
Supporting TIPs... JIRA issue: CORE-19360 - Implement CicBridge::ActivateIMMX and CicBridge::DeactivateIMMX functions.
This commit is contained in:
parent
b9e8fb9ea4
commit
d528cc4013
2 changed files with 32 additions and 28 deletions
|
@ -1003,7 +1003,8 @@ class CicBridge : public ITfSysHookSink
|
||||||
protected:
|
protected:
|
||||||
LONG m_cRefs;
|
LONG m_cRefs;
|
||||||
DWORD m_dwImmxInit;
|
DWORD m_dwImmxInit;
|
||||||
DWORD m_dw[2];
|
DWORD m_dw[1];
|
||||||
|
BOOL m_bDeactivating;
|
||||||
DWORD m_cActivateLocks;
|
DWORD m_cActivateLocks;
|
||||||
ITfKeystrokeMgr *m_pKeystrokeMgr;
|
ITfKeystrokeMgr *m_pKeystrokeMgr;
|
||||||
ITfDocumentMgr *m_pDocMgr;
|
ITfDocumentMgr *m_pDocMgr;
|
||||||
|
@ -1031,8 +1032,8 @@ public:
|
||||||
|
|
||||||
HRESULT InitIMMX(TLS *pTLS);
|
HRESULT InitIMMX(TLS *pTLS);
|
||||||
BOOL UnInitIMMX(TLS *pTLS);
|
BOOL UnInitIMMX(TLS *pTLS);
|
||||||
HRESULT ActivateIMMX(TLS *pTLS, ITfThreadMgr *pThreadMgr);
|
HRESULT ActivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr);
|
||||||
HRESULT DeactivateIMMX(TLS *pTLS, ITfThreadMgr *pThreadMgr);
|
HRESULT DeactivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr);
|
||||||
|
|
||||||
HRESULT CreateInputContext(TLS *pTLS, HIMC hIMC);
|
HRESULT CreateInputContext(TLS *pTLS, HIMC hIMC);
|
||||||
HRESULT DestroyInputContext(TLS *pTLS, HIMC hIMC);
|
HRESULT DestroyInputContext(TLS *pTLS, HIMC hIMC);
|
||||||
|
@ -1394,7 +1395,7 @@ public:
|
||||||
DWORD m_dwSystemInfoFlags;
|
DWORD m_dwSystemInfoFlags;
|
||||||
CicBridge *m_pBridge;
|
CicBridge *m_pBridge;
|
||||||
CicProfile *m_pProfile;
|
CicProfile *m_pProfile;
|
||||||
ITfThreadMgr *m_pThreadMgr;
|
ITfThreadMgr_P *m_pThreadMgr;
|
||||||
DWORD m_dwFlags1;
|
DWORD m_dwFlags1;
|
||||||
DWORD m_dwFlags2;
|
DWORD m_dwFlags2;
|
||||||
DWORD m_dwUnknown2[2];
|
DWORD m_dwUnknown2[2];
|
||||||
|
@ -1585,7 +1586,7 @@ CicBridge::CicBridge()
|
||||||
{
|
{
|
||||||
m_dwImmxInit &= ~1;
|
m_dwImmxInit &= ~1;
|
||||||
m_dw[0] &= ~1;
|
m_dw[0] &= ~1;
|
||||||
m_dw[1] &= ~1;
|
m_bDeactivating = FALSE;
|
||||||
m_dw21 &= ~1;
|
m_dw21 &= ~1;
|
||||||
m_pKeystrokeMgr = NULL;
|
m_pKeystrokeMgr = NULL;
|
||||||
m_pDocMgr = NULL;
|
m_pDocMgr = NULL;
|
||||||
|
@ -1784,17 +1785,22 @@ BOOL CALLBACK CicBridge::EnumDestroyInputContextCallback(HIMC hIMC, LPARAM lPara
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
HRESULT CicBridge::ActivateIMMX(TLS *pTLS, ITfThreadMgr *pThreadMgr)
|
HRESULT CicBridge::ActivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr)
|
||||||
{
|
{
|
||||||
//FIXME
|
HRESULT hr = pThreadMgr->ActivateEx(&m_cliendId, 1);
|
||||||
|
if (hr != S_OK)
|
||||||
|
{
|
||||||
|
m_cliendId = 0;
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_cActivateLocks++ != 0)
|
if (m_cActivateLocks++ != 0)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
ITfSourceSingle *pSource = NULL;
|
ITfSourceSingle *pSource = NULL;
|
||||||
HRESULT hr = pThreadMgr->QueryInterface(IID_ITfSourceSingle, (void**)&pSource);
|
hr = pThreadMgr->QueryInterface(IID_ITfSourceSingle, (void**)&pSource);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
DeactivateIMMX(pTLS, pThreadMgr);
|
DeactivateIMMX(pTLS, pThreadMgr);
|
||||||
|
@ -1823,7 +1829,7 @@ HRESULT CicBridge::ActivateIMMX(TLS *pTLS, ITfThreadMgr *pThreadMgr)
|
||||||
SetCompartmentDWORD(m_cliendId, m_pDocMgr, GUID_COMPARTMENT_CTFIME_DIMFLAGS, TRUE, FALSE);
|
SetCompartmentDWORD(m_cliendId, m_pDocMgr, GUID_COMPARTMENT_CTFIME_DIMFLAGS, TRUE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME
|
pThreadMgr->SetSysHookSink(this);
|
||||||
|
|
||||||
hr = S_OK;
|
hr = S_OK;
|
||||||
if (pTLS->m_dwUnknown2[1] & 1)
|
if (pTLS->m_dwUnknown2[1] & 1)
|
||||||
|
@ -1835,28 +1841,26 @@ HRESULT CicBridge::ActivateIMMX(TLS *pTLS, ITfThreadMgr *pThreadMgr)
|
||||||
Finish:
|
Finish:
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
DeactivateIMMX(pTLS, pThreadMgr);
|
DeactivateIMMX(pTLS, pThreadMgr);
|
||||||
|
|
||||||
if (pSource)
|
if (pSource)
|
||||||
pSource->Release();
|
pSource->Release();
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
HRESULT CicBridge::DeactivateIMMX(TLS *pTLS, ITfThreadMgr *pThreadMgr)
|
HRESULT CicBridge::DeactivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr)
|
||||||
{
|
{
|
||||||
if (m_dw[1] & 1)
|
if (m_bDeactivating)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
m_dw[1] |= 1;
|
m_bDeactivating = TRUE;
|
||||||
|
|
||||||
if (m_cliendId)
|
if (m_cliendId)
|
||||||
{
|
{
|
||||||
ENUM_CREATE_DESTROY_IC Data = { pTLS, this };
|
ENUM_CREATE_DESTROY_IC Data = { pTLS, this };
|
||||||
ImmEnumInputContext(0, CicBridge::EnumDestroyInputContextCallback, (LPARAM)&Data);
|
ImmEnumInputContext(0, CicBridge::EnumDestroyInputContextCallback, (LPARAM)&Data);
|
||||||
pTLS->m_dwUnknown2[1] |= 1u;
|
pTLS->m_dwUnknown2[1] |= 1;
|
||||||
|
|
||||||
ITfSourceSingle *pSource = NULL;
|
ITfSourceSingle *pSource = NULL;
|
||||||
if (pThreadMgr->QueryInterface(IID_ITfSourceSingle, (void **)&pSource) == S_OK)
|
if (pThreadMgr->QueryInterface(IID_ITfSourceSingle, (void **)&pSource) == S_OK)
|
||||||
|
@ -1880,9 +1884,9 @@ HRESULT CicBridge::DeactivateIMMX(TLS *pTLS, ITfThreadMgr *pThreadMgr)
|
||||||
m_pDocMgr = NULL;
|
m_pDocMgr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME
|
pThreadMgr->SetSysHookSink(NULL);
|
||||||
|
|
||||||
m_dw[1] &= ~1;
|
m_bDeactivating = FALSE;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -1895,20 +1899,19 @@ HRESULT CicBridge::InitIMMX(TLS *pTLS)
|
||||||
if (m_dwImmxInit & 1)
|
if (m_dwImmxInit & 1)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
HRESULT hr;
|
HRESULT hr = S_OK;
|
||||||
if (!pTLS->m_pThreadMgr)
|
if (!pTLS->m_pThreadMgr)
|
||||||
{
|
{
|
||||||
hr = TF_CreateThreadMgr(&pTLS->m_pThreadMgr);
|
ITfThreadMgr *pThreadMgr = NULL;
|
||||||
|
hr = TF_CreateThreadMgr(&pThreadMgr);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
hr = pTLS->m_pThreadMgr->QueryInterface(IID_ITfThreadMgr, (void **)&pTLS->m_pThreadMgr);
|
hr = pThreadMgr->QueryInterface(IID_ITfThreadMgr_P, (void **)&pTLS->m_pThreadMgr);
|
||||||
|
if (pThreadMgr)
|
||||||
|
pThreadMgr->Release();
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
|
||||||
pTLS->m_pThreadMgr->Release();
|
|
||||||
pTLS->m_pThreadMgr = NULL;
|
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_pThreadMgrEventSink)
|
if (!m_pThreadMgrEventSink)
|
||||||
|
@ -1930,6 +1933,7 @@ HRESULT CicBridge::InitIMMX(TLS *pTLS)
|
||||||
pTLS->m_pProfile = new CicProfile();
|
pTLS->m_pProfile = new CicProfile();
|
||||||
if (!pTLS->m_pProfile)
|
if (!pTLS->m_pProfile)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
hr = pTLS->m_pProfile->InitProfileInstance(pTLS);
|
hr = pTLS->m_pProfile->InitProfileInstance(pTLS);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
|
@ -1938,7 +1942,7 @@ HRESULT CicBridge::InitIMMX(TLS *pTLS)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = pTLS->m_pThreadMgr->QueryInterface(IID_ITfKeystrokeMgr, (void **)&m_pKeystrokeMgr);
|
hr = pTLS->m_pThreadMgr->QueryInterface(IID_ITfKeystrokeMgr_P, (void **)&m_pKeystrokeMgr);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
UnInitIMMX(pTLS);
|
UnInitIMMX(pTLS);
|
||||||
|
|
|
@ -25,7 +25,7 @@ struct ITfThreadMgr_P : ITfThreadMgr
|
||||||
STDMETHOD(RequestPostponedLock)(ITfContext *pContext) = 0;
|
STDMETHOD(RequestPostponedLock)(ITfContext *pContext) = 0;
|
||||||
STDMETHOD(IsKeystrokeFeedEnabled)(int *) = 0;
|
STDMETHOD(IsKeystrokeFeedEnabled)(int *) = 0;
|
||||||
STDMETHOD(CallImm32HotkeyHandler)(UINT vKey, LPARAM lParam, HRESULT* phrResult) = 0;
|
STDMETHOD(CallImm32HotkeyHandler)(UINT vKey, LPARAM lParam, HRESULT* phrResult) = 0;
|
||||||
STDMETHOD(ActivateEx)(LPDWORD, DWORD) = 0;
|
STDMETHOD(ActivateEx)(TfClientId*, DWORD) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
DEFINE_GUID(IID_ITfKeystrokeMgr_P, 0x53FA1BEC, 0x5BE1, 0x458E, 0xAE, 0x70, 0xA9, 0xF1, 0xDC, 0x84, 0x3E, 0x81);
|
DEFINE_GUID(IID_ITfKeystrokeMgr_P, 0x53FA1BEC, 0x5BE1, 0x458E, 0xAE, 0x70, 0xA9, 0xF1, 0xDC, 0x84, 0x3E, 0x81);
|
||||||
|
|
Loading…
Reference in a new issue