From cd57dc4a5c44df589ee47618c437fae07a00ecfa Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 19 Sep 2018 02:07:15 +0200 Subject: [PATCH] + review: maboroshin's changes for IME and Auto-Completion cooperation --- scintilla/include/SciLexer.h | 21 ----------------- scintilla/include/Scintilla.h | 14 ++--------- scintilla/include/Scintilla.iface | 39 +++++++------------------------ scintilla/src/EditModel.cxx | 4 ++-- scintilla/src/EditModel.h | 4 ++-- scintilla/src/Editor.cxx | 8 +++---- scintilla/win32/ScintillaWin.cxx | 21 +++++++++-------- src/Notepad3.c | 9 +++---- src/SciCall.h | 9 +++++++ 9 files changed, 41 insertions(+), 88 deletions(-) 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 fd8a9b947..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,14 +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_IME_CLOSE 0 -#define SC_IME_OPEN 1 -#define SCI_GETIMEOPEN 3860 // to Neil: I do not know how to allocate number. Change it. -#define SC_IME_MODE_NATIVE 0 // = IME_CMODE_ALPHANUMERIC -#define SC_IME_MODE_CJK 1 // Other than IME_CMODE_ALPHANUMERIC -#define SCI_GETIMEMODEACTIVE 3861 // to Neil: I do not know how to allocate number. Change it. -// <<<<<<<<<<<<<<< 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 fdaff201f..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,14 +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_IME_CLOSE=0 -val SC_IME_OPEN=1 -val SC_IME_MODE_NATIVE=0 -val SC_IME_MODE_CJK=1 -// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< - enu Update=SC_UPDATE_ val SC_UPDATE_CONTENT=0x1 val SC_UPDATE_SELECTION=0x2 @@ -4910,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/EditModel.cxx b/scintilla/src/EditModel.cxx index d6308778e..70704e63d 100644 --- a/scintilla/src/EditModel.cxx +++ b/scintilla/src/EditModel.cxx @@ -63,8 +63,8 @@ EditModel::EditModel() : braces{} { primarySelection = true; imeInteraction = imeWindowed; // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> - isIMEOpen = SC_IME_CLOSE; - isIMEModeCJK = 0; + 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 55b615494..7230cbfd3 100644 --- a/scintilla/src/EditModel.h +++ b/scintilla/src/EditModel.h @@ -38,8 +38,8 @@ public: enum IMEInteraction { imeWindowed, imeInline } imeInteraction; // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> - bool isIMEOpen; - bool isIMEModeCJK; + 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 164dbe0c0..60b51ba68 100644 --- a/scintilla/src/Editor.cxx +++ b/scintilla/src/Editor.cxx @@ -6789,11 +6789,11 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return imeInteraction; // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> - case SCI_GETIMEOPEN: - return isIMEOpen; + case SCI_ISIMEOPEN: + return imeIsOpen; - case SCI_GETIMEMODEACTIVE: - return isIMEModeCJK; + case SCI_ISIMEMODECJK: + return imeIsInModeCJK; // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< case SCI_SETBIDIRECTIONAL: diff --git a/scintilla/win32/ScintillaWin.cxx b/scintilla/win32/ScintillaWin.cxx index 50e87674b..cecd7c7af 100644 --- a/scintilla/win32/ScintillaWin.cxx +++ b/scintilla/win32/ScintillaWin.cxx @@ -1029,26 +1029,30 @@ bool ScintillaWin::KoreanIME() noexcept { const int codePage = InputCodePage(); 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; + if (ImmGetOpenStatus(imc.hIMC)) { + return true; + } } return false; } DWORD ScintillaWin::GetIMEInputMode() { - DWORD dwConversion, dwSentence; IMContext imc(MainHWND()); if (imc.hIMC && ImmGetOpenStatus(imc.hIMC)) { - if (ImmGetConversionStatus(imc.hIMC, &dwConversion, &dwSentence)) + DWORD dwConversion, dwSentence; + 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++) { @@ -1749,17 +1753,14 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam); // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> - case WM_IME_NOTIFY: { + case WM_IME_NOTIFY: if (wParam == IMN_SETOPENSTATUS) { - isIMEOpen = (IsIMEOpen() ? SC_IME_OPEN : SC_IME_CLOSE); + imeIsOpen = IsIMEOpen(); } if (wParam == IMN_SETOPENSTATUS || wParam == IMN_SETCONVERSIONMODE) { - DWORD dwIMEInputMode = GetIMEInputMode(); - isIMEModeCJK = (dwIMEInputMode != IME_CMODE_ALPHANUMERIC ? - SC_IME_MODE_CJK : SC_IME_MODE_NATIVE); + 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. diff --git a/src/Notepad3.c b/src/Notepad3.c index ce467c118..c5d6878ed 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -6361,13 +6361,10 @@ LRESULT MsgNotify(HWND hwnd, WPARAM wParam, LPARAM lParam) if ((g_bAutoCompleteWords || g_bAutoCLexerKeyWords)) { //if (g_bAutoCinASCIIModeOnly && (ich > 0x7F) ) { - bool isIMEModeActive, - bIMEOpen = (bool)SendMessage(g_hwndEdit, SCI_GETIMEOPEN, 0, 0); - if (bIMEOpen) { // || (scn->modifiers != SC_CHARADDED_NORMAL) - isIMEModeActive = (bool)SendMessage(g_hwndEdit, SCI_GETIMEMODEACTIVE, 0, 0); - if (isIMEModeActive ) { + if (SciCall_IsIMEOpen()) { + if (SciCall_IsIMEModeCJK()) { SciCall_AutoCCancel(); - return 0LL; + return 0; } } //} //g_bAutoCinASCIIModeOnly section 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) + //============================================================================= //