From c4a842244c93ac95d890b9bcc001f4174cf39b8a Mon Sep 17 00:00:00 2001 From: chengzhi Date: Mon, 8 May 2023 22:35:33 +1000 Subject: On Qt for Cocoa, fix crash in entry of multi-character strings with IME. https://github.com/dail8859/NotepadNext/issues/194 https://github.com/dail8859/NotepadNext/pull/372 --- qt/ScintillaEditBase/ScintillaEditBase.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'qt/ScintillaEditBase/ScintillaEditBase.cpp') diff --git a/qt/ScintillaEditBase/ScintillaEditBase.cpp b/qt/ScintillaEditBase/ScintillaEditBase.cpp index b58a118aa..f789af727 100644 --- a/qt/ScintillaEditBase/ScintillaEditBase.cpp +++ b/qt/ScintillaEditBase/ScintillaEditBase.cpp @@ -268,8 +268,15 @@ void ScintillaEditBase::keyPressEvent(QKeyEvent *event) QString text = event->text(); if (input && !text.isEmpty() && text[0].isPrint()) { - QByteArray utext = sqt->BytesForDocument(text); - sqt->InsertCharacter(std::string_view(utext.data(), utext.size()), CharacterSource::DirectInput); + const int strLen = text.length(); + for (int i = 0; i < strLen;) { + const int ucWidth = text.at(i).isHighSurrogate() ? 2 : 1; + const QString oneCharUTF16 = text.mid(i, ucWidth); + const QByteArray oneChar = sqt->BytesForDocument(oneCharUTF16); + + sqt->InsertCharacter(std::string_view(oneChar.data(), oneChar.length()), CharacterSource::DirectInput); + i += ucWidth; + } } else { event->ignore(); } -- cgit v1.2.3