diff --git a/Build/Notepad3.ini b/Build/Notepad3.ini index 18d6e3d0a..48a363964 100644 Binary files a/Build/Notepad3.ini and b/Build/Notepad3.ini differ diff --git a/language/np3_fr_fr/menu_fr_fr.rc b/language/np3_fr_fr/menu_fr_fr.rc index 4361ba102..094bfb251 100644 Binary files a/language/np3_fr_fr/menu_fr_fr.rc and b/language/np3_fr_fr/menu_fr_fr.rc differ diff --git a/language/np3_ja_jp/menu_ja_jp.rc b/language/np3_ja_jp/menu_ja_jp.rc index aee8aeb25..28ab21638 100644 Binary files a/language/np3_ja_jp/menu_ja_jp.rc and b/language/np3_ja_jp/menu_ja_jp.rc differ diff --git a/language/np3_nl_nl/menu_nl_nl.rc b/language/np3_nl_nl/menu_nl_nl.rc index c90868019..464c146dd 100644 Binary files a/language/np3_nl_nl/menu_nl_nl.rc and b/language/np3_nl_nl/menu_nl_nl.rc differ diff --git a/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini b/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini index 18d6e3d0a..48a363964 100644 Binary files a/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini and b/np3portableapp/Notepad3Portable/App/DefaultData/settings/Notepad3.ini differ diff --git a/scintilla/include/SciLexer.h b/scintilla/include/SciLexer.h index 0950a72f8..a030d65a4 100644 --- a/scintilla/include/SciLexer.h +++ b/scintilla/include/SciLexer.h @@ -1541,27 +1541,6 @@ #define SCE_TXT2TAGS_OPTION 23 #define SCE_TXT2TAGS_PREPROC 24 #define SCE_TXT2TAGS_POSTPROC 25 -#define SCE_AHK_DEFAULT 0 -#define SCE_AHK_COMMENTLINE 1 -#define SCE_AHK_COMMENTBLOCK 2 -#define SCE_AHK_ESCAPE 3 -#define SCE_AHK_SYNOPERATOR 4 -#define SCE_AHK_EXPOPERATOR 5 -#define SCE_AHK_STRING 6 -#define SCE_AHK_NUMBER 7 -#define SCE_AHK_IDENTIFIER 8 -#define SCE_AHK_VARREF 9 -#define SCE_AHK_LABEL 10 -#define SCE_AHK_WORD_CF 11 -#define SCE_AHK_WORD_CMD 12 -#define SCE_AHK_WORD_FN 13 -#define SCE_AHK_WORD_DIR 14 -#define SCE_AHK_WORD_KB 15 -#define SCE_AHK_WORD_VAR 16 -#define SCE_AHK_WORD_SP 17 -#define SCE_AHK_WORD_UD 18 -#define SCE_AHK_VARREFKW 19 -#define SCE_AHK_ERROR 20 #define SCE_A68K_DEFAULT 0 #define SCE_A68K_COMMENT 1 #define SCE_A68K_NUMBER_DEC 2 diff --git a/scintilla/include/Scintilla.h b/scintilla/include/Scintilla.h index 396f4120b..9b452c70a 100644 --- a/scintilla/include/Scintilla.h +++ b/scintilla/include/Scintilla.h @@ -103,6 +103,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SC_IME_INLINE 1 #define SCI_GETIMEINTERACTION 2678 #define SCI_SETIMEINTERACTION 2679 +#define SCI_ISIMEOPEN 2717 +#define SCI_ISIMEMODECJK 2718 #define MARKER_MAX 31 #define SC_MARK_CIRCLE 0 #define SC_MARK_ROUNDRECT 1 @@ -399,9 +401,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCI_GETPRINTCOLOURMODE 2149 #define SCFIND_WHOLEWORD 0x2 #define SCFIND_MATCHCASE 0x4 -// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #define SCFIND_DOT_MATCH_ALL 0x1000 -// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< #define SCFIND_WORDSTART 0x00100000 #define SCFIND_REGEXP 0x00200000 #define SCFIND_POSIX 0x00400000 @@ -691,10 +691,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SC_POPUP_TEXT 2 #define SCI_USEPOPUP 2371 #define SCI_SELECTIONISRECTANGLE 2372 -// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #define SC_MIN_ZOOM_LEVEL 10 #define SC_MAX_ZOOM_LEVEL 500 -// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< #define SCI_SETZOOM 2373 #define SCI_GETZOOM 2374 #define SC_DOCUMENTOPTION_DEFAULT 0 @@ -1046,11 +1044,6 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SC_MOD_INSERTCHECK 0x100000 #define SC_MOD_CHANGETABSTOPS 0x200000 #define SC_MODEVENTMASKALL 0x3FFFFF -// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> -#define SC_CHARADDED_NORMAL 0 -#define SC_CHARADDED_TENTATIVE 1 -#define SC_CHARADDED_IME 2 -// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< #define SC_UPDATE_CONTENT 0x1 #define SC_UPDATE_SELECTION 0x2 #define SC_UPDATE_V_SCROLL 0x4 diff --git a/scintilla/include/Scintilla.iface b/scintilla/include/Scintilla.iface index 6eb3ea2ef..e96e5a6a6 100644 --- a/scintilla/include/Scintilla.iface +++ b/scintilla/include/Scintilla.iface @@ -266,6 +266,11 @@ get int GetIMEInteraction=2678(,) # Choose to display the the IME in a winow or inline. set void SetIMEInteraction=2679(int imeInteraction,) +# >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> +get bool IsIMEOpen=2717(,) +get bool IsIMEModeCJK=2718(,) +# <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< + enu MarkerSymbol=SC_MARK_ val MARKER_MAX=31 val SC_MARK_CIRCLE=0 @@ -949,6 +954,9 @@ get int GetPrintColourMode=2149(,) enu FindOption=SCFIND_ val SCFIND_WHOLEWORD=0x2 val SCFIND_MATCHCASE=0x4 +# >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> +val SCFIND_DOT_MATCH_ALL=0x1000 +# <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< val SCFIND_WORDSTART=0x00100000 val SCFIND_REGEXP=0x00200000 val SCFIND_POSIX=0x00400000 @@ -2766,13 +2774,6 @@ val SC_MOD_INSERTCHECK=0x100000 val SC_MOD_CHANGETABSTOPS=0x200000 val SC_MODEVENTMASKALL=0x3FFFFF -// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> -# modifiers for SCN_CHARADDED: normal input, inline IME tentative, IME full composited -val SC_CHARADDED_NORMAL=0 -val SC_CHARADDED_TENTATIVE=1 -val SC_CHARADDED_IME=2 -// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< - enu Update=SC_UPDATE_ val SC_UPDATE_CONTENT=0x1 val SC_UPDATE_SELECTION=0x2 @@ -4909,29 +4910,6 @@ val SCE_SAS_MACRO_KEYWORD=12 val SCE_SAS_BLOCK_KEYWORD=13 val SCE_SAS_MACRO_FUNCTION=14 val SCE_SAS_STATEMENT=15 -# Lexical states for SCLEX_AHK -lex AHK=SCLEX_AHK SCE_AHK_ -val SCE_AHK_DEFAULT=0 -val SCE_AHK_COMMENTLINE=1 -val SCE_AHK_COMMENTBLOCK=2 -val SCE_AHK_ESCAPE=3 -val SCE_AHK_SYNOPERATOR=4 -val SCE_AHK_EXPOPERATOR=5 -val SCE_AHK_STRING=6 -val SCE_AHK_NUMBER=7 -val SCE_AHK_IDENTIFIER=8 -val SCE_AHK_VARREF=9 -val SCE_AHK_LABEL=10 -val SCE_AHK_WORD_CF=11 -val SCE_AHK_WORD_CMD=12 -val SCE_AHK_WORD_FN=13 -val SCE_AHK_WORD_DIR=14 -val SCE_AHK_WORD_KB=15 -val SCE_AHK_WORD_VAR=16 -val SCE_AHK_WORD_SP=17 -val SCE_AHK_WORD_UD=18 -val SCE_AHK_VARREFKW=19 -val SCE_AHK_ERROR=20 # Events diff --git a/scintilla/src/Document.cxx b/scintilla/src/Document.cxx index 3d5ae2d49..44f301e90 100644 --- a/scintilla/src/Document.cxx +++ b/scintilla/src/Document.cxx @@ -296,7 +296,7 @@ Sci::Line Document::MarkerNext(Sci::Line lineStart, int mask) const { int Document::AddMark(Sci::Line line, int markerNum) { if (line >= 0 && line <= LinesTotal()) { const int prev = Markers()->AddMark(line, markerNum, LinesTotal()); - const DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + const DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, nullptr, line); NotifyModified(mh); return prev; } else { @@ -313,19 +313,19 @@ void Document::AddMarkSet(Sci::Line line, int valueSet) { if (m & 1) Markers()->AddMark(line, i, LinesTotal()); } - const DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + const DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, nullptr, line); NotifyModified(mh); } void Document::DeleteMark(Sci::Line line, int markerNum) { Markers()->DeleteMark(line, markerNum, false); - const DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + const DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, nullptr, line); NotifyModified(mh); } void Document::DeleteMarkFromHandle(int markerHandle) { Markers()->DeleteMarkFromHandle(markerHandle); - DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); + DocModification mh(SC_MOD_CHANGEMARKER); mh.line = -1; NotifyModified(mh); } @@ -337,7 +337,7 @@ void Document::DeleteAllMarks(int markerNum) { someChanges = true; } if (someChanges) { - DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); + DocModification mh(SC_MOD_CHANGEMARKER); mh.line = -1; NotifyModified(mh); } @@ -435,7 +435,7 @@ int SCI_METHOD Document::SetLevel(Sci_Position line, int level) { const int prev = Levels()->SetLevel(static_cast(line), level, LinesTotal()); if (prev != level) { DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER, - LineStart(line), 0, 0, 0, static_cast(line)); + LineStart(line), 0, 0, nullptr, static_cast(line)); mh.foldLevelNow = level; mh.foldLevelPrev = prev; NotifyModified(mh); @@ -2113,7 +2113,7 @@ const char *Document::SubstituteByPosition(const char *text, Sci::Position *leng if (regex) return regex->SubstituteByPosition(this, text, length); else - return 0; + return nullptr; } int Document::LineCharacterIndex() const { @@ -2255,7 +2255,7 @@ void Document::SetLexInterface(LexInterface *pLexInterface) { int SCI_METHOD Document::SetLineState(Sci_Position line, int state) { const int statePrevious = States()->SetLineState(static_cast(line), state); if (state != statePrevious) { - const DocModification mh(SC_MOD_CHANGELINESTATE, LineStart(line), 0, 0, 0, + const DocModification mh(SC_MOD_CHANGELINESTATE, LineStart(line), 0, 0, nullptr, static_cast(line)); NotifyModified(mh); } @@ -2304,7 +2304,7 @@ void Document::MarginSetStyles(Sci::Line line, const unsigned char *styles) { void Document::MarginClearAll() { const Sci::Line maxEditorLine = LinesTotal(); for (Sci::Line l=0; lClearAll(); } @@ -2347,7 +2347,7 @@ int Document::AnnotationLines(Sci::Line line) const { void Document::AnnotationClearAll() { const Sci::Line maxEditorLine = LinesTotal(); for (Sci::Line l=0; lClearAll(); } @@ -2980,7 +2980,6 @@ std::regex_constants::match_flag_type MatchFlags(const Document *doc, Sci::Posit template bool MatchOnLines(const Document *doc, const Regex ®exp, const RESearchRange &resr, RESearch &search) { - bool matched = false; std::match_results match; // MSVC and libc++ have problems with ^ and $ matching line ends inside a range. @@ -2994,9 +2993,10 @@ bool MatchOnLines(const Document *doc, const Regex ®exp, const RESearchRange Iterator itStart(doc, resr.startPos); Iterator itEnd(doc, resr.endPos); const std::regex_constants::match_flag_type flagsMatch = MatchFlags(doc, resr.startPos, resr.endPos); - matched = std::regex_search(itStart, itEnd, match, regexp, flagsMatch); + const bool matched = std::regex_search(itStart, itEnd, match, regexp, flagsMatch); #else // Line by line. + bool matched = false; for (Sci::Line line = resr.lineRangeStart; line != resr.lineRangeBreak; line += resr.increment) { const Range lineRange = resr.LineRange(line); Iterator itStart(doc, lineRange.start); diff --git a/scintilla/src/EditModel.cxx b/scintilla/src/EditModel.cxx index ef0be3681..70704e63d 100644 --- a/scintilla/src/EditModel.cxx +++ b/scintilla/src/EditModel.cxx @@ -63,7 +63,8 @@ EditModel::EditModel() : braces{} { primarySelection = true; imeInteraction = imeWindowed; // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> - charAddedSource = SC_CHARADDED_NORMAL; + imeIsOpen = false; + imeIsInModeCJK = false; // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< bidirectional = Bidirectional::bidiDisabled; foldFlags = 0; diff --git a/scintilla/src/EditModel.h b/scintilla/src/EditModel.h index e87b0ee15..7230cbfd3 100644 --- a/scintilla/src/EditModel.h +++ b/scintilla/src/EditModel.h @@ -38,7 +38,8 @@ public: enum IMEInteraction { imeWindowed, imeInline } imeInteraction; // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> - int charAddedSource; + bool imeIsOpen; + bool imeIsInModeCJK; // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< enum class Bidirectional { bidiDisabled, bidiL2R, bidiR2L } bidirectional; diff --git a/scintilla/src/Editor.cxx b/scintilla/src/Editor.cxx index af3b87068..60b51ba68 100644 --- a/scintilla/src/Editor.cxx +++ b/scintilla/src/Editor.cxx @@ -1959,28 +1959,23 @@ void Editor::AddCharUTF(const char *s, unsigned int len, bool treatAsDBCS) { SetLastXChosen(); } - // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> - // We don't handle inline IME tentative characters - if (charAddedSource != SC_CHARADDED_TENTATIVE) { - // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< - if (treatAsDBCS) { - NotifyChar((static_cast(s[0]) << 8) | - static_cast(s[1])); - } else if (len > 0) { - int byte = static_cast(s[0]); - if ((byte < 0xC0) || (1 == len)) { - // Handles UTF-8 characters between 0x01 and 0x7F and single byte - // characters when not in UTF-8 mode. - // Also treats \0 and naked trail bytes 0x80 to 0xBF as valid - // characters representing themselves. - } else { - unsigned int utf32[1] = { 0 }; - UTF32FromUTF8(std::string_view(s, len), utf32, std::size(utf32)); - byte = utf32[0]; - } - NotifyChar(byte); + if (treatAsDBCS) { + NotifyChar((static_cast(s[0]) << 8) | + static_cast(s[1])); + } else if (len > 0) { + int byte = static_cast(s[0]); + if ((byte < 0xC0) || (1 == len)) { + // Handles UTF-8 characters between 0x01 and 0x7F and single byte + // characters when not in UTF-8 mode. + // Also treats \0 and naked trail bytes 0x80 to 0xBF as valid + // characters representing themselves. + } else { + unsigned int utf32[1] = { 0 }; + UTF32FromUTF8(std::string_view(s, len), utf32, std::size(utf32)); + byte = utf32[0]; } - } // >>> NON STD SCI PATCH <<< + NotifyChar(byte); + } if (recordingMacro) { NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast(s)); @@ -2331,9 +2326,6 @@ void Editor::NotifyChar(int ch) { SCNotification scn = {}; scn.nmhdr.code = SCN_CHARADDED; scn.ch = ch; - // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> - scn.modifiers = charAddedSource; - // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< NotifyParent(scn); } @@ -6795,6 +6787,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETIMEINTERACTION: return imeInteraction; + +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> + case SCI_ISIMEOPEN: + return imeIsOpen; + + case SCI_ISIMEMODECJK: + return imeIsInModeCJK; +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< case SCI_SETBIDIRECTIONAL: // SCI_SETBIDIRECTIONAL is implemented on platform subclasses if they support bidirectional text. diff --git a/scintilla/win32/ScintillaWin.cxx b/scintilla/win32/ScintillaWin.cxx index caa36fd19..08bfdddf9 100644 --- a/scintilla/win32/ScintillaWin.cxx +++ b/scintilla/win32/ScintillaWin.cxx @@ -401,6 +401,10 @@ class ScintillaWin : sptr_t HandleCompositionWindowed(uptr_t wParam, sptr_t lParam); sptr_t HandleCompositionInline(uptr_t wParam, sptr_t lParam); static bool KoreanIME() noexcept; +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> + bool IsIMEOpen(); + DWORD GetIMEInputMode(); +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< void MoveImeCarets(Sci::Position offset); void DrawImeIndicator(int indicator, int len); void SetCandidateWindowPos(); @@ -1007,9 +1011,7 @@ sptr_t ScintillaWin::HandleCompositionWindowed(uptr_t wParam, sptr_t lParam) { if (lParam & GCS_RESULTSTR) { IMContext imc(MainHWND()); if (imc.hIMC) { - charAddedSource = SC_CHARADDED_IME; AddWString(imc.GetCompositionString(GCS_RESULTSTR)); - charAddedSource = SC_CHARADDED_NORMAL; // Set new position after converted const Point pos = PointMainCaret(); @@ -1028,6 +1030,29 @@ bool ScintillaWin::KoreanIME() noexcept { return codePage == 949 || codePage == 1361; } +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> +bool ScintillaWin::IsIMEOpen() { + IMContext imc(MainHWND()); + if (imc.hIMC) { + if (ImmGetOpenStatus(imc.hIMC)) { + return true; + } + } + return false; +} + +DWORD ScintillaWin::GetIMEInputMode() { + IMContext imc(MainHWND()); + if (imc.hIMC && ImmGetOpenStatus(imc.hIMC)) { + DWORD dwConversion = IME_CMODE_ALPHANUMERIC, dwSentence = IME_SMODE_NONE; + if (ImmGetConversionStatus(imc.hIMC, &dwConversion, &dwSentence)) { + return dwConversion; + } + } + return 0; +} +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< + void ScintillaWin::MoveImeCarets(Sci::Position offset) { // Move carets relatively by bytes. for (size_t r = 0; r < sel.Count(); r++) { @@ -1215,7 +1240,6 @@ sptr_t ScintillaWin::HandleCompositionInline(uptr_t, sptr_t lParam) { const bool tmpRecordingMacro = recordingMacro; recordingMacro = false; - charAddedSource = SC_CHARADDED_TENTATIVE; const int codePage = CodePageOfDocument(); for (size_t i = 0; i < wcs.size(); ) { const size_t ucWidth = UTF16CharLength(wcs[i]); @@ -1227,7 +1251,6 @@ sptr_t ScintillaWin::HandleCompositionInline(uptr_t, sptr_t lParam) { DrawImeIndicator(imeIndicator[i], static_cast(docChar.size())); i += ucWidth; } - charAddedSource = SC_CHARADDED_NORMAL; recordingMacro = tmpRecordingMacro; // Move IME caret from current last position to imeCaretPos. @@ -1240,9 +1263,7 @@ sptr_t ScintillaWin::HandleCompositionInline(uptr_t, sptr_t lParam) { view.imeCaretBlockOverride = true; } } else if (lParam & GCS_RESULTSTR) { - charAddedSource = SC_CHARADDED_IME; AddWString(imc.GetCompositionString(GCS_RESULTSTR)); - charAddedSource = SC_CHARADDED_NORMAL; } EnsureCaretVisible(); SetCandidateWindowPos(); @@ -1724,13 +1745,24 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam case WM_IME_SETCONTEXT: if (imeInteraction == imeInline) { if (wParam) { - LPARAM NoImeWin = lParam; - NoImeWin = NoImeWin & (~ISC_SHOWUICOMPOSITIONWINDOW); - return ::DefWindowProc(MainHWND(), iMessage, wParam, NoImeWin); + LPARAM noImeCompositeWindow = lParam; + noImeCompositeWindow = noImeCompositeWindow & (~ISC_SHOWUICOMPOSITIONWINDOW); + return ::DefWindowProc(MainHWND(), iMessage, wParam, noImeCompositeWindow); } } return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam); +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> + case WM_IME_NOTIFY: + if (wParam == IMN_SETOPENSTATUS) { + imeIsOpen = IsIMEOpen(); + } + if (wParam == IMN_SETOPENSTATUS || wParam == IMN_SETCONVERSIONMODE) { + imeIsInModeCJK = (GetIMEInputMode() != IME_CMODE_ALPHANUMERIC); + } + return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam); +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< + // These are not handled in Scintilla and its faster to dispatch them here. // Also moves time out to here so profile doesn't count lots of empty message calls. @@ -1741,7 +1773,6 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam case WM_NCPAINT: case WM_NCMOUSEMOVE: case WM_NCLBUTTONDOWN: - case WM_IME_NOTIFY: case WM_SYSCOMMAND: case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: diff --git a/src/Edit.c b/src/Edit.c index 3c1f11249..62ca8e3ad 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -90,12 +90,13 @@ extern bool bFixLineEndings; extern bool bAutoStripBlanks; // Default Codepage and Character Set -extern int g_iDefaultNewFileEncoding; -extern int g_iDefaultCharSet; +extern int g_iDefaultNewFileEncoding; +extern int g_iDefaultCharSet; extern bool bLoadASCIIasUTF8; extern bool bForceLoadASCIIasUTF8; extern bool bLoadNFOasOEM; extern bool bNoEncodingTags; +extern bool g_bUseLimitedAutoCCharSet; extern bool g_bAutoCompleteWords; extern bool g_bAutoCLexerKeyWords; @@ -120,7 +121,6 @@ extern bool g_bZeroBasedColumnIndex; extern CALLTIPTYPE g_CallTipType; extern FR_STATES g_FindReplaceMatchFoundState; -extern bool g_bAutoCinASCIIModeOnly; #define ANSI_CAHR_BUFFER 258 static char DelimChars[ANSI_CAHR_BUFFER] = { '\0' }; @@ -132,7 +132,8 @@ static char WordCharsAccelerated[ANSI_CAHR_BUFFER] = { '\0' }; static char WhiteSpaceCharsAccelerated[ANSI_CAHR_BUFFER] = { '\0' }; static char PunctuationCharsAccelerated[1] = { '\0' }; // empty! -static char AutoCompleteWordASCII[ANSI_CAHR_BUFFER] = { '\0' }; +#define W_AUTOC_WORD_ANSI1252 L"#$%&@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ" +static char AutoCompleteWordCharSet[ANSI_CAHR_BUFFER] = { L'\0' }; //static WCHAR W_DelimChars[ANSI_CAHR_BUFFER] = { L'\0' }; //static WCHAR W_DelimCharsAccel[ANSI_CAHR_BUFFER] = { L'\0' }; @@ -330,7 +331,7 @@ void EditInitWordDelimiter(HWND hwnd) IniGetString(L"Settings2", L"ExtendedWhiteSpaceChars", L"", buffer, COUNTOF(buffer)); char whitesp[ANSI_CAHR_BUFFER] = { '\0' }; if (StringCchLen(buffer, COUNTOF(buffer)) > 0) { - WideCharToMultiByteStrg(CP_ACP, buffer, whitesp); + WideCharToMultiByteStrg(Encoding_SciCP, buffer, whitesp); } // 3rd set accelerated arrays @@ -360,21 +361,14 @@ void EditInitWordDelimiter(HWND hwnd) StringCchCopyA(DelimCharsAccel, COUNTOF(DelimCharsAccel), WhiteSpaceCharsDefault); StringCchCatA(DelimCharsAccel, COUNTOF(DelimCharsAccel), lineEnds); - - IniGetString(L"Settings2", L"AutoCompleteWordASCII", L"", buffer, COUNTOF(buffer)); - char autocompl[ANSI_CAHR_BUFFER] = { '\0' }; - if (StringCchLen(buffer, COUNTOF(buffer)) > 0) { - WideCharToMultiByteStrg(CP_ACP, buffer, autocompl); + IniGetString(L"Settings2", L"AutoCompleteWordCharSet", L"", buffer, COUNTOF(buffer)); + if (StringCchLen(buffer, COUNTOF(buffer)) > 0) + { + g_bUseLimitedAutoCCharSet = true; + WideCharToMultiByteStrg(Encoding_SciCP, buffer, AutoCompleteWordCharSet); + } else { + WideCharToMultiByteStrg(Encoding_SciCP, W_AUTOC_WORD_ANSI1252, AutoCompleteWordCharSet); } - // add only 7-bit-ASCII chars to accelerated whitespace list - for (size_t i = 0; i < StringCchLenA(autocompl, ANSI_CAHR_BUFFER); i++) { - if (autocompl[i] & 0x7F) { - if (!StrChrA(AutoCompleteWordASCII, autocompl[i])) { - StringCchCatNA(AutoCompleteWordASCII, COUNTOF(AutoCompleteWordASCII), &(autocompl[i]), 1); - } - } - } - g_bAutoCinASCIIModeOnly = (AutoCompleteWordASCII[0] != '\0'); // construct wide char arrays //MultiByteToWideChar(Encoding_SciCP, 0, DelimChars, -1, W_DelimChars, COUNTOF(W_DelimChars)); @@ -6569,7 +6563,8 @@ static const char* __fastcall _strNextLexKeyWord(const char* strg, const char* c void EditCompleteWord(HWND hwnd, bool autoInsert) { UNUSED(hwnd); - char const* const pchAllowdWordChars = (g_bAutoCinASCIIModeOnly ? AutoCompleteWordASCII : + + char const* const pchAllowdWordChars = (g_bUseLimitedAutoCCharSet ? AutoCompleteWordCharSet : (g_bAccelWordNavigation ? WordCharsAccelerated : WordCharsDefault)); DocPos const iCurrentPos = SciCall_GetCurrentPos(); diff --git a/src/Edit.h b/src/Edit.h index b27660822..62b9a5499 100644 --- a/src/Edit.h +++ b/src/Edit.h @@ -23,6 +23,7 @@ int Scintilla_RegisterClasses(void*); int Scintilla_ReleaseResources(); +void EditInitializeSciCtrl(HWND); void EditInitWordDelimiter(HWND); void EditSetNewText(HWND,char*,DWORD); bool EditConvertText(HWND,int,int,bool); diff --git a/src/Encoding.c b/src/Encoding.c index 123c17702..9736445ad 100644 --- a/src/Encoding.c +++ b/src/Encoding.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "../uthash/utarray.h" @@ -49,6 +50,7 @@ extern HMODULE g_hLngResContainer; int g_DOSEncoding = CPI_NONE; bool g_bForceCompEncDetection = false; +bool g_bUseLimitedAutoCCharSet = false; // Supported Encodings WCHAR wchANSI[16] = { L'\0' }; @@ -129,8 +131,11 @@ void Encoding_InitDefaults() 65001 // (UTF-8) }; - ChangeEncodingCodePage(CPI_ANSI_DEFAULT, GetACP()); // set ANSI system CP - StringCchPrintf(wchANSI, COUNTOF(wchANSI), L" (CP-%u)", g_Encodings[CPI_ANSI_DEFAULT].uCodePage); + UINT const ansiInputCP = GetACP(); + ChangeEncodingCodePage(CPI_ANSI_DEFAULT, ansiInputCP); // set ANSI system CP () + assert(g_Encodings[CPI_ANSI_DEFAULT].uCodePage == ansiInputCP); + StringCchPrintf(wchANSI, COUNTOF(wchANSI), L" (CP-%u)", ansiInputCP); + g_bUseLimitedAutoCCharSet = IsDBCSCodePage(ansiInputCP); for (int i = CPI_UTF7 + 1; i < Encoding_CountOf(); ++i) { if (Encoding_IsValid(i) && (g_Encodings[i].uCodePage == g_Encodings[CPI_ANSI_DEFAULT].uCodePage)) { diff --git a/src/Encoding.h b/src/Encoding.h index 6e96d3922..1e731ee0f 100644 --- a/src/Encoding.h +++ b/src/Encoding.h @@ -125,6 +125,11 @@ int Encoding_CountOf(); void ChangeEncodingCodePage(int cpi, UINT newCP); int Encoding_Analyze(const char* const text, const size_t len, const int encodingHint, bool* isReliable); +// 932 Shift-JIS, 936 GBK, 949 UHC, 950 Big5, 1361 Johab +inline bool IsDBCSCodePage(UINT cp) { + return ((cp == 932) || (cp == 936) || (cp == 949) || (cp == 950) || (cp == 1361)); +} + // -------------------------------------------------------------------------------------------------------------------------------- #endif //_NP3_ENCODING_H_ diff --git a/src/Notepad3.c b/src/Notepad3.c index cb0e98945..f07862a02 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -252,7 +252,6 @@ int iUpdateDelayMarkAllCoccurrences; int iCurrentLineHorizontalSlop = 0; int iCurrentLineVerticalSlop = 0; bool g_bChasingDocTail = false; -bool g_bAutoCinASCIIModeOnly = false; CALLTIPTYPE g_CallTipType = CT_NONE; @@ -319,9 +318,9 @@ LPMRULIST g_pMRUreplace; DWORD dwLastIOError; -int g_iDefaultNewFileEncoding; -int g_iDefaultCharSet; -int g_IMEInteraction; +int g_iDefaultNewFileEncoding = 0; +int g_iDefaultCharSet = 0; +int g_IMEInteraction = 0; int g_iEOLMode; int g_iDefaultEOLMode; @@ -6145,9 +6144,9 @@ static void __fastcall _HandleTinyExpr() #if 0 //============================================================================= // -// _IsIMEOpenInNativeMode() +// _IsIMEOpenInNoNativeMode() // -static bool __fastcall _IsIMEOpenInNativeMode() +static bool __fastcall _IsIMEOpenInNoNativeMode() { bool result = false; HIMC const himc = ImmGetContext(g_hwndEdit); @@ -6359,10 +6358,12 @@ LRESULT MsgNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) break; } - if ((g_bAutoCompleteWords || g_bAutoCLexerKeyWords)) { - if (g_bAutoCinASCIIModeOnly && ((ich > 0x7F) || (scn->modifiers != SC_CHARADDED_NORMAL))) { - SciCall_AutoCCancel(); - return 0LL; + if ((g_bAutoCompleteWords || g_bAutoCLexerKeyWords)) + { + if (SciCall_IsIMEModeCJK()) + { + SciCall_AutoCCancel(); + return 0; } if (!SciCall_AutoCActive()) { EditCompleteWord(g_hwndEdit, false); } } diff --git a/src/SciCall.h b/src/SciCall.h index 3bd2a6f7c..2578610e2 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -439,7 +439,16 @@ DeclareSciCallV1(SetUndoCollection, SETUNDOCOLLECTION, bool, bCollectUndo) DeclareSciCallV1(SetBufferedDraw, SETBUFFEREDDRAW, bool, value) DeclareSciCallV1(SetTechnology, SETTECHNOLOGY, int, technology) DeclareSciCallV1(SetBidirectional, SETBIDIRECTIONAL, int, direction) + + +//============================================================================= +// +// IME +// DeclareSciCallV1(SetIMEInteraction, SETIMEINTERACTION, int, interact) +DeclareSciCallR0(IsIMEOpen, ISIMEOPEN, bool) +DeclareSciCallR0(IsIMEModeCJK, ISIMEMODECJK, bool) + //============================================================================= //