From 9fba9f75c3ef7e57f279e48dfe138a80c7c554c1 Mon Sep 17 00:00:00 2001 From: "METANEOCORTEX\\Kotti" Date: Fri, 10 Jul 2026 11:48:20 +0200 Subject: [PATCH] fix: patch Scintilla to try to fix "vanishing mouse pointer" issue chore: realign to original Scintilla Source Code (except functional patches) --- scintilla/call/ScintillaCall.cxx | 4 + scintilla/include/ILoader.h | 2 +- scintilla/include/Sci_Position.h | 2 + scintilla/include/Scintilla.h | 14 +++ scintilla/include/Scintilla.iface | 2 + scintilla/include/ScintillaCall.h | 6 +- scintilla/include/ScintillaMessages.h | 4 + scintilla/include/ScintillaTypes.h | 4 + .../001_directwrite_font_resolution.patch | 10 ++- .../003_mousevanish_cursor_scope.md | 51 +++++++++++ .../003_mousevanish_cursor_scope.patch | 86 +++++++++++++++++++ scintilla/src/CharClassify.cxx | 6 +- scintilla/src/CharClassify.h | 6 +- scintilla/src/Document.cxx | 32 +++---- scintilla/src/Document.h | 32 +++---- scintilla/src/Editor.cxx | 8 +- scintilla/src/Editor.h | 10 +-- scintilla/src/Platform.h | 21 +++-- scintilla/src/PositionCache.cxx | 18 ++-- scintilla/src/PositionCache.h | 18 ++-- scintilla/src/ScintillaBase.cxx | 4 + scintilla/src/ScintillaBase.h | 2 +- scintilla/src/ViewStyle.cxx | 4 +- scintilla/src/ViewStyle.h | 2 +- scintilla/win32/ScintillaDLL.cxx | 2 + scintilla/win32/ScintillaWin.cxx | 53 +++++++++--- scintilla/win32/SurfaceD2D.cxx | 4 +- 27 files changed, 306 insertions(+), 101 deletions(-) create mode 100644 scintilla/np3_patches/003_mousevanish_cursor_scope.md create mode 100644 scintilla/np3_patches/003_mousevanish_cursor_scope.patch diff --git a/scintilla/call/ScintillaCall.cxx b/scintilla/call/ScintillaCall.cxx index fef74c6bee..4bd7429227 100644 --- a/scintilla/call/ScintillaCall.cxx +++ b/scintilla/call/ScintillaCall.cxx @@ -563,9 +563,11 @@ void ScintillaCall::StyleSetUnderline(int style, bool underline) { Call(Message::StyleSetUnderline, style, underline); } +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> void ScintillaCall::StyleSetStrike(int style, bool strike) { Call(Message::StyleSetStrike, style, strike); } +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< Colour ScintillaCall::StyleGetFore(int style) { return static_cast(Call(Message::StyleGetFore, style)); @@ -603,9 +605,11 @@ bool ScintillaCall::StyleGetUnderline(int style) { return Call(Message::StyleGetUnderline, style); } +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> bool ScintillaCall::StyleGetStrike(int style) { return Call(Message::StyleGetStrike, style); } +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< CaseVisible ScintillaCall::StyleGetCase(int style) { return static_cast(Call(Message::StyleGetCase, style)); diff --git a/scintilla/include/ILoader.h b/scintilla/include/ILoader.h index 9d49c75e8a..5d2eb25719 100644 --- a/scintilla/include/ILoader.h +++ b/scintilla/include/ILoader.h @@ -18,7 +18,7 @@ class ILoader { virtual int SCI_METHOD Release() = 0; // Returns a status code from SC_STATUS_* virtual int SCI_METHOD AddData(const char *data, Sci_Position length) = 0; - virtual void * SCI_METHOD ConvertToDocument() noexcept = 0; + virtual void * SCI_METHOD ConvertToDocument() = 0; }; static constexpr int deRelease0 = 0; diff --git a/scintilla/include/Sci_Position.h b/scintilla/include/Sci_Position.h index 0ebdf59838..a26c4b2cc5 100644 --- a/scintilla/include/Sci_Position.h +++ b/scintilla/include/Sci_Position.h @@ -9,11 +9,13 @@ #ifndef SCI_POSITION_H #define SCI_POSITION_H +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #if defined(__cplusplus) #include #else #include #endif +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< // Basic signed type used throughout interface typedef ptrdiff_t Sci_Position; diff --git a/scintilla/include/Scintilla.h b/scintilla/include/Scintilla.h index 5058ad20c9..854b03a04e 100644 --- a/scintilla/include/Scintilla.h +++ b/scintilla/include/Scintilla.h @@ -34,11 +34,13 @@ __declspec(dllexport) int Scintilla_AdjustWindowRectForDpi(LPWRECT lpRect, #endif // Include header that defines basic numeric types. +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #if defined(__cplusplus) #include #else #include #endif +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< // Define uptr_t, an unsigned integer type large enough to hold a pointer. typedef uintptr_t uptr_t; @@ -57,7 +59,9 @@ typedef sptr_t (*SciFnDirectStatus)(sptr_t ptr, unsigned int iMessage, uptr_t wP #define SCI_START 2000 #define SCI_OPTIONAL_START 3000 #define SCI_LEXER_START 4000 +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #define SCI_DEV_USER_DEFINED 6000 +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< #define SCI_ADDTEXT 2001 #define SCI_ADDSTYLEDTEXT 2002 #define SCI_INSERTTEXT 2003 @@ -126,8 +130,10 @@ typedef sptr_t (*SciFnDirectStatus)(sptr_t ptr, unsigned int iMessage, uptr_t wP #define SC_IME_INLINE 1 #define SCI_GETIMEINTERACTION 2678 #define SCI_SETIMEINTERACTION 2679 +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #define SCI_ISIMEOPEN 6003 #define SCI_ISIMEMODECJK 6004 +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< #define SC_ALPHA_TRANSPARENT 0 #define SC_ALPHA_OPAQUE 255 #define SC_ALPHA_NOALPHA 256 @@ -268,7 +274,9 @@ typedef sptr_t (*SciFnDirectStatus)(sptr_t ptr, unsigned int iMessage, uptr_t wP #define SCI_STYLESETEOLFILLED 2057 #define SCI_STYLERESETDEFAULT 2058 #define SCI_STYLESETUNDERLINE 2059 +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #define SCI_STYLESETSTRIKE 6001 +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< #define SC_CASE_MIXED 0 #define SC_CASE_UPPER 1 #define SC_CASE_LOWER 2 @@ -281,7 +289,9 @@ typedef sptr_t (*SciFnDirectStatus)(sptr_t ptr, unsigned int iMessage, uptr_t wP #define SCI_STYLEGETFONT 2486 #define SCI_STYLEGETEOLFILLED 2487 #define SCI_STYLEGETUNDERLINE 2488 +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #define SCI_STYLEGETSTRIKE 6002 +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< #define SCI_STYLEGETCASE 2489 #define SCI_STYLEGETCHARACTERSET 2490 #define SCI_STYLEGETVISIBLE 2491 @@ -538,7 +548,9 @@ typedef sptr_t (*SciFnDirectStatus)(sptr_t ptr, unsigned int iMessage, uptr_t wP #define SCFIND_NONE 0x0 #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 @@ -1221,7 +1233,9 @@ typedef sptr_t (*SciFnDirectStatus)(sptr_t ptr, unsigned int iMessage, uptr_t wP #define SCI_GETLEXER 4002 #define SCI_COLOURISE 4003 #define SCI_SETPROPERTY 4004 +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #define KEYWORDSET_MAX 15 +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< #define SCI_SETKEYWORDS 4005 #define SCI_GETPROPERTY 4008 #define SCI_GETPROPERTYEXPANDED 4009 diff --git a/scintilla/include/Scintilla.iface b/scintilla/include/Scintilla.iface index 6513b2677f..98eefbc92d 100644 --- a/scintilla/include/Scintilla.iface +++ b/scintilla/include/Scintilla.iface @@ -3339,7 +3339,9 @@ fun void Colourise=4003(position start, position end) set void SetProperty=4004(string key, string value) # Maximum value of keywordSet parameter of SetKeyWords. +# >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> val KEYWORDSET_MAX=15 +# <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< # Set up the key words used by the lexer. set void SetKeyWords=4005(int keyWordSet, string keyWords) diff --git a/scintilla/include/ScintillaCall.h b/scintilla/include/ScintillaCall.h index 68a0ee1dce..ef02663c54 100644 --- a/scintilla/include/ScintillaCall.h +++ b/scintilla/include/ScintillaCall.h @@ -186,7 +186,9 @@ class ScintillaCall { void StyleSetEOLFilled(int style, bool eolFilled); void StyleResetDefault(); void StyleSetUnderline(int style, bool underline); + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> void StyleSetStrike(int style, bool strike); + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< Colour StyleGetFore(int style); Colour StyleGetBack(int style); bool StyleGetBold(int style); @@ -196,7 +198,9 @@ class ScintillaCall { std::string StyleGetFont(int style); bool StyleGetEOLFilled(int style); bool StyleGetUnderline(int style); + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> bool StyleGetStrike(int style); + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< Scintilla::CaseVisible StyleGetCase(int style); Scintilla::CharacterSet StyleGetCharacterSet(int style); bool StyleGetVisible(int style); @@ -889,7 +893,7 @@ class ScintillaCall { Scintilla::EOLAnnotationVisible EOLAnnotationGetVisible(); void EOLAnnotationSetStyleOffset(int style); int EOLAnnotationGetStyleOffset(); - bool SupportsFeature(Scintilla::Supports feature) noexcept; + bool SupportsFeature(Scintilla::Supports feature); Scintilla::LineCharacterIndexType LineCharacterIndex(); void AllocateLineCharacterIndex(Scintilla::LineCharacterIndexType lineCharacterIndex); void ReleaseLineCharacterIndex(Scintilla::LineCharacterIndexType lineCharacterIndex); diff --git a/scintilla/include/ScintillaMessages.h b/scintilla/include/ScintillaMessages.h index bafaaf8db7..5325401b29 100644 --- a/scintilla/include/ScintillaMessages.h +++ b/scintilla/include/ScintillaMessages.h @@ -115,7 +115,9 @@ enum class Message { StyleSetEOLFilled = 2057, StyleResetDefault = 2058, StyleSetUnderline = 2059, + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> StyleSetStrike = 6001, + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< StyleGetFore = 2481, StyleGetBack = 2482, StyleGetBold = 2483, @@ -124,7 +126,9 @@ enum class Message { StyleGetFont = 2486, StyleGetEOLFilled = 2487, StyleGetUnderline = 2488, + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> StyleGetStrike = 6002, + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< StyleGetCase = 2489, StyleGetCharacterSet = 2490, StyleGetVisible = 2491, diff --git a/scintilla/include/ScintillaTypes.h b/scintilla/include/ScintillaTypes.h index 05e8466b63..7ebd4a2cc5 100644 --- a/scintilla/include/ScintillaTypes.h +++ b/scintilla/include/ScintillaTypes.h @@ -308,7 +308,9 @@ enum class FindOption { None = 0x0, WholeWord = 0x2, MatchCase = 0x4, + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> DotMatchAll = 0x1000, + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< WordStart = 0x00100000, RegExp = 0x00200000, Posix = 0x00400000, @@ -743,9 +745,11 @@ constexpr int MaskFolders = 0xFE000000; constexpr int MaxMargin = 4; constexpr int FontSizeMultiplier = 100; constexpr int TimeForever = 10000000; +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> constexpr int MinZoomLevel = 10; constexpr int MaxZoomLevel = 1000; constexpr int KeywordsetMax = 15; +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< //--Autogenerated -- end of section automatically generated from Scintilla.iface diff --git a/scintilla/np3_patches/001_directwrite_font_resolution.patch b/scintilla/np3_patches/001_directwrite_font_resolution.patch index 0f39cbef21..1bb2674440 100644 --- a/scintilla/np3_patches/001_directwrite_font_resolution.patch +++ b/scintilla/np3_patches/001_directwrite_font_resolution.patch @@ -1,8 +1,8 @@ diff --git a/scintilla/win32/SurfaceD2D.cxx b/scintilla/win32/SurfaceD2D.cxx -index 0ca7a9475..57b53880f 100644 +index de8b7aea4..d554a0679 100644 --- a/scintilla/win32/SurfaceD2D.cxx +++ b/scintilla/win32/SurfaceD2D.cxx -@@ -161,6 +161,83 @@ constexpr D2D1_TEXT_ANTIALIAS_MODE DWriteMapFontQuality(FontQuality extraFontFla +@@ -164,6 +164,83 @@ constexpr D2D1_TEXT_ANTIALIAS_MODE DWriteMapFontQuality(FontQuality extraFontFla } } @@ -86,7 +86,7 @@ index 0ca7a9475..57b53880f 100644 struct FontDirectWrite : public FontWin { ComPtr pTextFormat; FontQuality extraFontFlag = FontQuality::QualityDefault; -@@ -173,21 +250,37 @@ struct FontDirectWrite : public FontWin { +@@ -176,23 +253,39 @@ struct FontDirectWrite : public FontWin { explicit FontDirectWrite(const FontParameters &fp) : extraFontFlag(fp.extraFontFlag), characterSet(fp.characterSet) { @@ -107,7 +107,6 @@ index 0ca7a9475..57b53880f 100644 + if (fp.italic) { + style = DWRITE_FONT_STYLE_ITALIC; + } -+// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< + const std::wstring wsLocale = WStringFromUTF8(fp.localeName); const FLOAT fHeight = static_cast(fp.size); @@ -130,4 +129,7 @@ index 0ca7a9475..57b53880f 100644 + stretch, fHeight, L"en-us", pTextFormat.ReleaseAndGetAddressOf()); } ++// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< if (SUCCEEDED(hr)) { + pTextFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP); + diff --git a/scintilla/np3_patches/003_mousevanish_cursor_scope.md b/scintilla/np3_patches/003_mousevanish_cursor_scope.md new file mode 100644 index 0000000000..d5efc16382 --- /dev/null +++ b/scintilla/np3_patches/003_mousevanish_cursor_scope.md @@ -0,0 +1,51 @@ +# Scope "Hide Pointer While Typing" to the Edit Client + +## Description + +Reworks the "hide mouse pointer while typing" behaviour (Windows setting +`SPI_GETMOUSEVANISH`) so it is scoped to the Scintilla **edit client** instead of +the whole application. + +Previously the pointer was hidden with `::ShowCursor(FALSE)`. That API manipulates +a **per-input-queue (application-wide) counter**: because Notepad3's main window, +toolbar, statusbar, scrollbars, margins and the edit control all run on the same +thread/input-queue, typing blanked the pointer over the *entire* window. The +matching `::ShowCursor(TRUE)` only ran inside the edit control's mouse handlers, so +when the pointer re-entered over a non-text region (toolbar/margins/scrollbar) it +stayed invisible until it finally reached the text area — "the pointer is invisible +for a while after moving back in". + +The patch switches to `::SetCursor(nullptr)`, which is per-window / per-message and +does **not** touch the shared show-count. The empty cursor is re-asserted in +`WM_SETCURSOR` while `cursorIsHidden` is set (so it stays hidden over the text area +during typing), and is cleared on genuine pointer movement, on `WM_MOUSELEAVE` and +on `WM_KILLFOCUS`. A hidden pointer is only revealed on a *real* `WM_MOUSEMOVE` +(position actually changed), preventing the flicker from synthetic moves that +Windows generates when a popup/statusbar repaints under a stationary pointer. + +## Issues Fixed + +- Pointer invisible over toolbar/margins/scrollbars "for a while" after typing with + the mouse outside the window, then moving it back in. + +## Related History + +- [#4942](https://github.com/rizonesoft/Notepad3/issues/4942) - Typing causes cursor + to flash, disappear and reappear (anti-flicker `ptMouseLast != pt` gate preserved). +- [#5369](https://github.com/rizonesoft/Notepad3/issues/5369) - Recover cursor state + when the editor window loses focus (`WM_KILLFOCUS` recovery preserved). + +## Files Modified + +- `scintilla/win32/ScintillaWin.cxx` + +## Changes + +1. `HideCursorIfPreferred()` - hide via `::SetCursor(nullptr)` instead of + `::ShowCursor(FALSE)` (client-scoped, not the process-wide counter). +2. `WM_SETCURSOR` (`HTCLIENT`) - while hidden, re-assert `::SetCursor(nullptr)`; + otherwise show the context cursor as before. +3. `WM_MOUSEMOVE` - reveal only on real movement (`ptMouseLast != pt`) via + `DisplayCursor(ContextCursor(pt))`; removed `::ShowCursor(TRUE)`. +4. `WM_MOUSELEAVE` / `WM_KILLFOCUS` - clear `cursorIsHidden` only (no counter to + restore); removed `::ShowCursor(TRUE)`. diff --git a/scintilla/np3_patches/003_mousevanish_cursor_scope.patch b/scintilla/np3_patches/003_mousevanish_cursor_scope.patch new file mode 100644 index 0000000000..835fc609fe --- /dev/null +++ b/scintilla/np3_patches/003_mousevanish_cursor_scope.patch @@ -0,0 +1,86 @@ +diff --git a/scintilla/win32/ScintillaWin.cxx b/scintilla/win32/ScintillaWin.cxx +index 8712c40af..aaf069b58 100644 +--- a/scintilla/win32/ScintillaWin.cxx ++++ b/scintilla/win32/ScintillaWin.cxx +@@ -1887,10 +1887,14 @@ sptr_t ScintillaWin::MouseMessage(unsigned int iMessage, uptr_t wParam, sptr_t l + + // Windows might send WM_MOUSEMOVE even though the mouse has not been moved: + // http://blogs.msdn.com/b/oldnewthing/archive/2003/10/01/55108.aspx ++ // Only a *real* movement (position actually changed) reveals a pointer ++ // hidden while typing. Spurious moves (Windows synthesizes WM_MOUSEMOVE ++ // when a popup/statusbar repaints under a stationary pointer) must NOT ++ // reveal it, otherwise the pointer flickers while typing (issue #4942). + if (ptMouseLast != pt) { + if (cursorIsHidden) { +- ::ShowCursor(TRUE); +- cursorIsHidden = false; // to be shown by ButtonMoveWithModifiers ++ cursorIsHidden = false; ++ DisplayCursor(ContextCursor(pt)); + } + SetTrackMouseLeaveEvent(true); + ButtonMoveWithModifiers(pt, ::GetMessageTime(), MouseModifiers(wParam)); +@@ -1901,8 +1905,9 @@ sptr_t ScintillaWin::MouseMessage(unsigned int iMessage, uptr_t wParam, sptr_t l + + case WM_MOUSELEAVE: + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> ++ // Pointer left the edit client: drop the "hidden while typing" state so ++ // the normal pointer is shown again (nothing to restore, SetCursor-scoped). + if (cursorIsHidden) { +- ::ShowCursor(TRUE); + cursorIsHidden = false; + } + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< +@@ -2064,8 +2069,11 @@ sptr_t ScintillaWin::FocusMessage(unsigned int iMessage, uptr_t wParam, sptr_t) + switch (iMessage) { + case WM_KILLFOCUS: { + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> ++ // Losing focus while typing: drop the "hidden while typing" state. The ++ // system does not send WM_MOUSELEAVE when the pointer is not above this ++ // window, so this is the recovery point for that case (nothing to ++ // restore, hiding is SetCursor-scoped, not ShowCursor()-counter based). + if (cursorIsHidden) { +- ::ShowCursor(TRUE); + cursorIsHidden = false; + } + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< +@@ -2404,13 +2412,24 @@ sptr_t ScintillaWin::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) { + + case WM_SETCURSOR: + if (LOWORD(lParam) == HTCLIENT) { +- if (!cursorIsHidden) { ++ // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> ++ // "Hide pointer while typing" (SPI_GETMOUSEVANISH) is scoped to the ++ // edit client only. While hidden, re-assert the empty cursor here so ++ // it stays hidden over the text area during typing WITHOUT using the ++ // process-wide ShowCursor() counter. ShowCursor() is per input-queue ++ // and thus shared by the toolbar / statusbar / scrollbars / margins, ++ // which would then also blank the pointer until it happens to re-enter ++ // the text area ("pointer invisible for a while" on re-entry). ++ if (cursorIsHidden) { ++ ::SetCursor(nullptr); ++ } else { + POINT pt; + if (::GetCursorPos(&pt)) { + ::ScreenToClient(MainHWND(), &pt); + DisplayCursor(ContextCursor(PointFromPOINT(pt))); + } + } ++ // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< + return TRUE; + } else { + return ::DefWindowProc(MainHWND(), msg, wParam, lParam); +@@ -2682,8 +2701,12 @@ void ScintillaWin::HideCursorIfPreferred() noexcept { + // SPI_GETMOUSEVANISH from OS. + if (typingWithoutCursor && !cursorIsHidden) { + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> +- //::SetCursor({}); +- ::ShowCursor(FALSE); ++ // Hide the pointer for the edit client only. SetCursor(nullptr) is ++ // per-window/per-message (not the process-wide ShowCursor() counter), ++ // so the toolbar / statusbar / scrollbars / margins keep their normal ++ // pointer. WM_SETCURSOR re-asserts this while cursorIsHidden stays set, ++ // and a real WM_MOUSEMOVE clears it again (see MouseMessage()). ++ ::SetCursor(nullptr); + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< + cursorIsHidden = true; + } diff --git a/scintilla/src/CharClassify.cxx b/scintilla/src/CharClassify.cxx index de37c86e43..b5eb337006 100644 --- a/scintilla/src/CharClassify.cxx +++ b/scintilla/src/CharClassify.cxx @@ -15,11 +15,11 @@ using namespace Scintilla::Internal; -CharClassify::CharClassify() noexcept : charClass{} { +CharClassify::CharClassify() : charClass{} { SetDefaultCharClasses(true); } -void CharClassify::SetDefaultCharClasses(bool includeWordClass) noexcept { +void CharClassify::SetDefaultCharClasses(bool includeWordClass) { // Initialize all char classes to default values for (int ch = 0; ch < maxChar; ch++) { if (ch == '\r' || ch == '\n') @@ -33,7 +33,7 @@ void CharClassify::SetDefaultCharClasses(bool includeWordClass) noexcept { } } -void CharClassify::SetCharClasses(const unsigned char *chars, CharacterClass newCharClass) noexcept { +void CharClassify::SetCharClasses(const unsigned char *chars, CharacterClass newCharClass) { // Apply the newCharClass to the specified chars if (chars) { while (*chars) { diff --git a/scintilla/src/CharClassify.h b/scintilla/src/CharClassify.h index dfbe325f95..9fc1be2980 100644 --- a/scintilla/src/CharClassify.h +++ b/scintilla/src/CharClassify.h @@ -14,10 +14,10 @@ enum class CharacterClass : unsigned char { space, newLine, word, punctuation }; class CharClassify { public: - CharClassify() noexcept; + CharClassify(); - void SetDefaultCharClasses(bool includeWordClass) noexcept; - void SetCharClasses(const unsigned char *chars, CharacterClass newCharClass) noexcept; + void SetDefaultCharClasses(bool includeWordClass); + void SetCharClasses(const unsigned char *chars, CharacterClass newCharClass); int GetCharsOfClass(CharacterClass characterClass, unsigned char *buffer) const noexcept; CharacterClass GetClass(unsigned char ch) const noexcept { return charClass[ch];} bool IsWord(unsigned char ch) const noexcept { return charClass[ch] == CharacterClass::word;} diff --git a/scintilla/src/Document.cxx b/scintilla/src/Document.cxx index 0fbe05c568..97c4c884be 100644 --- a/scintilla/src/Document.cxx +++ b/scintilla/src/Document.cxx @@ -201,7 +201,7 @@ int SCI_METHOD Document::AddRef() noexcept { // Decrease reference count and return its previous value. // Delete the document if reference count reaches zero. -int SCI_METHOD Document::Release() noexcept{ +int SCI_METHOD Document::Release() { const int curRefCount = --refCount; if (curRefCount == 0) delete this; @@ -506,7 +506,7 @@ int Document::MarkerHandleFromLine(Sci::Line line, int which) const noexcept { return Markers()->HandleFromLine(line, which); } -Sci_Position SCI_METHOD Document::LineStart(Sci_Position line) const noexcept { +Sci_Position SCI_METHOD Document::LineStart(Sci_Position line) const { return cb.LineStart(line); } @@ -526,17 +526,13 @@ int SCI_METHOD Document::DEVersion() const noexcept { return deRelease0; } -void SCI_METHOD Document::SetErrorStatus(int status) noexcept { +void SCI_METHOD Document::SetErrorStatus(int status) { // Tell the watchers an error has occurred. for (const WatcherWithUserData &watcher : watchers) { watcher.watcher->NotifyErrorOccurred(this, watcher.userData, static_cast(status)); } } -Sci_Position SCI_METHOD Document::LineFromPosition(Sci_Position pos) const noexcept { - return cb.LineFromPosition(pos); -} - void Document::CheckPosition(Sci::Position pos) const { PLATFORM_ASSERT((pos >= 0) && (pos <= LengthNoExcept())); if ((pos < 0) || (pos > LengthNoExcept())) { @@ -544,6 +540,10 @@ void Document::CheckPosition(Sci::Position pos) const { } } +Sci_Position SCI_METHOD Document::LineFromPosition(Sci_Position pos) const { + return cb.LineFromPosition(pos); +} + Sci::Line Document::SciLineFromPosition(Sci::Position pos) const noexcept { // Avoids casting in callers for this very common function return cb.LineFromPosition(pos); @@ -612,7 +612,7 @@ int SCI_METHOD Document::SetLevel(Sci_Position line, int level) { return prev; } -int SCI_METHOD Document::GetLevel(Sci_Position line) const noexcept { +int SCI_METHOD Document::GetLevel(Sci_Position line) const { return Levels()->GetLevel(line); } @@ -1025,7 +1025,7 @@ CharacterExtracted Document::CharacterBefore(Sci::Position position) const noexc } // Return -1 on out-of-bounds -Sci_Position SCI_METHOD Document::GetRelativePosition(Sci_Position positionStart, Sci_Position characterOffset) const noexcept { +Sci_Position SCI_METHOD Document::GetRelativePosition(Sci_Position positionStart, Sci_Position characterOffset) const { Sci::Position pos = positionStart; if (dbcsCodePage) { const int increment = (characterOffset > 0) ? 1 : -1; @@ -1065,7 +1065,7 @@ Sci::Position Document::GetRelativePositionUTF16(Sci::Position positionStart, Sc return pos; } -int SCI_METHOD Document::GetCharacterAndWidth(Sci_Position position, Sci_Position *pWidth) const noexcept { +int SCI_METHOD Document::GetCharacterAndWidth(Sci_Position position, Sci_Position *pWidth) const { int bytesInCharacter = 1; const unsigned char leadByte = cb.UCharAt(position); int character = leadByte; @@ -1099,11 +1099,11 @@ int SCI_METHOD Document::GetCharacterAndWidth(Sci_Position position, Sci_Positio return character; } -int SCI_METHOD Document::CodePage() const noexcept { +int SCI_METHOD Document::CodePage() const { return dbcsCodePage; } -bool SCI_METHOD Document::IsDBCSLeadByte(char ch) const noexcept { +bool SCI_METHOD Document::IsDBCSLeadByte(char ch) const { // Used by lexers so must match IDocument method exactly return IsDBCSLeadByteNoExcept(ch); } @@ -1573,7 +1573,7 @@ IDocumentEditable *Document::AsDocumentEditable() noexcept { return static_cast(this); } -void * SCI_METHOD Document::ConvertToDocument() noexcept { +void *SCI_METHOD Document::ConvertToDocument() { return AsDocumentEditable(); } @@ -2581,7 +2581,7 @@ int Document::CharacterCategoryOptimization() const noexcept { return charMap.Size(); } -void SCI_METHOD Document::StartStyling(Sci_Position position) noexcept { +void SCI_METHOD Document::StartStyling(Sci_Position position) { endStyled = position; } @@ -2684,7 +2684,7 @@ int SCI_METHOD Document::SetLineState(Sci_Position line, int state) { return statePrevious; } -int SCI_METHOD Document::GetLineState(Sci_Position line) const noexcept { +int SCI_METHOD Document::GetLineState(Sci_Position line) const { return States()->GetLineState(line); } @@ -2818,7 +2818,7 @@ void Document::IncrementStyleClock() noexcept { styleClock = (styleClock + 1) % 0x100000; } -void SCI_METHOD Document::DecorationSetCurrentIndicator(int indicator) noexcept { +void SCI_METHOD Document::DecorationSetCurrentIndicator(int indicator) { decorations->SetCurrentIndicator(indicator); } diff --git a/scintilla/src/Document.h b/scintilla/src/Document.h index ff1c36ecb6..3bfc8e16c5 100644 --- a/scintilla/src/Document.h +++ b/scintilla/src/Document.h @@ -360,7 +360,7 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader ~Document() override; int SCI_METHOD AddRef() noexcept override; - int SCI_METHOD Release() noexcept override; + int SCI_METHOD Release() override; // From PerLine void Init() override; @@ -374,15 +374,15 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader bool SetLineEndTypesAllowed(Scintilla::LineEndType lineEndBitSet_); Scintilla::LineEndType GetLineEndTypesActive() const noexcept { return cb.GetLineEndTypes(); } - int SCI_METHOD Version() const noexcept override { + int SCI_METHOD Version() const override { return Scintilla::dvRelease4; } int SCI_METHOD DEVersion() const noexcept override; - void SCI_METHOD SetErrorStatus(int status) noexcept override; + void SCI_METHOD SetErrorStatus(int status) override; void CheckPosition(Sci::Position pos) const; - Sci_Position SCI_METHOD LineFromPosition(Sci_Position pos) const noexcept override; + Sci_Position SCI_METHOD LineFromPosition(Sci_Position pos) const override; Sci::Line SciLineFromPosition(Sci::Position pos) const noexcept; // Avoids casting LineFromPosition Sci::Position ClampPositionIntoDocument(Sci::Position pos) const noexcept; bool ContainsLineEnd(const char *s, Sci::Position length) const noexcept { return cb.ContainsLineEnd(s, length); } @@ -394,11 +394,11 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader bool NextCharacter(Sci::Position &pos, int moveDir) const noexcept; // Returns true if pos changed CharacterExtracted CharacterAfter(Sci::Position position) const noexcept; CharacterExtracted CharacterBefore(Sci::Position position) const noexcept; - Sci_Position SCI_METHOD GetRelativePosition(Sci_Position positionStart, Sci_Position characterOffset) const noexcept override; + Sci_Position SCI_METHOD GetRelativePosition(Sci_Position positionStart, Sci_Position characterOffset) const override; Sci::Position GetRelativePositionUTF16(Sci::Position positionStart, Sci::Position characterOffset) const noexcept; - int SCI_METHOD GetCharacterAndWidth(Sci_Position position, Sci_Position *pWidth) const noexcept override; - int SCI_METHOD CodePage() const noexcept override; - bool SCI_METHOD IsDBCSLeadByte(char ch) const noexcept override; + int SCI_METHOD GetCharacterAndWidth(Sci_Position position, Sci_Position *pWidth) const override; + int SCI_METHOD CodePage() const override; + bool SCI_METHOD IsDBCSLeadByte(char ch) const override; bool IsDBCSLeadByteNoExcept(char ch) const noexcept; bool IsDBCSTrailByteNoExcept(char ch) const noexcept; unsigned char DBCSMinTrailByte() const noexcept; @@ -417,7 +417,7 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader void ChangeInsertion(const char *s, Sci::Position length); int SCI_METHOD AddData(const char *data, Sci_Position length) override; IDocumentEditable *AsDocumentEditable() noexcept; - void * SCI_METHOD ConvertToDocument() noexcept override; + void *SCI_METHOD ConvertToDocument() override; Sci::Position Undo(); Sci::Position Redo(); bool CanUndo() const noexcept { return cb.CanUndo(); } @@ -486,7 +486,7 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader void DelCharBack(Sci::Position pos); char CharAt(Sci::Position position) const noexcept { return cb.CharAt(position); } - void SCI_METHOD GetCharRange(char *buffer, Sci_Position position, Sci_Position lengthRetrieve) const noexcept override { + void SCI_METHOD GetCharRange(char *buffer, Sci_Position position, Sci_Position lengthRetrieve) const override { cb.GetCharRange(buffer, position, lengthRetrieve); } char SCI_METHOD StyleAt(Sci_Position position) const override { return cb.StyleAt(position); } @@ -505,7 +505,7 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader Sci::Line LineFromHandle(int markerHandle) const noexcept; int MarkerNumberFromLine(Sci::Line line, int which) const noexcept; int MarkerHandleFromLine(Sci::Line line, int which) const noexcept; - Sci_Position SCI_METHOD LineStart(Sci_Position line) const noexcept override; + Sci_Position SCI_METHOD LineStart(Sci_Position line) const override; [[nodiscard]] Range LineRange(Sci::Line line) const noexcept; bool IsLineStartPosition(Sci::Position position) const noexcept; Sci_Position SCI_METHOD LineEnd(Sci_Position line) const override; @@ -519,7 +519,7 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader Sci::Line LineFromPositionAfter(Sci::Line line, Sci::Position length) const noexcept; int SCI_METHOD SetLevel(Sci_Position line, int level) override; - int SCI_METHOD GetLevel(Sci_Position line) const noexcept override; + int SCI_METHOD GetLevel(Sci_Position line) const override; Scintilla::FoldLevel GetFoldLevel(Sci_Position line) const noexcept; void ClearLevels(); Sci::Line GetLastChild(Sci::Line lineParent, std::optional level = {}, Sci::Line lastLine = -1); @@ -529,7 +529,7 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader Sci::Position ExtendWordSelect(Sci::Position pos, int delta, bool onlyWordCharacters=false) const; Sci::Position NextWordStart(Sci::Position pos, int delta) const; Sci::Position NextWordEnd(Sci::Position pos, int delta) const; - Sci_Position SCI_METHOD Length() const noexcept override { return cb.Length(); } + Sci_Position SCI_METHOD Length() const override { return cb.Length(); } Sci::Position LengthNoExcept() const noexcept { return cb.Length(); } void Allocate(Sci::Position newSize) { cb.Allocate(newSize); } @@ -555,7 +555,7 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader int GetCharsOfClass(CharacterClass characterClass, unsigned char *buffer) const; void SetCharacterCategoryOptimization(int countCharacters); int CharacterCategoryOptimization() const noexcept; - void SCI_METHOD StartStyling(Sci_Position position) noexcept override; + void SCI_METHOD StartStyling(Sci_Position position) override; bool SCI_METHOD SetStyleFor(Sci_Position length, char style) override; bool SCI_METHOD SetStyles(Sci_Position length, const char *styles) override; Sci::Position GetEndStyled() const noexcept { return endStyled; } @@ -563,7 +563,7 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader void StyleToAdjustingLineDuration(Sci::Position pos); int GetStyleClock() const noexcept { return styleClock; } void IncrementStyleClock() noexcept; - void SCI_METHOD DecorationSetCurrentIndicator(int indicator) noexcept override; + void SCI_METHOD DecorationSetCurrentIndicator(int indicator) override; void SCI_METHOD DecorationFillRange(Sci_Position position, int value, Sci_Position fillLength) override; LexInterface *GetLexInterface() const noexcept; void SetLexInterface(std::unique_ptr pLexInterface) noexcept; @@ -573,7 +573,7 @@ class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader void TruncateUndoComments(int action); int SCI_METHOD SetLineState(Sci_Position line, int state) override; - int SCI_METHOD GetLineState(Sci_Position line) const noexcept override; + int SCI_METHOD GetLineState(Sci_Position line) const override; Sci::Line GetMaxLineState() const noexcept; void SCI_METHOD ChangeLexerState(Sci_Position start, Sci_Position end) override; diff --git a/scintilla/src/Editor.cxx b/scintilla/src/Editor.cxx index a8e01fedc4..d3c7becdf8 100644 --- a/scintilla/src/Editor.cxx +++ b/scintilla/src/Editor.cxx @@ -4566,7 +4566,7 @@ void Editor::DisplayCursor(Window::Cursor c) { wMain.SetCursor(static_cast(cursorMode)); } -bool Editor::DragThreshold(Point ptStart, Point ptNow) noexcept { +bool Editor::DragThreshold(Point ptStart, Point ptNow) { const Point ptDiff = ptStart - ptNow; const XYPOSITION distanceSquared = ptDiff.x * ptDiff.x + ptDiff.y * ptDiff.y; return distanceSquared > 16.0f; @@ -5500,19 +5500,19 @@ void Editor::QueueIdleWork(WorkItems items, Sci::Position upTo) { workNeeded.Need(items, upTo); } -int Editor::SupportsFeature(Supports feature) const noexcept { +int Editor::SupportsFeature(Supports feature) { AutoSurface surface(this); return surface->SupportsFeature(feature); } -bool Editor::PaintContains(PRectangle rc) const noexcept { +bool Editor::PaintContains(PRectangle rc) { if (rc.Empty()) { return true; } return rcPaint.Contains(rc); } -bool Editor::PaintContainsMargin() const noexcept { +bool Editor::PaintContainsMargin() { if (HasMarginWindow()) { // With separate margin view, paint of text view // never contains margin. diff --git a/scintilla/src/Editor.h b/scintilla/src/Editor.h index a362ba9ce9..4369c617fc 100644 --- a/scintilla/src/Editor.h +++ b/scintilla/src/Editor.h @@ -476,7 +476,7 @@ class Editor : public EditModel, public DocWatcher { virtual void NotifyChange() = 0; virtual void NotifyFocus(bool focus); virtual void SetCtrlID(int identifier); - virtual int GetCtrlID() const noexcept { return ctrlID; } + virtual int GetCtrlID() { return ctrlID; } virtual void NotifyParent(Scintilla::NotificationData scn) = 0; virtual void NotifyStyleToNeeded(Sci::Position endStyleNeeded); void NotifyChar(int ch, Scintilla::CharacterSource charSource); @@ -551,7 +551,7 @@ class Editor : public EditModel, public DocWatcher { void CopyText(size_t length, const char *text); void SetDragPosition(SelectionPosition newPos); virtual void DisplayCursor(Window::Cursor c); - virtual bool DragThreshold(Point ptStart, Point ptNow) noexcept; + virtual bool DragThreshold(Point ptStart, Point ptNow); virtual void StartDrag(); void DropAt(SelectionPosition position, std::string_view value, bool moving, bool rectangular); [[deprecated]] void DropAt(SelectionPosition position, const char *value, size_t lengthValue, bool moving, bool rectangular); @@ -598,9 +598,9 @@ class Editor : public EditModel, public DocWatcher { virtual void IdleWork(); virtual void QueueIdleWork(WorkItems items, Sci::Position upTo=0); - virtual int SupportsFeature(Scintilla::Supports feature) const noexcept; - virtual bool PaintContains(PRectangle rc) const noexcept; - bool PaintContainsMargin() const noexcept; + virtual int SupportsFeature(Scintilla::Supports feature); + virtual bool PaintContains(PRectangle rc); + bool PaintContainsMargin(); void CheckForChangeOutsidePaint(Range r); void SetBraceHighlight(Sci::Position pos0, Sci::Position pos1, int matchStyle); diff --git a/scintilla/src/Platform.h b/scintilla/src/Platform.h index 035fb3f869..38fb41e496 100644 --- a/scintilla/src/Platform.h +++ b/scintilla/src/Platform.h @@ -156,24 +156,23 @@ class Font { class IScreenLine { public: - virtual ~IScreenLine() noexcept = default; - virtual std::string_view Text() const noexcept = 0; - virtual size_t Length() const noexcept = 0; + virtual std::string_view Text() const = 0; + virtual size_t Length() const = 0; virtual size_t RepresentationCount() const = 0; - virtual XYPOSITION Width() const noexcept = 0; - virtual XYPOSITION Height() const noexcept = 0; - virtual XYPOSITION TabWidth() const noexcept = 0; - virtual XYPOSITION TabWidthMinimumPixels() const noexcept = 0; - virtual const Font *FontOfPosition(size_t position) const noexcept = 0; - virtual XYPOSITION RepresentationWidth(size_t position) const noexcept = 0; - virtual XYPOSITION TabPositionAfter(XYPOSITION xPosition) const noexcept = 0; + virtual XYPOSITION Width() const = 0; + virtual XYPOSITION Height() const = 0; + virtual XYPOSITION TabWidth() const = 0; + virtual XYPOSITION TabWidthMinimumPixels() const = 0; + virtual const Font *FontOfPosition(size_t position) const = 0; + virtual XYPOSITION RepresentationWidth(size_t position) const = 0; + virtual XYPOSITION TabPositionAfter(XYPOSITION xPosition) const = 0; }; class IScreenLineLayout { public: virtual ~IScreenLineLayout() noexcept = default; virtual size_t PositionFromX(XYPOSITION xDistance, bool charPosition) = 0; - virtual XYPOSITION XFromPosition(size_t caretPosition) noexcept = 0; + virtual XYPOSITION XFromPosition(size_t caretPosition) = 0; virtual std::vector FindRangeIntervals(size_t start, size_t end) = 0; }; diff --git a/scintilla/src/PositionCache.cxx b/scintilla/src/PositionCache.cxx index 03afdec06a..c6bc9db2bb 100644 --- a/scintilla/src/PositionCache.cxx +++ b/scintilla/src/PositionCache.cxx @@ -388,11 +388,11 @@ ScreenLine::ScreenLine( ScreenLine::~ScreenLine() = default; -std::string_view ScreenLine::Text() const noexcept { +std::string_view ScreenLine::Text() const { return std::string_view(&ll->chars[start], len); } -size_t ScreenLine::Length() const noexcept { +size_t ScreenLine::Length() const { return len; } @@ -402,31 +402,31 @@ size_t ScreenLine::RepresentationCount() const { [](XYPOSITION w) noexcept { return w > 0.0f; }); } -XYPOSITION ScreenLine::Width() const noexcept { +XYPOSITION ScreenLine::Width() const { return width; } -XYPOSITION ScreenLine::Height() const noexcept { +XYPOSITION ScreenLine::Height() const { return height; } -XYPOSITION ScreenLine::TabWidth() const noexcept { +XYPOSITION ScreenLine::TabWidth() const { return tabWidth; } -XYPOSITION ScreenLine::TabWidthMinimumPixels() const noexcept { +XYPOSITION ScreenLine::TabWidthMinimumPixels() const { return static_cast(tabWidthMinimumPixels); } -const Font *ScreenLine::FontOfPosition(size_t position) const noexcept { +const Font *ScreenLine::FontOfPosition(size_t position) const { return ll->bidiData->stylesFonts[start + position].get(); } -XYPOSITION ScreenLine::RepresentationWidth(size_t position) const noexcept { +XYPOSITION ScreenLine::RepresentationWidth(size_t position) const { return ll->bidiData->widthReprs[start + position]; } -XYPOSITION ScreenLine::TabPositionAfter(XYPOSITION xPosition) const noexcept { +XYPOSITION ScreenLine::TabPositionAfter(XYPOSITION xPosition) const { return (std::floor((xPosition + TabWidthMinimumPixels()) / TabWidth()) + 1) * TabWidth(); } diff --git a/scintilla/src/PositionCache.h b/scintilla/src/PositionCache.h index 45f91ff412..39ebbe733f 100644 --- a/scintilla/src/PositionCache.h +++ b/scintilla/src/PositionCache.h @@ -124,16 +124,16 @@ struct ScreenLine : public IScreenLine { void operator=(ScreenLine &&) = delete; virtual ~ScreenLine(); - std::string_view Text() const noexcept override; - size_t Length() const noexcept override; + std::string_view Text() const override; + size_t Length() const override; size_t RepresentationCount() const override; - XYPOSITION Width() const noexcept override; - XYPOSITION Height() const noexcept override; - XYPOSITION TabWidth() const noexcept override; - XYPOSITION TabWidthMinimumPixels() const noexcept override; - const Font *FontOfPosition(size_t position) const noexcept override; - XYPOSITION RepresentationWidth(size_t position) const noexcept override; - XYPOSITION TabPositionAfter(XYPOSITION xPosition) const noexcept override; + XYPOSITION Width() const override; + XYPOSITION Height() const override; + XYPOSITION TabWidth() const override; + XYPOSITION TabWidthMinimumPixels() const override; + const Font *FontOfPosition(size_t position) const override; + XYPOSITION RepresentationWidth(size_t position) const override; + XYPOSITION TabPositionAfter(XYPOSITION xPosition) const override; }; struct SignificantLines { diff --git a/scintilla/src/ScintillaBase.cxx b/scintilla/src/ScintillaBase.cxx index d448dad59c..1580414971 100644 --- a/scintilla/src/ScintillaBase.cxx +++ b/scintilla/src/ScintillaBase.cxx @@ -156,12 +156,16 @@ int ScintillaBase::KeyCommand(Message iMessage) { AutoCompleteMove(-ac.lb->GetVisibleRows()); return 0; case Message::VCHome: + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> case Message::HomeWrap: AutoCompleteMove(-10000); + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< return 0; case Message::LineEnd: + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> case Message::LineEndWrap: AutoCompleteMove(10000); + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< return 0; case Message::DeleteBack: DelCharBack(true); diff --git a/scintilla/src/ScintillaBase.h b/scintilla/src/ScintillaBase.h index cc575c7c5a..48587bea9f 100644 --- a/scintilla/src/ScintillaBase.h +++ b/scintilla/src/ScintillaBase.h @@ -101,7 +101,7 @@ class ScintillaBase : public Editor, IListBoxDelegate { void NotifyStyleToNeeded(Sci::Position endStyleNeeded) override; public: - virtual ~ScintillaBase() override; + ~ScintillaBase() override; // Public so scintilla_send_message can use it Scintilla::sptr_t WndProc(Scintilla::Message iMessage, Scintilla::uptr_t wParam, Scintilla::sptr_t lParam) override; diff --git a/scintilla/src/ViewStyle.cxx b/scintilla/src/ViewStyle.cxx index 4494d1ce21..bffe1aff52 100644 --- a/scintilla/src/ViewStyle.cxx +++ b/scintilla/src/ViewStyle.cxx @@ -787,10 +787,10 @@ void ViewStyle::CreateAndAddFont(const FontSpecification &fs) { } } -FontRealised *ViewStyle::Find(const FontSpecification &fs) const { +FontRealised *ViewStyle::Find(const FontSpecification &fs) { if (!fs.fontName) // Invalid specification so return arbitrary object return fonts.begin()->second.get(); - const auto it = fonts.find(fs); + const FontMap::iterator it = fonts.find(fs); if (it != fonts.end()) { // Should always reach here since map was just set for all styles return it->second.get(); diff --git a/scintilla/src/ViewStyle.h b/scintilla/src/ViewStyle.h index 4e4ea0d739..61095e3120 100644 --- a/scintilla/src/ViewStyle.h +++ b/scintilla/src/ViewStyle.h @@ -253,7 +253,7 @@ class ViewStyle { private: void AllocStyles(size_t sizeNew); void CreateAndAddFont(const FontSpecification &fs); - FontRealised *Find(const FontSpecification &fs) const; + FontRealised *Find(const FontSpecification &fs); void FindMaxAscentDescent() noexcept; }; diff --git a/scintilla/win32/ScintillaDLL.cxx b/scintilla/win32/ScintillaDLL.cxx index 2b90892c08..5119ef1b10 100644 --- a/scintilla/win32/ScintillaDLL.cxx +++ b/scintilla/win32/ScintillaDLL.cxx @@ -20,7 +20,9 @@ using namespace Scintilla; extern "C" __declspec(dllexport) +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> sptr_t APIENTRY Scintilla_DirectFunction( +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< Internal::ScintillaWin *sci, UINT iMessage, uptr_t wParam, sptr_t lParam) { return Internal::DirectFunction(sci, iMessage, wParam, lParam); } diff --git a/scintilla/win32/ScintillaWin.cxx b/scintilla/win32/ScintillaWin.cxx index 8712c40af8..8804a1b7c6 100644 --- a/scintilla/win32/ScintillaWin.cxx +++ b/scintilla/win32/ScintillaWin.cxx @@ -585,7 +585,7 @@ class ScintillaWin : enum : UINT_PTR { invalidTimerID, standardTimerID, idleTimerID, fineTimerStart }; void DisplayCursor(Window::Cursor c) override; - bool DragThreshold(Point ptStart, Point ptNow) noexcept override; + bool DragThreshold(Point ptStart, Point ptNow) override; void StartDrag() override; static KeyMod MouseModifiers(uptr_t wParam) noexcept; @@ -630,7 +630,7 @@ class ScintillaWin : void SetTrackMouseLeaveEvent(bool on) noexcept; void HideCursorIfPreferred() noexcept; void UpdateBaseElements() override; - bool PaintContains(PRectangle rc) const noexcept override; + bool PaintContains(PRectangle rc) override; void ScrollText(Sci::Line linesToMove) override; void NotifyCaretMove() override; void UpdateSystemCaret() override; @@ -642,7 +642,7 @@ class ScintillaWin : void NotifyChange() override; void NotifyFocus(bool focus) override; void SetCtrlID(int identifier) override; - int GetCtrlID() const noexcept override; + int GetCtrlID() override; void NotifyParent(NotificationData scn) override; void NotifyDoubleClick(Point pt, KeyMod modifiers) override; std::unique_ptr CaseFolderForEncoding() override; @@ -1084,7 +1084,7 @@ void ScintillaWin::DisplayCursor(Window::Cursor c) { } } -bool ScintillaWin::DragThreshold(Point ptStart, Point ptNow) noexcept { +bool ScintillaWin::DragThreshold(Point ptStart, Point ptNow) { const Point ptDifference = ptStart - ptNow; const XYPOSITION xMove = std::trunc(std::abs(ptDifference.x)); const XYPOSITION yMove = std::trunc(std::abs(ptDifference.y)); @@ -1887,10 +1887,14 @@ sptr_t ScintillaWin::MouseMessage(unsigned int iMessage, uptr_t wParam, sptr_t l // Windows might send WM_MOUSEMOVE even though the mouse has not been moved: // http://blogs.msdn.com/b/oldnewthing/archive/2003/10/01/55108.aspx + // Only a *real* movement (position actually changed) reveals a pointer + // hidden while typing. Spurious moves (Windows synthesizes WM_MOUSEMOVE + // when a popup/statusbar repaints under a stationary pointer) must NOT + // reveal it, otherwise the pointer flickers while typing (issue #4942). if (ptMouseLast != pt) { if (cursorIsHidden) { - ::ShowCursor(TRUE); - cursorIsHidden = false; // to be shown by ButtonMoveWithModifiers + cursorIsHidden = false; + DisplayCursor(ContextCursor(pt)); } SetTrackMouseLeaveEvent(true); ButtonMoveWithModifiers(pt, ::GetMessageTime(), MouseModifiers(wParam)); @@ -1901,8 +1905,9 @@ sptr_t ScintillaWin::MouseMessage(unsigned int iMessage, uptr_t wParam, sptr_t l case WM_MOUSELEAVE: // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> + // Pointer left the edit client: drop the "hidden while typing" state so + // the normal pointer is shown again (nothing to restore, SetCursor-scoped). if (cursorIsHidden) { - ::ShowCursor(TRUE); cursorIsHidden = false; } // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< @@ -2064,8 +2069,11 @@ sptr_t ScintillaWin::FocusMessage(unsigned int iMessage, uptr_t wParam, sptr_t) switch (iMessage) { case WM_KILLFOCUS: { // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> + // Losing focus while typing: drop the "hidden while typing" state. The + // system does not send WM_MOUSELEAVE when the pointer is not above this + // window, so this is the recovery point for that case (nothing to + // restore, hiding is SetCursor-scoped, not ShowCursor()-counter based). if (cursorIsHidden) { - ::ShowCursor(TRUE); cursorIsHidden = false; } // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< @@ -2404,13 +2412,24 @@ sptr_t ScintillaWin::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) { case WM_SETCURSOR: if (LOWORD(lParam) == HTCLIENT) { - if (!cursorIsHidden) { + // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> + // "Hide pointer while typing" (SPI_GETMOUSEVANISH) is scoped to the + // edit client only. While hidden, re-assert the empty cursor here so + // it stays hidden over the text area during typing WITHOUT using the + // process-wide ShowCursor() counter. ShowCursor() is per input-queue + // and thus shared by the toolbar / statusbar / scrollbars / margins, + // which would then also blank the pointer until it happens to re-enter + // the text area ("pointer invisible for a while" on re-entry). + if (cursorIsHidden) { + ::SetCursor(nullptr); + } else { POINT pt; if (::GetCursorPos(&pt)) { ::ScreenToClient(MainHWND(), &pt); DisplayCursor(ContextCursor(PointFromPOINT(pt))); } } + // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< return TRUE; } else { return ::DefWindowProc(MainHWND(), msg, wParam, lParam); @@ -2455,7 +2474,9 @@ sptr_t ScintillaWin::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) { InvalidateStyleRedraw(); break; +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #if(WINVER >= 0x0605) +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< case WM_DPICHANGED_AFTERPARENT: { const UINT dpiNow = DpiForWindow(wMain.GetID()); if (dpi != dpiNow) { @@ -2465,7 +2486,9 @@ sptr_t ScintillaWin::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) { } } break; +// >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #endif +// <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> #if SCI_EnablePopupMenu @@ -2682,8 +2705,12 @@ void ScintillaWin::HideCursorIfPreferred() noexcept { // SPI_GETMOUSEVANISH from OS. if (typingWithoutCursor && !cursorIsHidden) { // >>>>>>>>>>>>>>> BEG NON STD SCI PATCH >>>>>>>>>>>>>>> - //::SetCursor({}); - ::ShowCursor(FALSE); + // Hide the pointer for the edit client only. SetCursor(nullptr) is + // per-window/per-message (not the process-wide ShowCursor() counter), + // so the toolbar / statusbar / scrollbars / margins keep their normal + // pointer. WM_SETCURSOR re-asserts this while cursorIsHidden stays set, + // and a real WM_MOUSEMOVE clears it again (see MouseMessage()). + ::SetCursor(nullptr); // <<<<<<<<<<<<<<< END NON STD SCI PATCH <<<<<<<<<<<<<<< cursorIsHidden = true; } @@ -2706,7 +2733,7 @@ void ScintillaWin::UpdateBaseElements() { } } -bool ScintillaWin::PaintContains(PRectangle rc) const noexcept { +bool ScintillaWin::PaintContains(PRectangle rc) { if (paintState == PaintState::painting) { return BoundsContains(rcPaint, hRgnUpdate, rc); } @@ -2850,7 +2877,7 @@ void ScintillaWin::SetCtrlID(int identifier) { ::SetWindowID(HwndFromWindow(wMain), identifier); } -int ScintillaWin::GetCtrlID() const noexcept { +int ScintillaWin::GetCtrlID() { return ::GetDlgCtrlID(HwndFromWindow(wMain)); } diff --git a/scintilla/win32/SurfaceD2D.cxx b/scintilla/win32/SurfaceD2D.cxx index a675317803..d554a06797 100644 --- a/scintilla/win32/SurfaceD2D.cxx +++ b/scintilla/win32/SurfaceD2D.cxx @@ -1124,7 +1124,7 @@ class ScreenLineLayout : public IScreenLineLayout { ScreenLineLayout &operator=(ScreenLineLayout &&) = delete; ~ScreenLineLayout() noexcept override = default; size_t PositionFromX(XYPOSITION xDistance, bool charPosition) override; - XYPOSITION XFromPosition(size_t caretPosition) noexcept override; + XYPOSITION XFromPosition(size_t caretPosition) override; std::vector FindRangeIntervals(size_t start, size_t end) override; }; @@ -1304,7 +1304,7 @@ size_t ScreenLineLayout::PositionFromX(XYPOSITION xDistance, bool charPosition) // Finds the point of the caret position -XYPOSITION ScreenLineLayout::XFromPosition(size_t caretPosition) noexcept { +XYPOSITION ScreenLineLayout::XFromPosition(size_t caretPosition) { if (!textLayout) { return 0.0; }