/*++ Copyright (c) 1985 - 1999, Microsoft Corporation Module Name: cmpevcb.cpp Abstract: This file implements the CCompartmentEventSinkCallBack Class. Author: Revision History: Notes: --*/ #include "private.h" #include "cmpevcb.h" #include "cime.h" #include "immif.h" #include "korimx.h" // static HRESULT CCompartmentEventSinkCallBack::CompartmentEventSinkCallback( void* pv, REFGUID rguid ) { DebugMsg(TF_FUNC, "CompartmentEventSinkCallback"); IMTLS *ptls; HRESULT hr = S_OK; LANGID langid; BOOL fOpenChanged; CCompartmentEventSinkCallBack* _this = (CCompartmentEventSinkCallBack*)pv; ASSERT(_this); ImmIfIME* _ImmIfIME = _this->m_pImmIfIME; ASSERT(_ImmIfIME); fOpenChanged = _ImmIfIME->IsOpenStatusChanging(); if ((ptls = IMTLS_GetOrAlloc()) == NULL) return E_FAIL; ptls->pAImeProfile->GetLangId(&langid); if ((PRIMARYLANGID(langid) != LANG_KOREAN) && fOpenChanged) return S_OK; IMCLock imc(ptls->hIMC); if (FAILED(hr=imc.GetResult())) return hr; if (!fOpenChanged) { DWORD fOnOff; hr = GetCompartmentDWORD(ptls->tim, GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, &fOnOff, FALSE); if (SUCCEEDED(hr)) { if (!_ImmIfIME->IsRealIme()) { imc->fOpen = (BOOL) ! ! fOnOff; SendMessage(imc->hWnd, WM_IME_NOTIFY, IMN_SETOPENSTATUS, 0L); } // // Direct input mode support for Satori. // When user switch to direct input mode with composition string, // we want finalize composition string. // if (! imc->fOpen) { CAImeContext* _pAImeContext = imc->m_pAImeContext; ASSERT(_pAImeContext != NULL); if (_pAImeContext == NULL) return E_FAIL; if (_pAImeContext->m_fStartComposition) { // // finalize the composition before letting the world see this keystroke // _ImmIfIME->_CompComplete(imc); } } } } if ((PRIMARYLANGID(langid) == LANG_KOREAN)) { DWORD fdwConvMode; hr = GetCompartmentDWORD(ptls->tim, GUID_COMPARTMENT_KORIMX_CONVMODE, &fdwConvMode, FALSE); if (SUCCEEDED(hr)) { switch (fdwConvMode) { // Korean TIP ALPHANUMERIC Mode case KORIMX_ALPHANUMERIC_MODE: imc->fdwConversion = IME_CMODE_ALPHANUMERIC; break; // Korean TIP HANGUL Mode case KORIMX_HANGUL_MODE: imc->fdwConversion = IME_CMODE_HANGUL; break; // Korean TIP JUNJA Mode case KORIMX_JUNJA_MODE: imc->fdwConversion = IME_CMODE_FULLSHAPE; break; // Korean TIP HANGUL/JUNJA Mode case KORIMX_HANGULJUNJA_MODE: imc->fdwConversion = IME_CMODE_HANGUL | IME_CMODE_FULLSHAPE; break; } } } return hr; } CCompartmentEventSinkCallBack::CCompartmentEventSinkCallBack( ImmIfIME* pImmIfIME) : m_pImmIfIME(pImmIfIME), CCompartmentEventSink(CompartmentEventSinkCallback, NULL) { m_pImmIfIME->AddRef(); }; CCompartmentEventSinkCallBack::~CCompartmentEventSinkCallBack( ) { m_pImmIfIME->Release(); }