diff options
author | johnsonj <unknown> | 2023-05-09 10:35:50 +1000 |
---|---|---|
committer | johnsonj <unknown> | 2023-05-09 10:35:50 +1000 |
commit | be573bc56e019ca3441a762c2e86ec2ea1fa0b24 (patch) | |
tree | 092530fdd7e4db7318b434ccb73742267d09f683 /qt/ScintillaEditBase | |
parent | 19919bba2fc5ff5b45fd402f421ede79068d0a6f (diff) | |
download | scintilla-mirror-be573bc56e019ca3441a762c2e86ec2ea1fa0b24.tar.gz |
Stop movement of IME candidate box.
Diffstat (limited to 'qt/ScintillaEditBase')
-rw-r--r-- | qt/ScintillaEditBase/ScintillaEditBase.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
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<int> 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<int> 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(); } |