aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorjohnsonj <unknown>2016-04-14 23:21:56 +1000
committerjohnsonj <unknown>2016-04-14 23:21:56 +1000
commit483bbe47309348d096388379c1ad03e2082f647f (patch)
tree262eb1745b5b08c52a2664c2e34756b283826140
parent2af8e440eb93ba6e03de7b495bfce70016ed5868 (diff)
downloadscintilla-mirror-483bbe47309348d096388379c1ad03e2082f647f.tar.gz
Simplified IME caret positioning.
-rw-r--r--gtk/ScintillaGTK.cxx20
-rw-r--r--qt/ScintillaEditBase/ScintillaEditBase.cpp19
-rw-r--r--win32/ScintillaWin.cxx8
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;