void CLangBarItemButton::CleanUp() { if (_pTooltipText) { delete [] _pTooltipText; _pTooltipText = nullptr; } ITfThreadMgr* pThreadMgr = nullptr; HRESULT hr = CoCreateInstance(CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (void**)&pThreadMgr); if (SUCCEEDED(hr)) { _UnregisterCompartment(pThreadMgr); _RemoveItem(pThreadMgr); pThreadMgr->Release(); pThreadMgr = nullptr; } if (_pCompartment) { delete _pCompartment; _pCompartment = nullptr; } if (_pCompartmentEventSink) { delete _pCompartmentEventSink; _pCompartmentEventSink = nullptr; } }
HRESULT CCandidateListUIPresenter::_CandidateChangeNotification(_In_ enum CANDWND_ACTION action) { HRESULT hr = E_FAIL; TfClientId tfClientId = _pTextService->_GetClientId(); ITfThreadMgr* pThreadMgr = nullptr; ITfDocumentMgr* pDocumentMgr = nullptr; ITfContext* pContext = nullptr; _KEYSTROKE_STATE KeyState; KeyState.Category = _Category; KeyState.Function = FUNCTION_FINALIZE_CANDIDATELIST; if (CAND_ITEM_SELECT != action) { goto Exit; } pThreadMgr = _pTextService->_GetThreadMgr(); if (nullptr == pThreadMgr) { goto Exit; } hr = pThreadMgr->GetFocus(&pDocumentMgr); if (FAILED(hr)) { goto Exit; } hr = pDocumentMgr->GetTop(&pContext); if (FAILED(hr)) { pDocumentMgr->Release(); goto Exit; } CKeyHandlerEditSession *pEditSession = new (std::nothrow) CKeyHandlerEditSession(_pTextService, pContext, 0, 0, KeyState); if (nullptr != pEditSession) { HRESULT hrSession = S_OK; hr = pContext->RequestEditSession(tfClientId, pEditSession, TF_ES_SYNC | TF_ES_READWRITE, &hrSession); if (hrSession == TF_E_SYNCHRONOUS || hrSession == TS_E_READONLY) { hr = pContext->RequestEditSession(tfClientId, pEditSession, TF_ES_ASYNC | TF_ES_READWRITE, &hrSession); } pEditSession->Release(); } pContext->Release(); pDocumentMgr->Release(); Exit: return hr; }
HRESULT CCandidateListUIPresenter::_UpdateUIElement() { HRESULT hr = S_OK; ITfThreadMgr* pThreadMgr = _pTextService->_GetThreadMgr(); if (nullptr == pThreadMgr) { return S_OK; } ITfUIElementMgr* pUIElementMgr = nullptr; hr = pThreadMgr->QueryInterface(IID_ITfUIElementMgr, (void **)&pUIElementMgr); if (hr == S_OK) { pUIElementMgr->UpdateUIElement(_uiElementId); pUIElementMgr->Release(); } return S_OK; }
HRESULT CCandidateListUIPresenter::EndUIElement() { HRESULT hr = S_OK; ITfThreadMgr* pThreadMgr = _pTextService->_GetThreadMgr(); if ((nullptr == pThreadMgr) || (-1 == _uiElementId)) { hr = E_FAIL; goto Exit; } ITfUIElementMgr* pUIElementMgr = nullptr; hr = pThreadMgr->QueryInterface(IID_ITfUIElementMgr, (void **)&pUIElementMgr); if (hr == S_OK) { pUIElementMgr->EndUIElement(_uiElementId); pUIElementMgr->Release(); } Exit: return hr; }
HRESULT CCandidateListUIPresenter::BeginUIElement() { HRESULT hr = S_OK; ITfThreadMgr* pThreadMgr = _pTextService->_GetThreadMgr(); if (nullptr ==pThreadMgr) { hr = E_FAIL; goto Exit; } ITfUIElementMgr* pUIElementMgr = nullptr; hr = pThreadMgr->QueryInterface(IID_ITfUIElementMgr, (void **)&pUIElementMgr); if (hr == S_OK) { pUIElementMgr->BeginUIElement(this, &_isShowMode, &_uiElementId); pUIElementMgr->Release(); } Exit: return hr; }
// static HRESULT CDIME::CompartmentCallback(_In_ void *pv, REFGUID guidCompartment) { debugPrint(L"CDIME::CompartmentCallback()\n"); CDIME* fakeThis = (CDIME*)pv; if (nullptr == fakeThis) { return E_INVALIDARG; } ITfThreadMgr* pThreadMgr = nullptr; HRESULT hr = CoCreateInstance(CLSID_TF_ThreadMgr, nullptr, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (void**)&pThreadMgr); if (FAILED(hr) || pThreadMgr == nullptr) { return E_FAIL; } if (IsEqualGUID(guidCompartment, Global::DIMEGuidCompartmentDoubleSingleByte) ) { fakeThis->PrivateCompartmentsUpdated(pThreadMgr); } else if (IsEqualGUID(guidCompartment, GUID_COMPARTMENT_KEYBOARD_INPUTMODE_CONVERSION) || IsEqualGUID(guidCompartment, GUID_COMPARTMENT_KEYBOARD_INPUTMODE_SENTENCE)) { fakeThis->ConversionModeCompartmentUpdated(pThreadMgr); } else if (IsEqualGUID(guidCompartment, GUID_COMPARTMENT_KEYBOARD_OPENCLOSE)|| IsEqualGUID(guidCompartment, Global::DIMEGuidCompartmentIMEMode)) { fakeThis->KeyboardOpenCompartmentUpdated(pThreadMgr, guidCompartment); } pThreadMgr->Release(); pThreadMgr = nullptr; return S_OK; }
HRESULT CCompartmentMonitor::Initialize( const GUID *pguidCompartment, PCOMPARTMENTMONITORPROC pCallback, LPARAM lParam) { if(!IsEqualGUID(m_guidCompartment, GUID_NULL)) { //Initialize() has already been called return E_UNEXPECTED; } m_guidCompartment = *pguidCompartment; m_pCallback = pCallback; m_lParam = lParam; HRESULT hr; ITfThreadMgr *pThreadMgr; //create a thread manager object hr = CoCreateInstance(CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (void**)&pThreadMgr); if(SUCCEEDED(hr)) { ITfCompartmentMgr *pCompMgr; //get the global compartment manager hr = pThreadMgr->GetGlobalCompartment(&pCompMgr); if(SUCCEEDED(hr)) { //get the Speech UI compartment hr = pCompMgr->GetCompartment(m_guidCompartment, &m_pCompartment); if(SUCCEEDED(hr)) { ITfSource *pSource; //install the advise sink hr = m_pCompartment->QueryInterface(IID_ITfSource, (LPVOID*)&pSource); if(SUCCEEDED(hr)) { hr = pSource->AdviseSink(IID_ITfCompartmentEventSink, (ITfCompartmentEventSink*)this, &m_dwCookie); } //if something went wrong, release the member interface if(FAILED(hr)) { m_pCompartment->Release(); m_pCompartment = NULL; } } //release the compartment manager pCompMgr->Release(); } //release the thread manager pThreadMgr->Release(); } return hr; }