From be573bc56e019ca3441a762c2e86ec2ea1fa0b24 Mon Sep 17 00:00:00 2001 From: johnsonj Date: Tue, 9 May 2023 10:35:50 +1000 Subject: Stop movement of IME candidate box. --- qt/ScintillaEditBase/ScintillaEditBase.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'qt/ScintillaEditBase/ScintillaEditBase.cpp') diff --git a/qt/ScintillaEditBase/ScintillaEditBase.cpp b/qt/ScintillaEditBase/ScintillaEditBase.cpp index f789af727..b6c35f16e 100644 --- a/qt/ScintillaEditBase/ScintillaEditBase.cpp +++ b/qt/ScintillaEditBase/ScintillaEditBase.cpp @@ -485,8 +485,6 @@ static std::vector MapImeIndicators(QInputMethodEvent *event) int indicator = IndicatorUnknown; switch (charFormat.underlineStyle()) { case QTextCharFormat::NoUnderline: // win32, linux - indicator = IndicatorTarget; - break; case QTextCharFormat::SingleUnderline: // osx case QTextCharFormat::DashUnderline: // win32, linux indicator = IndicatorInput; @@ -542,6 +540,7 @@ void ScintillaEditBase::inputMethodEvent(QInputMethodEvent *event) } sqt->view.imeCaretBlockOverride = false; + preeditPos = -1; // reset not to interrupt Qt::ImCursorRectangle. if (!event->commitString().isEmpty()) { const QString &commitStr = event->commitString(); @@ -568,6 +567,9 @@ void ScintillaEditBase::inputMethodEvent(QInputMethodEvent *event) sqt->ClearBeforeTentativeStart(); sqt->pdoc->TentativeStart(); // TentativeActive() from now on. + // Fix candidate window position at the start of preeditString. + preeditPos = sqt->CurrentPosition(); + std::vector imeIndicator = MapImeIndicators(event); for (int i = 0; i < preeditStrLen;) { @@ -599,10 +601,14 @@ void ScintillaEditBase::inputMethodEvent(QInputMethodEvent *event) sqt->view.imeCaretBlockOverride = true; } - // Set candidate box position for Qt::ImMicroFocus. - preeditPos = sqt->CurrentPosition(); + // Set Candidate window position again at imeCaret when target input. + const bool targetAny = std::any_of(imeIndicator.begin(), imeIndicator.end(), [](int i) noexcept { + return i == IndicatorTarget; + }); + if (targetAny) + preeditPos = sqt->CurrentPosition(); + sqt->EnsureCaretVisible(); - updateMicroFocus(); } sqt->ShowCaretAtCurrentPosition(); } -- cgit v1.2.3