From 99800d1c26d344983cd27bdf10f71d3572d3d2b8 Mon Sep 17 00:00:00 2001 From: johnsonj Date: Tue, 9 Feb 2016 23:27:08 +1100 Subject: Simplified IME caret position discovery. --- win32/ScintillaWin.cxx | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index d8506f50d..c9a712df2 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -1077,31 +1077,27 @@ sptr_t ScintillaWin::HandleCompositionInline(uptr_t, sptr_t lParam) { std::vector imeIndicator = MapImeIndicators(imc.GetImeAttributes()); - // Display character by character. - int numBytes = 0; - int imeCharPos[maxLenInputIME + 1] = { 0 }; - bool tmpRecordingMacro = recordingMacro; recordingMacro = false; + int codePage = CodePageOfDocument(); for (size_t i = 0; i < wcs.size(); ) { const size_t ucWidth = UTF16CharLength(wcs[i]); const std::wstring uniChar(wcs, i, ucWidth); - std::string docChar = StringEncode(uniChar, CodePageOfDocument()); + std::string docChar = StringEncode(uniChar, codePage); AddCharUTF(docChar.c_str(), static_cast(docChar.size())); - // Record compstr character positions for moving IME carets. - numBytes += static_cast(docChar.size()); - imeCharPos[i + ucWidth] = numBytes; - DrawImeIndicator(imeIndicator[i], static_cast(docChar.size())); i += ucWidth; } recordingMacro = tmpRecordingMacro; - // Move IME caret position. - unsigned int imeCursorPos = imc.GetImeCaretPos(); - MoveImeCarets(-imeCharPos[wcs.size()] + imeCharPos[imeCursorPos]); + // Move IME caret from current last position to imeCaretPos. + int toImeStart = static_cast(StringEncode(wcs, codePage).size()); + std::string imeCaret(StringEncode(wcs.substr(0, imc.GetImeCaretPos()), codePage)); + int toImeCaret = static_cast(imeCaret.size()); + MoveImeCarets(- toImeStart + toImeCaret); + if (KoreanIME()) { view.imeCaretBlockOverride = true; } -- cgit v1.2.3