diff options
| -rw-r--r-- | src/Editor.cxx | 5 | ||||
| -rw-r--r-- | src/Editor.h | 1 | ||||
| -rw-r--r-- | win32/ScintillaWin.cxx | 58 | 
3 files changed, 64 insertions, 0 deletions
| diff --git a/src/Editor.cxx b/src/Editor.cxx index eff38e63a..0ef69d1bf 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1394,6 +1394,7 @@ void Editor::EnsureCaretVisible(bool useMargin, bool vert, bool horiz) {  			Redraw();  		}  	} +	UpdateSystemCaret();  }  void Editor::ShowCaretAtCurrentPosition() { @@ -1418,6 +1419,10 @@ void Editor::InvalidateCaret() {  		InvalidateRange(posDrag, posDrag + 1);  	else  		InvalidateRange(currentPos, currentPos + 1); +	UpdateSystemCaret(); +} + +void Editor::UpdateSystemCaret() {  }  void Editor::NeedWrapping(int docLineStartWrapping, int docLineEndWrapping) { diff --git a/src/Editor.h b/src/Editor.h index d5116f0de..181e1ffd4 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -369,6 +369,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor  	void ShowCaretAtCurrentPosition();  	void DropCaret();  	void InvalidateCaret(); +	virtual void UpdateSystemCaret();  	void NeedWrapping(int docLineStartWrapping = 0, int docLineEndWrapping = 0x7ffffff);  	bool WrapLines(bool fullWrap, int priorityWrapLineStart); diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index e7a57ae9c..1038f4838 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -184,6 +184,7 @@ class ScintillaWin :  	virtual void SetMouseCapture(bool on);  	virtual bool HaveMouseCapture();  	virtual void ScrollText(int linesToMove); +	virtual void UpdateSystemCaret();  	virtual void SetVerticalScrollPos();  	virtual void SetHorizontalScrollPos();  	virtual bool ModifyScrollBars(int nMax, int nPage); @@ -251,6 +252,15 @@ public:  	bool DragIsRectangularOK(CLIPFORMAT fmt) {  		return drag.rectangular && (fmt == cfColumnSelect);  	} + +private: +	// For use in creating a system caret +	bool HasCaretSizeChanged(); +	BOOL CreateSystemCaret(); +	BOOL DestroySystemCaret(); +	HBITMAP sysCaretBitmap; +	int sysCaretWidth; +	int sysCaretHeight;  };  HINSTANCE ScintillaWin::hInstance = 0; @@ -276,6 +286,10 @@ ScintillaWin::ScintillaWin(HWND hwnd) {  	ds.sci = this;  	dt.sci = this; +	sysCaretBitmap = 0; +	sysCaretWidth = 0; +	sysCaretHeight = 0; +  	Initialise();  } @@ -742,6 +756,7 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam  			if (!wParam ||  				!(::IsChild(wThis,wOther) || (wOther == wCT))) {  				SetFocusState(false); +				DestroySystemCaret();  			}  		}  		//RealizeWindowPalette(true); @@ -750,6 +765,7 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam  	case WM_SETFOCUS:  		SetFocusState(true);  		RealizeWindowPalette(false); +		CreateSystemCaret();  		break;  	case WM_SYSCOLORCHANGE: @@ -978,6 +994,17 @@ void ScintillaWin::ScrollText(int linesToMove) {  	::UpdateWindow(MainHWND());  } +void ScintillaWin::UpdateSystemCaret() { +	if (hasFocus) { +		if (HasCaretSizeChanged()) { +			DestroySystemCaret(); +			CreateSystemCaret(); +		} +		Point pos = LocationFromPosition(currentPos); +		::SetCaretPos(pos.x, pos.y); +	} +} +  int ScintillaWin::SetScrollInfo(int nBar, LPCSCROLLINFO lpsi, BOOL bRedraw) {  	return ::SetScrollInfo(MainHWND(), nBar, lpsi, bRedraw);  } @@ -2100,6 +2127,37 @@ bool ScintillaWin::Unregister() {  	return result;  } +bool ScintillaWin::HasCaretSizeChanged() { +	if ( +		( (0 != vs.caretWidth) && (sysCaretWidth != vs.caretWidth) ) +		|| (0 != vs.lineHeight) && (sysCaretHeight != vs.lineHeight) +		) { +		return true; +	} +	return false; +} + +BOOL ScintillaWin::CreateSystemCaret() { +	sysCaretWidth = vs.caretWidth; +	if (0 == sysCaretWidth) { +		sysCaretWidth = 1; +	} +	sysCaretHeight = vs.lineHeight; +	sysCaretBitmap = ::CreateBitmap(sysCaretWidth, sysCaretHeight, 1, 1, NULL); +	BOOL retval = ::CreateCaret( +		MainHWND(), sysCaretBitmap, +		sysCaretWidth, sysCaretHeight); +	::ShowCaret(MainHWND()); +	return retval; +} + +BOOL ScintillaWin::DestroySystemCaret() { +	::HideCaret(MainHWND()); +	BOOL retval = ::DestroyCaret(); +	::DeleteObject(sysCaretBitmap); +	return retval; +} +   // Take care of 32/64 bit pointers  #ifdef GetWindowLongPtr  static void *PointerFromWindow(HWND hWnd) { | 
