From 2a15b94200abe8ee0df2dddc296f3dafd55655f8 Mon Sep 17 00:00:00 2001 From: mitchell Date: Thu, 11 Jul 2019 14:12:28 -0400 Subject: Backport: Bug [#2038]. Source of input reported in SCN_CHARADDED. This may be SC_CHARACTERSOURCE_DIRECT_INPUT, SC_CHARACTERSOURCE_TENTATIVE_INPUT, or SC_CHARACTERSOURCE_IME_RESULT. Backport of changeset 7613:4cfac35c71bd. --- cocoa/ScintillaCocoa.h | 2 +- cocoa/ScintillaCocoa.mm | 6 ++--- cocoa/ScintillaView.mm | 8 +++--- curses/ScintillaCurses.cxx | 9 +++++-- doc/ScintillaDoc.html | 42 ++++++++++++++++++++++++++++-- doc/ScintillaHistory.html | 5 ++++ gtk/ScintillaGTK.cxx | 7 ++--- include/Scintilla.h | 4 +++ include/Scintilla.iface | 11 +++++++- qt/ScintillaEditBase/ScintillaEditBase.cpp | 9 +++---- src/EditModel.h | 1 + src/Editor.cxx | 13 ++++----- src/Editor.h | 4 +-- src/ScintillaBase.cxx | 8 +++--- src/ScintillaBase.h | 2 +- win32/ScintillaWin.cxx | 27 +++++++++---------- 16 files changed, 106 insertions(+), 52 deletions(-) diff --git a/cocoa/ScintillaCocoa.h b/cocoa/ScintillaCocoa.h index 9a74cb6f3..7e91f4c1a 100644 --- a/cocoa/ScintillaCocoa.h +++ b/cocoa/ScintillaCocoa.h @@ -199,7 +199,7 @@ public: void ObserverRemove(); void IdleWork() override; void QueueIdleWork(WorkNeeded::workItems items, Sci::Position upTo) override; - ptrdiff_t InsertText(NSString *input); + ptrdiff_t InsertText(NSString *input, CharacterSource charSource); NSRange PositionsFromCharacters(NSRange rangeCharacters) const; NSRange CharactersFromPositions(NSRange rangePositions) const; NSString *RangeTextAsString(NSRange rangePositions) const; diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm index b1b44ea00..b40743dad 100644 --- a/cocoa/ScintillaCocoa.mm +++ b/cocoa/ScintillaCocoa.mm @@ -2279,7 +2279,7 @@ bool ScintillaCocoa::KeyboardInput(NSEvent* event) /** * Used to insert already processed text provided by the Cocoa text input system. */ -ptrdiff_t ScintillaCocoa::InsertText(NSString *input) { +ptrdiff_t ScintillaCocoa::InsertText(NSString *input, CharacterSource charSource) { CFStringEncoding encoding = EncodingFromCharacterSet(IsUnicodeMode(), vs.styles[STYLE_DEFAULT].characterSet); std::string encoded = EncodedBytesString((CFStringRef)input, encoding); @@ -2292,11 +2292,11 @@ ptrdiff_t ScintillaCocoa::InsertText(NSString *input) { while (sv.length()) { const unsigned char leadByte = sv[0]; const unsigned int bytesInCharacter = UTF8BytesOfLead[leadByte]; - InsertCharacter(sv.c_str(), bytesInCharacter); + InsertCharacter(sv.c_str(), bytesInCharacter, charSource); sv = sv.substr(bytesInCharacter, sv.length()); } } else { - InsertCharacter(encoded.c_str(), static_cast(encoded.length())); + InsertCharacter(encoded.c_str(), static_cast(encoded.length()), charSource); } } return encoded.length(); diff --git a/cocoa/ScintillaView.mm b/cocoa/ScintillaView.mm index ad8d7dc01..12e0495d6 100644 --- a/cocoa/ScintillaView.mm +++ b/cocoa/ScintillaView.mm @@ -565,7 +565,7 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) else if ([aString isKindOfClass:[NSAttributedString class]]) newText = (NSString*) [aString string]; - mOwner.backend->InsertText(newText); + mOwner.backend->InsertText(newText, EditModel::CharacterSource::directInput); } //-------------------------------------------------------------------------------------------------- @@ -674,7 +674,7 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) NSRange posRangeCurrent = mOwner.backend->PositionsFromCharacters(NSMakeRange(replacementRange.location, 0)); // Note: Scintilla internally works almost always with bytes instead chars, so we need to take // this into account when determining selection ranges and such. - ptrdiff_t lengthInserted = mOwner.backend->InsertText(newText); + ptrdiff_t lengthInserted = mOwner.backend->InsertText(newText, EditModel::CharacterSource::tentativeInput); posRangeCurrent.length = lengthInserted; mMarkedTextRange = mOwner.backend->CharactersFromPositions(posRangeCurrent); // Mark the just inserted text. Keep the marked range for later reset. @@ -2139,9 +2139,9 @@ sourceOperationMaskForDraggingContext: (NSDraggingContext) context - (void)insertText: (id) aString { if ([aString isKindOfClass:[NSString class]]) - mBackend->InsertText(aString); + mBackend->InsertText(aString, EditModel::CharacterSource::directInput); else if ([aString isKindOfClass:[NSAttributedString class]]) - mBackend->InsertText([aString string]); + mBackend->InsertText([aString string], EditModel::CharacterSource::directInput); } //-------------------------------------------------------------------------------------------------- diff --git a/curses/ScintillaCurses.cxx b/curses/ScintillaCurses.cxx index 4941ba344..3325d881b 100644 --- a/curses/ScintillaCurses.cxx +++ b/curses/ScintillaCurses.cxx @@ -1069,8 +1069,13 @@ public: char utf8[6]; int len; toutf8(key, utf8, &len); - return (InsertCharacter(utf8, len), 1); - } else return (AddChar(key), 1); + InsertCharacter(utf8, len, EditModel::CharacterSource::directInput); + return 1; + } else { + char ch = static_cast(key); + InsertCharacter(&ch, 1, EditModel::CharacterSource::directInput); + return 1; + } } else { SCNotification scn = {}; scn.nmhdr.code = SCN_KEY; diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index 3252c7823..21b288a21 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -3815,7 +3815,7 @@ struct Sci_TextToFind { Scintilla may ignore this call in some cases. For example, the inline behaviour might only be supported for some languages.

When the inline IME mode is active, characters are added tentatively before being finalised and an SCN_CHARADDED - notification is sent for each character.

+ notification (with characterSource set to SC_CHARACTERSOURCE_TENTATIVE_INPUT) is sent for each character.

SCI_GRABFOCUS
SCI_SETFOCUS(bool focus)
@@ -7303,7 +7303,7 @@ struct SCNotification { int updated; /* SCN_UPDATEUI */ int listCompletionMethod; /* SCN_AUTOCSELECTION, SCN_AUTOCCOMPLETED, SCN_USERLISTSELECTION */ - + int characterSource; /* SCN_CHARADDED */ }; @@ -7405,6 +7405,44 @@ href="#SCI_POSITIONFROMLINE">SCI_POSITIONFROMLINE(lineNumber); for DBCS, it is (first byte * 256 + second byte) for 2 byte characters and the byte value for 1 byte characters. This notification is sent before the character has been styled so processing that depends on styling should instead be performed in the SCN_UPDATEUI notification.

+

The SCNotification::characterSource field is the source of the character.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SymbolValueMeaning
SC_CHARACTERSOURCE_DIRECT_INPUT0Direct input characters, including characters generated by calling keyboard commands like SCI_NEWLINE.
SC_CHARACTERSOURCE_TENTATIVE_INPUT1Tentative input characters. They are used by IME (inline mode, see SCI_SETIMEINTERACTION) + to composite final string, normally different from final composited string (which is the string that has been truly added into current document), + and may be withdrawn when the user cancels typing (e.g. by pressing Esc key). + Some system (at least Cocoa) also use tentative input for non-IME features like using dead key to composite diacritical marks (grave accent, etc.). + These characters are not added to macro recording. Most applications can simply ignore the notification when this value is set. +
SC_CHARACTERSOURCE_IME_RESULT2IME (either inline or windowed mode) full composited string. Modern IME is able to composite English word or sentence, + when this value is set, current character may not a Chinese, Japanese or Korean character. + Currently, this is only set on Windows.

SCN_SAVEPOINTREACHED
SCN_SAVEPOINTLEFT
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 1e7992cdc..2594f70c5 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -559,6 +559,11 @@ Feature #1297.

  • + Source of input (direct / IME composition / IME result) reported in SCN_CHARADDED so applications + can treat temporary IME composition input differently. + Bug #2038. +
  • +
  • Lexer added for DataFlex. Feature #1295.
  • diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index eab650179..9e3410450 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -2350,7 +2350,7 @@ void ScintillaGTK::CommitThis(char *commitStr) { if (!IsUnicodeMode()) docChar = ConvertText(u8Char, u8CharLen, charSetSource, "UTF-8", true); - InsertCharacter(docChar.c_str(), docChar.size()); + InsertCharacter(docChar.c_str(), docChar.size(), CharacterSource::directInput); } g_free(uniStr); ShowCaretAtCurrentPosition(); @@ -2403,8 +2403,6 @@ void ScintillaGTK::PreeditChangedInlineThis() { std::vector indicator = MapImeIndicators(preeditStr.attrs, preeditStr.str); - const bool tmpRecordingMacro = recordingMacro; - recordingMacro = false; for (glong i = 0; i < preeditStr.uniStrLen; i++) { gchar u8Char[UTF8MaxBytes+2] = {0}; const gint u8CharLen = g_unichar_to_utf8(preeditStr.uniStr[i], u8Char); @@ -2412,11 +2410,10 @@ void ScintillaGTK::PreeditChangedInlineThis() { if (!IsUnicodeMode()) docChar = ConvertText(u8Char, u8CharLen, charSetSource, "UTF-8", true); - InsertCharacter(docChar.c_str(), docChar.size()); + InsertCharacter(docChar.c_str(), docChar.size(), CharacterSource::tentativeInput); DrawImeIndicator(indicator[i], docChar.size()); } - recordingMacro = tmpRecordingMacro; // Move caret to ime cursor position. const int imeEndToImeCaretU32 = preeditStr.cursor_pos - preeditStr.uniStrLen; diff --git a/include/Scintilla.h b/include/Scintilla.h index 5d535ae76..2c9a8ac43 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -1093,6 +1093,9 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SC_AC_TAB 3 #define SC_AC_NEWLINE 4 #define SC_AC_COMMAND 5 +#define SC_CHARACTERSOURCE_DIRECT_INPUT 0 +#define SC_CHARACTERSOURCE_TENTATIVE_INPUT 1 +#define SC_CHARACTERSOURCE_IME_RESULT 2 #define SCN_STYLENEEDED 2000 #define SCN_CHARADDED 2001 #define SCN_SAVEPOINTREACHED 2002 @@ -1230,6 +1233,7 @@ struct SCNotification { int updated; /* SCN_UPDATEUI */ int listCompletionMethod; /* SCN_AUTOCSELECTION, SCN_AUTOCCOMPLETED, SCN_USERLISTSELECTION, */ + int characterSource; /* SCN_CHARADDED */ }; #ifdef INCLUDE_DEPRECATED_FEATURES diff --git a/include/Scintilla.iface b/include/Scintilla.iface index 10ac9091e..7280f71b8 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -3024,6 +3024,15 @@ val SC_AC_COMMAND=5 ali SC_AC_FILLUP=FILL_UP ali SC_AC_DOUBLECLICK=DOUBLE_CLICK +# characterSource for SCN_CHARADDED +enu CharacterSource=SC_CHARACTERSOURCE_ +# Direct input characters. +val SC_CHARACTERSOURCE_DIRECT_INPUT=0 +# IME (inline mode) or dead key tentative input characters. +val SC_CHARACTERSOURCE_TENTATIVE_INPUT=1 +# IME (either inline or windowed mode) full composited string. +val SC_CHARACTERSOURCE_IME_RESULT=2 + ################################################ # For SciLexer.h enu Lexer=SCLEX_ @@ -5173,7 +5182,7 @@ val SCE_DF_ICODE=14 # Events evt void StyleNeeded=2000(int position) -evt void CharAdded=2001(int ch) +evt void CharAdded=2001(int ch, int characterSource) evt void SavePointReached=2002(void) evt void SavePointLeft=2003(void) evt void ModifyAttemptRO=2004(void) diff --git a/qt/ScintillaEditBase/ScintillaEditBase.cpp b/qt/ScintillaEditBase/ScintillaEditBase.cpp index 5a80b1ddd..ccc20b18d 100644 --- a/qt/ScintillaEditBase/ScintillaEditBase.cpp +++ b/qt/ScintillaEditBase/ScintillaEditBase.cpp @@ -259,7 +259,7 @@ void ScintillaEditBase::keyPressEvent(QKeyEvent *event) QString text = event->text(); if (input && !text.isEmpty() && text[0].isPrint()) { QByteArray utext = sqt->BytesForDocument(text); - sqt->InsertCharacter(utext.data(), utext.size()); + sqt->InsertCharacter(utext.data(), utext.size(), EditModel::CharacterSource::directInput); } else { event->ignore(); } @@ -549,7 +549,7 @@ void ScintillaEditBase::inputMethodEvent(QInputMethodEvent *event) const QString oneCharUTF16 = commitStr.mid(i, ucWidth); const QByteArray oneChar = sqt->BytesForDocument(oneCharUTF16); - sqt->InsertCharacter(oneChar.data(), oneChar.length()); + sqt->InsertCharacter(oneChar.data(), oneChar.length(), EditModel::CharacterSource::directInput); i += ucWidth; } @@ -567,20 +567,17 @@ void ScintillaEditBase::inputMethodEvent(QInputMethodEvent *event) std::vector imeIndicator = MapImeIndicators(event); - const bool recording = sqt->recordingMacro; - sqt->recordingMacro = false; for (unsigned int i = 0; i < preeditStrLen;) { const unsigned int ucWidth = preeditStr.at(i).isHighSurrogate() ? 2 : 1; const QString oneCharUTF16 = preeditStr.mid(i, ucWidth); const QByteArray oneChar = sqt->BytesForDocument(oneCharUTF16); const int oneCharLen = oneChar.length(); - sqt->InsertCharacter(oneChar.data(), oneCharLen); + sqt->InsertCharacter(oneChar.data(), oneCharLen, EditModel::CharacterSource::tentativeInput); DrawImeIndicator(imeIndicator[i], oneCharLen); i += ucWidth; } - sqt->recordingMacro = recording; // Move IME carets. int imeCaretPos = GetImeCaretPos(event); diff --git a/src/EditModel.h b/src/EditModel.h index ab5c23cdb..9aee35a62 100644 --- a/src/EditModel.h +++ b/src/EditModel.h @@ -37,6 +37,7 @@ public: bool primarySelection; enum IMEInteraction { imeWindowed, imeInline } imeInteraction; + enum class CharacterSource { directInput, tentativeInput, imeResult }; int foldFlags; int foldDisplayTextStyle; diff --git a/src/Editor.cxx b/src/Editor.cxx index e963ba339..4cceb1f5d 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1888,7 +1888,7 @@ void Editor::AddChar(char ch) { char s[2]; s[0] = ch; s[1] = '\0'; - InsertCharacter(s, 1); + InsertCharacter(s, 1, CharacterSource::directInput); } void Editor::FilterSelections() { @@ -1899,7 +1899,7 @@ void Editor::FilterSelections() { } // InsertCharacter inserts a character encoded in document code page. -void Editor::InsertCharacter(const char *s, unsigned int len) { +void Editor::InsertCharacter(const char *s, unsigned int len, CharacterSource charSource) { if (len == 0) { return; } @@ -1991,9 +1991,9 @@ void Editor::InsertCharacter(const char *s, unsigned int len) { ch = utf32[0]; } } - NotifyChar(ch); + NotifyChar(ch, charSource); - if (recordingMacro) { + if (recordingMacro && charSource != CharacterSource::tentativeInput) { std::string copy(s, len); // ensure NUL-terminated NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast(copy.data())); } @@ -2339,10 +2339,11 @@ void Editor::NotifyErrorOccurred(Document *, void *, int status) { errorStatus = status; } -void Editor::NotifyChar(int ch) { +void Editor::NotifyChar(int ch, CharacterSource charSource) { SCNotification scn = {}; scn.nmhdr.code = SCN_CHARADDED; scn.ch = ch; + scn.characterSource = static_cast(charSource); NotifyParent(scn); } @@ -3088,7 +3089,7 @@ void Editor::NewLine() { for (size_t i = 0; i < countInsertions; i++) { const char *eol = StringFromEOLMode(pdoc->eolMode); while (*eol) { - NotifyChar(*eol); + NotifyChar(*eol, CharacterSource::directInput); if (recordingMacro) { char txt[2]; txt[0] = *eol; diff --git a/src/Editor.h b/src/Editor.h index 9c3f3934c..4077fa1a4 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -393,7 +393,7 @@ protected: // ScintillaBase subclass needs access to much of Editor Sci::Position RealizeVirtualSpace(Sci::Position position, Sci::Position virtualSpace); SelectionPosition RealizeVirtualSpace(const SelectionPosition &position); void AddChar(char ch); - virtual void InsertCharacter(const char *s, unsigned int len); + virtual void InsertCharacter(const char *s, unsigned int len, CharacterSource charSource); void ClearBeforeTentativeStart(); void InsertPaste(const char *text, Sci::Position len); enum PasteShape { pasteStream=0, pasteRectangular = 1, pasteLine = 2 }; @@ -421,7 +421,7 @@ protected: // ScintillaBase subclass needs access to much of Editor virtual int GetCtrlID() { return ctrlID; } virtual void NotifyParent(SCNotification scn) = 0; virtual void NotifyStyleToNeeded(Sci::Position endStyleNeeded); - void NotifyChar(int ch); + void NotifyChar(int ch, CharacterSource charSource); void NotifySavePoint(bool isSavePoint); void NotifyModifyAttempt(); virtual void NotifyDoubleClick(Point pt, int modifiers); diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index a72267d32..1e7695d5f 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -79,20 +79,20 @@ void ScintillaBase::Finalise() { } void ScintillaBase::AddCharUTF(const char *s, unsigned int len, bool /*treatAsDBCS*/) { - InsertCharacter(s, len); + InsertCharacter(s, len, CharacterSource::directInput); } -void ScintillaBase::InsertCharacter(const char *s, unsigned int len) { +void ScintillaBase::InsertCharacter(const char *s, unsigned int len, CharacterSource charSource) { const bool isFillUp = ac.Active() && ac.IsFillUpChar(s[0]); if (!isFillUp) { - Editor::InsertCharacter(s, len); + Editor::InsertCharacter(s, len, charSource); } if (ac.Active()) { AutoCompleteCharacterAdded(s[0]); // For fill ups add the character after the autocompletion has // triggered so containers see the key so can display a calltip. if (isFillUp) { - Editor::InsertCharacter(s, len); + Editor::InsertCharacter(s, len, charSource); } } } diff --git a/src/ScintillaBase.h b/src/ScintillaBase.h index dc1438155..e922ab057 100644 --- a/src/ScintillaBase.h +++ b/src/ScintillaBase.h @@ -64,7 +64,7 @@ protected: // This method is deprecated, use InsertCharacter instead. The treatAsDBCS parameter is no longer used. virtual void AddCharUTF(const char *s, unsigned int len, bool treatAsDBCS=false); - void InsertCharacter(const char *s, unsigned int len) override; + void InsertCharacter(const char *s, unsigned int len, CharacterSource charSource) override; void Command(int cmdId); void CancelModes() override; int KeyCommand(unsigned int iMessage) override; diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index e2cb3b4a2..ebfe89ad4 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -328,7 +328,7 @@ class ScintillaWin : static int MouseModifiers(uptr_t wParam) noexcept; Sci::Position TargetAsUTF8(char *text) const; - void AddCharUTF16(wchar_t const *wcs, unsigned int wclen); + void AddCharUTF16(wchar_t const *wcs, unsigned int wclen, CharacterSource charSource); Sci::Position EncodedFromUTF8(const char *utf8, char *encoded) const; sptr_t WndPaint(); @@ -341,7 +341,7 @@ class ScintillaWin : void SelectionToHangul(); void EscapeHanja(); void ToggleHanja(); - void AddWString(std::wstring wcs); + void AddWString(std::wstring wcs, CharacterSource charSource); UINT CodePageOfDocument() const; bool ValidCodePage(int codePage) const override; @@ -816,20 +816,20 @@ Sci::Position ScintillaWin::EncodedFromUTF8(const char *utf8, char *encoded) con // Add one character from a UTF-16 string, by converting to either UTF-8 or // the current codepage. Code is similar to HandleCompositionWindowed(). -void ScintillaWin::AddCharUTF16(wchar_t const *wcs, unsigned int wclen) { +void ScintillaWin::AddCharUTF16(wchar_t const *wcs, unsigned int wclen, CharacterSource charSource) { if (IsUnicodeMode()) { size_t len = UTF8Length(wcs, wclen); char utfval[maxLenInputIME * 3]; UTF8FromUTF16(wcs, wclen, utfval, len); utfval[len] = '\0'; - AddCharUTF(utfval, static_cast(len)); + InsertCharacter(utfval, static_cast(len), charSource); } else { const UINT cpDest = CodePageOfDocument(); char inBufferCP[maxLenInputIME * 2]; const int size = ::WideCharToMultiByte(cpDest, 0, wcs, wclen, inBufferCP, sizeof(inBufferCP) - 1, 0, 0); for (int i=0; i MapImeIndicators(std::vector inputStyle) { } -void ScintillaWin::AddWString(std::wstring wcs) { +void ScintillaWin::AddWString(std::wstring wcs, CharacterSource charSource) { if (wcs.empty()) return; @@ -1059,7 +1059,7 @@ void ScintillaWin::AddWString(std::wstring wcs) { const std::wstring uniChar(wcs, i, ucWidth); std::string docChar = StringEncode(uniChar, codePage); - InsertCharacter(docChar.c_str(), static_cast(docChar.size())); + InsertCharacter(docChar.c_str(), static_cast(docChar.size()), charSource); i += ucWidth; } } @@ -1100,20 +1100,17 @@ sptr_t ScintillaWin::HandleCompositionInline(uptr_t, sptr_t lParam) { std::vector imeIndicator = MapImeIndicators(imc.GetImeAttributes()); - const bool tmpRecordingMacro = recordingMacro; - recordingMacro = false; const 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, codePage); - InsertCharacter(docChar.c_str(), static_cast(docChar.size())); + InsertCharacter(docChar.c_str(), static_cast(docChar.size()), CharacterSource::tentativeInput); DrawImeIndicator(imeIndicator[i], static_cast(docChar.size())); i += ucWidth; } - recordingMacro = tmpRecordingMacro; // Move IME caret from current last position to imeCaretPos. const int imeEndToImeCaretU16 = imc.GetImeCaretPos() - static_cast(wcs.size()); @@ -1125,7 +1122,7 @@ sptr_t ScintillaWin::HandleCompositionInline(uptr_t, sptr_t lParam) { view.imeCaretBlockOverride = true; } } else if (lParam & GCS_RESULTSTR) { - AddWString(imc.GetCompositionString(GCS_RESULTSTR)); + AddWString(imc.GetCompositionString(GCS_RESULTSTR), CharacterSource::imeResult); } EnsureCaretVisible(); SetCandidateWindowPos(); @@ -1486,7 +1483,7 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam lastHighSurrogateChar = 0; wclen = 2; } - AddCharUTF16(wcs, wclen); + AddCharUTF16(wcs, wclen, CharacterSource::directInput); } return 0; @@ -1498,7 +1495,7 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam } else { wchar_t wcs[3] = {0}; const unsigned int wclen = UTF16FromUTF32Character(static_cast(wParam), wcs); - AddCharUTF16(wcs, wclen); + AddCharUTF16(wcs, wclen, CharacterSource::directInput); return FALSE; } -- cgit v1.2.3