diff options
Diffstat (limited to 'src/Editor.cxx')
-rw-r--r-- | src/Editor.cxx | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index ecac75118..6119944c3 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -94,6 +94,15 @@ static inline bool IsControlCharacter(int ch) { return ch >= 0 && ch < ' '; } +static inline bool IsAllSpacesOrTabs(char *s, unsigned int len) { + for (unsigned int i = 0; i < len; i++) { + // This is safe because IsSpaceOrTab() will return false for null terminators + if (!IsSpaceOrTab(s[i])) + return false; + } + return true; +} + Editor::Editor() { ctrlID = 0; @@ -148,7 +157,7 @@ Editor::Editor() { lineWidthMaxSeen = 0; verticalScrollBarVisible = true; endAtLastLine = true; - caretSticky = false; + caretSticky = SC_CARETSTICKY_OFF; multipleSelection = false; additionalSelectionTyping = false; multiPasteMode = SC_MULTIPASTE_ONCE; @@ -3813,7 +3822,8 @@ void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { EnsureCaretVisible(); // Avoid blinking during rapid typing: ShowCaretAtCurrentPosition(); - if (!caretSticky) { + if ((caretSticky == SC_CARETSTICKY_OFF) || + ((caretSticky == SC_CARETSTICKY_WHITESPACE) && !IsAllSpacesOrTabs(s, len))) { SetLastXChosen(); } @@ -5072,21 +5082,21 @@ int Editor::KeyCommand(unsigned int iMessage) { break; case SCI_DELETEBACK: DelCharBack(true); - if (!caretSticky) { + if ((caretSticky == SC_CARETSTICKY_OFF) || (caretSticky == SC_CARETSTICKY_WHITESPACE)) { SetLastXChosen(); } EnsureCaretVisible(); break; case SCI_DELETEBACKNOTLINE: DelCharBack(false); - if (!caretSticky) { + if ((caretSticky == SC_CARETSTICKY_OFF) || (caretSticky == SC_CARETSTICKY_WHITESPACE)) { SetLastXChosen(); } EnsureCaretVisible(); break; case SCI_TAB: Indent(true); - if (!caretSticky) { + if (caretSticky == SC_CARETSTICKY_OFF) { SetLastXChosen(); } EnsureCaretVisible(); @@ -5094,7 +5104,7 @@ int Editor::KeyCommand(unsigned int iMessage) { break; case SCI_BACKTAB: Indent(false); - if (!caretSticky) { + if ((caretSticky == SC_CARETSTICKY_OFF) || (caretSticky == SC_CARETSTICKY_WHITESPACE)) { SetLastXChosen(); } EnsureCaretVisible(); @@ -6720,7 +6730,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_PASTE: Paste(); - if (!caretSticky) { + if ((caretSticky == SC_CARETSTICKY_OFF) || (caretSticky == SC_CARETSTICKY_WHITESPACE)) { SetLastXChosen(); } EnsureCaretVisible(); @@ -7475,9 +7485,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return endAtLastLine; case SCI_SETCARETSTICKY: - PLATFORM_ASSERT((wParam == 0) || (wParam == 1)); - if (caretSticky != (wParam != 0)) { - caretSticky = wParam != 0; + PLATFORM_ASSERT((wParam >= SC_CARETSTICKY_OFF) && (wParam <= SC_CARETSTICKY_WHITESPACE)); + if ((wParam >= SC_CARETSTICKY_OFF) && (wParam <= SC_CARETSTICKY_WHITESPACE)) { + caretSticky = wParam; } break; |