diff options
| -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;  | 
