Windows-classic-samples/Samples/IME/cpp/SampleIME/ActiveLanguageProfileNotifySink.cpp
2025-11-28 00:35:46 +09:00

118 lines
3.0 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
#include "Private.h"
#include "Globals.h"
#include "SampleIME.h"
#include "CompositionProcessorEngine.h"
BOOL CSampleIME::VerifySampleIMECLSID(_In_ REFCLSID clsid)
{
if (IsEqualCLSID(clsid, Global::SampleIMECLSID))
{
return TRUE;
}
return FALSE;
}
//+---------------------------------------------------------------------------
//
// ITfActiveLanguageProfileNotifySink::OnActivated
//
// Sink called by the framework when changes activate language profile.
//----------------------------------------------------------------------------
STDAPI CSampleIME::OnActivated(_In_ REFCLSID clsid, _In_ REFGUID guidProfile, _In_ BOOL isActivated)
{
guidProfile;
if (FALSE == VerifySampleIMECLSID(clsid))
{
return S_OK;
}
if (isActivated)
{
_AddTextProcessorEngine();
}
if (nullptr == _pCompositionProcessorEngine)
{
return S_OK;
}
if (isActivated)
{
_pCompositionProcessorEngine->ShowAllLanguageBarIcons();
_pCompositionProcessorEngine->ConversionModeCompartmentUpdated(_pThreadMgr);
}
else
{
_DeleteCandidateList(FALSE, nullptr);
_pCompositionProcessorEngine->HideAllLanguageBarIcons();
}
return S_OK;
}
//+---------------------------------------------------------------------------
//
// _InitActiveLanguageProfileNotifySink
//
// Advise a active language profile notify sink.
//----------------------------------------------------------------------------
BOOL CSampleIME::_InitActiveLanguageProfileNotifySink()
{
ITfSource* pSource = nullptr;
BOOL ret = FALSE;
if (_pThreadMgr->QueryInterface(IID_ITfSource, (void **)&pSource) != S_OK)
{
return ret;
}
if (pSource->AdviseSink(IID_ITfActiveLanguageProfileNotifySink, (ITfActiveLanguageProfileNotifySink *)this, &_activeLanguageProfileNotifySinkCookie) != S_OK)
{
_activeLanguageProfileNotifySinkCookie = TF_INVALID_COOKIE;
goto Exit;
}
ret = TRUE;
Exit:
pSource->Release();
return ret;
}
//+---------------------------------------------------------------------------
//
// _UninitActiveLanguageProfileNotifySink
//
// Unadvise a active language profile notify sink. Assumes we have advised one already.
//----------------------------------------------------------------------------
void CSampleIME::_UninitActiveLanguageProfileNotifySink()
{
ITfSource* pSource = nullptr;
if (_activeLanguageProfileNotifySinkCookie == TF_INVALID_COOKIE)
{
return; // never Advised
}
if (_pThreadMgr->QueryInterface(IID_ITfSource, (void **)&pSource) == S_OK)
{
pSource->UnadviseSink(_activeLanguageProfileNotifySinkCookie);
pSource->Release();
}
_activeLanguageProfileNotifySinkCookie = TF_INVALID_COOKIE;
}