diff options
author | johnsonj <unknown> | 2016-04-14 23:21:56 +1000 |
---|---|---|
committer | johnsonj <unknown> | 2016-04-14 23:21:56 +1000 |
commit | 483bbe47309348d096388379c1ad03e2082f647f (patch) | |
tree | 262eb1745b5b08c52a2664c2e34756b283826140 | |
parent | 2af8e440eb93ba6e03de7b495bfce70016ed5868 (diff) | |
download | scintilla-mirror-483bbe47309348d096388379c1ad03e2082f647f.tar.gz |
Simplified IME caret positioning.
-rw-r--r-- | gtk/ScintillaGTK.cxx | 20 | ||||
-rw-r--r-- | qt/ScintillaEditBase/ScintillaEditBase.cpp | 19 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 8 |
3 files changed, 20 insertions, 27 deletions
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 80217660b..85336ecdd 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -2453,13 +2453,8 @@ void ScintillaGTK::PreeditChangedInlineThis() { pdoc->TentativeStart(); // TentativeActive() from now on - // Get preedit string attribues std::vector<int> indicator = MapImeIndicators(preeditStr.attrs, preeditStr.str); - // Display preedit characters, one by one - glong imeCharPos[maxLenInputIME+1] = { 0 }; - glong charWidth = 0; - bool tmpRecordingMacro = recordingMacro; recordingMacro = false; for (glong i = 0; i < preeditStr.uniStrLen; i++) { @@ -2471,21 +2466,22 @@ void ScintillaGTK::PreeditChangedInlineThis() { AddCharUTF(docChar.c_str(), docChar.size()); - // Draw an indicator on the character, DrawImeIndicator(indicator[i], docChar.size()); - - // Record character positions in UTF-8 or DBCS bytes - charWidth += docChar.size(); - imeCharPos[i+1] = charWidth; } recordingMacro = tmpRecordingMacro; // Move caret to ime cursor position. - MoveImeCarets( - (imeCharPos[preeditStr.uniStrLen]) + imeCharPos[preeditStr.cursor_pos]); + int imeEndToImeCaretU32 = preeditStr.cursor_pos - preeditStr.uniStrLen; + int imeCaretPosDoc = pdoc->GetRelativePosition(CurrentPosition(), imeEndToImeCaretU32); + + MoveImeCarets(- CurrentPosition() + imeCaretPosDoc); if (KoreanIME()) { #if !PLAT_GTK_WIN32 - MoveImeCarets( - imeCharPos[1]); // always 2 bytes for DBCS or 3 bytes for UTF8. + if (preeditStr.cursor_pos > 0) { + int oneCharBefore = pdoc->GetRelativePosition(CurrentPosition(), -1); + MoveImeCarets(- CurrentPosition() + oneCharBefore); + } #endif view.imeCaretBlockOverride = true; } diff --git a/qt/ScintillaEditBase/ScintillaEditBase.cpp b/qt/ScintillaEditBase/ScintillaEditBase.cpp index 7d24d0f4c..9656af283 100644 --- a/qt/ScintillaEditBase/ScintillaEditBase.cpp +++ b/qt/ScintillaEditBase/ScintillaEditBase.cpp @@ -541,10 +541,6 @@ void ScintillaEditBase::inputMethodEvent(QInputMethodEvent *event) std::vector<int> imeIndicator = MapImeIndicators(event); - // Display preedit characters one by one. - int imeCharPos[MAXLENINPUTIME] = {0}; - int numBytes = 0; - const bool recording = sqt->recordingMacro; sqt->recordingMacro = false; for (unsigned int i = 0; i < preeditStrLen;) { @@ -553,25 +549,26 @@ void ScintillaEditBase::inputMethodEvent(QInputMethodEvent *event) const QByteArray oneChar = sqt->BytesForDocument(oneCharUTF16); const int oneCharLen = oneChar.length(); - // Record character positions for moving ime caret. - numBytes += oneCharLen; - imeCharPos[i + ucWidth] = numBytes; - sqt->AddCharUTF(oneChar.data(), oneCharLen); DrawImeIndicator(imeIndicator[i], oneCharLen); - i += ucWidth; } sqt->recordingMacro = recording; // Move IME carets. int imeCaretPos = GetImeCaretPos(event); - MoveImeCarets(- imeCharPos[preeditStrLen] + imeCharPos[imeCaretPos]); + int imeEndToImeCaretU16 = imeCaretPos - preeditStrLen; + int imeCaretPosDoc = sqt->pdoc->GetRelativePositionUTF16(sqt->CurrentPosition(), imeEndToImeCaretU16); + + MoveImeCarets(- sqt->CurrentPosition() + imeCaretPosDoc); if (IsHangul(preeditStr.at(0))) { #ifndef Q_OS_WIN - MoveImeCarets(- imeCharPos[1]); + if (imeCaretPos > 0) { + int oneCharBefore = sqt->pdoc->GetRelativePosition(sqt->CurrentPosition(), -1); + MoveImeCarets(- sqt->CurrentPosition() + oneCharBefore); + } #endif sqt->view.imeCaretBlockOverride = true; } diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 2e9cce34a..3c7cd45be 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -1093,10 +1093,10 @@ sptr_t ScintillaWin::HandleCompositionInline(uptr_t, sptr_t lParam) { recordingMacro = tmpRecordingMacro; // Move IME caret from current last position to imeCaretPos. - int toImeStart = static_cast<unsigned int>(StringEncode(wcs, codePage).size()); - std::string imeCaret(StringEncode(wcs.substr(0, imc.GetImeCaretPos()), codePage)); - int toImeCaret = static_cast<unsigned int>(imeCaret.size()); - MoveImeCarets(- toImeStart + toImeCaret); + int imeEndToImeCaretU16 = imc.GetImeCaretPos() - static_cast<unsigned int>(wcs.size()); + int imeCaretPosDoc = pdoc->GetRelativePositionUTF16(CurrentPosition(), imeEndToImeCaretU16); + + MoveImeCarets(- CurrentPosition() + imeCaretPosDoc); if (KoreanIME()) { view.imeCaretBlockOverride = true; |