terminal/src/tsf/TfTxtevCb.cpp
Josh Soref 5de9fa9cf3
ci: run spell check in CI, fix remaining issues (#4799)
This commit introduces a github action to check our spelling and fixes
the following misspelled words so that we come up green.

It also renames TfEditSes to TfEditSession, because Ses is not a word.

currently, excerpt, fallthrough, identified, occurred, propagate,
provided, rendered, resetting, separate, succeeded, successfully,
terminal, transferred, adheres, breaks, combining, preceded,
architecture, populated, previous, setter, visible, window, within,
appxmanifest, hyphen, control, offset, powerpoint, suppress, parsing,
prioritized, aforementioned, check in, build, filling, indices, layout,
mapping, trying, scroll, terabyte, vetoes, viewport, whose
2020-03-25 11:02:53 -07:00

170 lines
5.1 KiB
C++

/*++
Copyright (c) Microsoft Corporation.
Licensed under the MIT license.
Module Name:
TfTxtevCb.cpp
Abstract:
This file implements the CTextEventSinkCallBack Class.
Author:
Revision History:
Notes:
--*/
#include "precomp.h"
#include "ConsoleTSF.h"
#include "TfEditSession.h"
//+---------------------------------------------------------------------------
//
// CConsoleTSF::HasCompositionChanged
//
//----------------------------------------------------------------------------
BOOL CConsoleTSF::_HasCompositionChanged(ITfContext* pInputContext, TfEditCookie ecReadOnly, ITfEditRecord* pEditRecord)
{
BOOL fChanged;
if (SUCCEEDED(pEditRecord->GetSelectionStatus(&fChanged)))
{
if (fChanged)
{
return TRUE;
}
}
//
// Find GUID_PROP_CONIME_TRACKCOMPOSITION property.
//
wil::com_ptr_nothrow<ITfProperty> Property;
wil::com_ptr_nothrow<ITfRange> FoundRange;
wil::com_ptr_nothrow<ITfProperty> PropertyTrackComposition;
BOOL bFound = FALSE;
if (SUCCEEDED(pInputContext->GetProperty(GUID_PROP_CONIME_TRACKCOMPOSITION, &Property)))
{
wil::com_ptr_nothrow<IEnumTfRanges> EnumFindFirstTrackCompRange;
if (SUCCEEDED(Property->EnumRanges(ecReadOnly, &EnumFindFirstTrackCompRange, NULL)))
{
HRESULT hr;
wil::com_ptr_nothrow<ITfRange> range;
while ((hr = EnumFindFirstTrackCompRange->Next(1, &range, nullptr)) == S_OK)
{
VARIANT var;
VariantInit(&var);
hr = Property->GetValue(ecReadOnly, range.get(), &var);
if (SUCCEEDED(hr))
{
if ((V_VT(&var) == VT_I4 && V_I4(&var) != 0))
{
range->Clone(&FoundRange);
bFound = TRUE; // FOUND!!
break;
}
}
VariantClear(&var);
if (bFound)
{
break; // FOUND!!
}
}
}
}
//
// if there is no track composition property,
// the composition has been changed since we put it.
//
if (!bFound)
{
return TRUE;
}
if (FoundRange == nullptr)
{
return FALSE;
}
bFound = FALSE; // RESET bFound flag...
wil::com_ptr_nothrow<ITfRange> rangeTrackComposition;
if (SUCCEEDED(FoundRange->Clone(&rangeTrackComposition)))
{
//
// get the text range that does not include read only area for
// reconversion.
//
wil::com_ptr_nothrow<ITfRange> rangeAllText;
LONG cch;
if (SUCCEEDED(CEditSessionObject::GetAllTextRange(ecReadOnly, pInputContext, &rangeAllText, &cch)))
{
LONG lResult;
if (SUCCEEDED(rangeTrackComposition->CompareStart(ecReadOnly, rangeAllText.get(), TF_ANCHOR_START, &lResult)))
{
//
// if the start position of the track composition range is not
// the beginning of IC,
// the composition has been changed since we put it.
//
if (lResult != 0)
{
bFound = TRUE; // FOUND!!
}
else if (SUCCEEDED(rangeTrackComposition->CompareEnd(ecReadOnly, rangeAllText.get(), TF_ANCHOR_END, &lResult)))
{
//
// if the start position of the track composition range is not
// the beginning of IC,
// the composition has been changed since we put it.
//
//
// If we find the changes in these property, we need to update hIMC.
//
const GUID* guids[] = { &GUID_PROP_COMPOSING,
&GUID_PROP_ATTRIBUTE };
const int guid_size = sizeof(guids) / sizeof(GUID*);
wil::com_ptr_nothrow<IEnumTfRanges> EnumPropertyChanged;
if (lResult != 0)
{
bFound = TRUE; // FOUND!!
}
else if (SUCCEEDED(pEditRecord->GetTextAndPropertyUpdates(TF_GTP_INCL_TEXT, guids, guid_size, &EnumPropertyChanged)))
{
HRESULT hr;
wil::com_ptr_nothrow<ITfRange> range;
while ((hr = EnumPropertyChanged->Next(1, &range, nullptr)) == S_OK)
{
BOOL empty;
if (range->IsEmpty(ecReadOnly, &empty) == S_OK && empty)
{
continue;
}
bFound = TRUE; // FOUND!!
break;
}
}
}
}
}
}
return bFound;
}