/**************************************************************************** ACTIVATE.CPP : Init/Uninit Cicero services on the thread History: 24-JAN-2000 CSLim Created ****************************************************************************/ #include "private.h" #include "korimx.h" #include "immxutil.h" #include "globals.h" #include "kes.h" #include "timsink.h" #include "funcprv.h" #include "insert.h" #include "pad.h" #include "helpers.h" #include "osver.h" // Hangul and Hanja key simulation for Non-Korean Win9x and NT4 static const KESPRESERVEDKEY g_prekeyList[] = { { &GUID_KOREAN_HANGULSIMULATE, { VK_MENU, TF_MOD_RALT }, L"Hangul" }, { &GUID_KOREAN_HANJASIMULATE, { VK_CONTROL, TF_MOD_RCONTROL }, L"Hanja" }, { NULL, { 0, 0}, NULL } }; /*--------------------------------------------------------------------------- CKorIMX::Activate Initialize Cicero services on the thread ---------------------------------------------------------------------------*/ STDAPI CKorIMX::Activate(ITfThreadMgr *ptim, TfClientId tid) { ITfKeystrokeMgr *pIksm = NULL; ITfSource *pISource; ITfSourceSingle *pISourceSingle; BOOL fThreadFocus; HRESULT hr = E_FAIL; // Keep current Thread ID m_tid = tid; // Get ITfThreadMgr and ITfDocumentMgr Assert(GetTIM() == NULL); m_ptim = ptim; m_ptim->AddRef(); ////////////////////////////////////////////////////////////////////////// // Get key stroke manager(ITfKeystrokeMgr) in current TIM if (FAILED(hr = GetService(GetTIM(), IID_ITfKeystrokeMgr, (IUnknown **)&pIksm))) goto Exit; ////////////////////////////////////////////////////////////////////////// // Create ITfThreadMgrEventSink and set Call back function as _DocInputMgrCallback if ((m_ptimEventSink = new CThreadMgrEventSink(_DIMCallback, _ICCallback, this)) == NULL) { Assert(0); // bugbug hr = E_OUTOFMEMORY; goto Exit; } m_ptimEventSink->_Advise(GetTIM()); ////////////////////////////////////////////////////////////////////////// // Get IID_ITfThreadFocusSink cookie if (GetTIM()->QueryInterface(IID_ITfSource, (void **)&pISource) == S_OK) { pISource->AdviseSink(IID_ITfThreadFocusSink, (ITfThreadFocusSink *)this, &m_dwThreadFocusCookie); pISource->AdviseSink(IID_ITfActiveLanguageProfileNotifySink, (ITfActiveLanguageProfileNotifySink *)this, &m_dwProfileNotifyCookie); pISource->Release(); } // ITfCleanupContextDurationSink if (GetTIM()->QueryInterface(IID_ITfSourceSingle, (void **)&pISourceSingle) == S_OK) { pISourceSingle->AdviseSingleSink(m_tid, IID_ITfCleanupContextDurationSink, (ITfCleanupContextDurationSink *)this); pISourceSingle->Release(); } // Set conversion mode compartment to null status. SetCompartmentDWORD(m_tid, m_ptim, GUID_COMPARTMENT_KORIMX_CONVMODE, TIP_NULL_CONV_MODE, fFalse); // Korean Kbd driver does not exist in system(Non Korean NT4, Non Korean WIN9X) m_fNoKorKbd = (g_uACP != 949) && (IsOn95() || IsOn98() || (IsOnNT() && !IsOnNT5())); ////////////////////////////////////////////////////////////////////////// // Create Keyboard Sink(ITfKeyEventSink) // From Cicero Doc: Keyboard TIP must provide this KeyEventSink interface to get the key event. // Using this sink, TIPs can get the notification of getting or losing keyboard focus if (m_fNoKorKbd) m_pkes = new CKeyEventSink(_KeyEventCallback, _PreKeyCallback, this); else m_pkes = new CKeyEventSink(_KeyEventCallback, this); if (m_pkes == NULL) { hr = E_OUTOFMEMORY; goto Exit; } hr = pIksm->AdviseKeyEventSink(GetTID(), m_pkes, fTrue); if (FAILED(hr)) goto Exit; if (m_fNoKorKbd) { hr = m_pkes->_Register(GetTIM(), GetTID(), g_prekeyList); if (FAILED(hr)) { goto Exit; } } ////////////////////////////////////////////////////////////////////////// // Create status window m_hOwnerWnd = CreateWindowEx(0, c_szOwnerWndClass, TEXT(""), WS_DISABLED, 0, 0, 0, 0, NULL, 0, g_hInst, this); ////////////////////////////////////////////////////////////////////////// // Register Function Provider. Reconversion etc. m_pFuncPrv = new CFunctionProvider(this); if (m_pFuncPrv == NULL) { hr = E_OUTOFMEMORY; goto Exit; } m_pFuncPrv->_Advise(GetTIM()); // Create Pad Core m_pPadCore = new CPadCore(this); if (m_pPadCore == NULL) { hr = E_OUTOFMEMORY; goto Exit; } ////////////////////////////////////////////////////////////////////////// // Create Toolbar m_pToolBar = new CToolBar(this); if (m_pToolBar == NULL) { hr = E_OUTOFMEMORY; goto Exit; } if (!m_pToolBar->Initialize()) { hr = E_OUTOFMEMORY; goto Exit; } hr = m_ptimEventSink->_InitDIMs(fTrue); if (FAILED(hr)) { goto Exit; } ////////////////////////////////////////////////////////////////////////// // Init UI if (GetTIM()->IsThreadFocus(&fThreadFocus) == S_OK && fThreadFocus) { // init any UI OnSetThreadFocus(); } if (m_pInsertHelper = new CCompositionInsertHelper) { // optional, default is DEF_MAX_OVERTYPE_CCH in insert.h // use 0 to avoid allocating any memory // set the limit on number of overtype chars that // the helper will backup m_pInsertHelper->Configure(0); } else { hr = E_OUTOFMEMORY; goto Exit; } m_pToolBar->CheckEnable(); // update toolbar // Clear SoftKbd On/Off status backup // m_fSoftKbdOnOffSave = fFalse; // Clear SoftKbd On/Off status backup // m_fSoftKbdOnOffSave = GetSoftKBDOnOff(); if (m_fSoftKbdOnOffSave) { SetSoftKBDOnOff(fTrue); } hr = S_OK; Exit: SafeRelease(pIksm); return hr; } /*--------------------------------------------------------------------------- CKorIMX::Deactivate Uninitialize Cicero services on the thread ---------------------------------------------------------------------------*/ STDAPI CKorIMX::Deactivate() { ITfKeystrokeMgr *pksm = NULL; ITfSource *pISource; ITfSourceSingle *pISourceSingle = NULL; BOOL fThreadFocus; HRESULT hr = E_FAIL; // close candidate UI if (m_pCandUI != NULL) { CloseCandidateUIProc(); m_pCandUI->Release(); m_pCandUI = NULL; } // pad core if (m_pPadCore) { delete m_pPadCore; m_pPadCore = NULL; } // toolbar if (m_pToolBar) { m_pToolBar->Terminate(); delete m_pToolBar; m_pToolBar = NULL; } if (GetTIM()->IsThreadFocus(&fThreadFocus) == S_OK && fThreadFocus) { // shutdown any UI OnKillThreadFocus(); } /////////////////////////////////////////////////////////////////////////// // Unadvise IID_ITfThreadFocusSink cookie if (GetTIM()->QueryInterface(IID_ITfSource, (void **)&pISource) == S_OK) { pISource->UnadviseSink(m_dwThreadFocusCookie); pISource->UnadviseSink(m_dwProfileNotifyCookie); pISource->Release(); } if (GetTIM()->QueryInterface(IID_ITfSourceSingle, (void **)&pISourceSingle) == S_OK) { pISourceSingle->UnadviseSingleSink(m_tid, IID_ITfCleanupContextDurationSink); pISourceSingle->Release(); } if (FAILED(hr = GetService(GetTIM(), IID_ITfKeystrokeMgr, (IUnknown **)&pksm))) goto Exit; // Release TIM event sink if (m_ptimEventSink != NULL) { m_ptimEventSink->_InitDIMs(fFalse); m_ptimEventSink->_Unadvise(); SafeReleaseClear(m_ptimEventSink); } // Release Key event sink if (m_pkes) { if (m_fNoKorKbd) m_pkes->_Unregister(GetTIM(), GetTID(), g_prekeyList); SafeReleaseClear(m_pkes); } // Delete SoftKbd if (IsSoftKbdEnabled()) TerminateSoftKbd(); // Release Key Event Sink pksm->UnadviseKeyEventSink(GetTID()); DestroyWindow(m_hOwnerWnd); m_pFuncPrv->_Unadvise(GetTIM()); SafeReleaseClear(m_pFuncPrv); SafeReleaseClear(m_ptim); // // Free per-thread object that lib uses. // TFUninitLib_Thread(&m_libTLS); SafeReleaseClear(m_pInsertHelper); hr = S_OK; Exit: SafeRelease(pksm); return hr; }