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; | 
