aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2019-06-21 07:16:45 +1000
committerNeil <nyamatongwe@gmail.com>2019-06-21 07:16:45 +1000
commit8b8e1f383f0dbabc5e2f4666f4c5aa8860a91848 (patch)
treef398bde19d8e842fd4a4185f89775de5f876ec33
parent1db15a4f04a7c337b8061efe3ef033b21bba0cec (diff)
downloadscintilla-mirror-8b8e1f383f0dbabc5e2f4666f4c5aa8860a91848.tar.gz
Backport: Bug [#2106]. Place line caret in correct location for line caret with block OVR.
That is for CARETSTYLE_LINE | CARETSTYLE_BLOCK mode. Backport of changeset 7608:b725657be4ae.
-rw-r--r--doc/ScintillaHistory.html4
-rw-r--r--src/EditView.cxx4
-rw-r--r--src/ViewStyle.cxx6
-rw-r--r--src/ViewStyle.h1
4 files changed, 14 insertions, 1 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index fae258457..9a67db1d8 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -580,6 +580,10 @@
<a href="https://sourceforge.net/p/scintilla/bugs/2110/">Bug #2110</a>.
</li>
<li>
+ Fix position of line caret when overstrike caret set to block.
+ <a href="https://sourceforge.net/p/scintilla/bugs/2106/">Bug #2106</a>.
+ </li>
+ <li>
On GTK, reset IME when mouse is clicked.
<a href="https://sourceforge.net/p/scintilla/bugs/2111/">Bug #2111</a>.
</li>
diff --git a/src/EditView.cxx b/src/EditView.cxx
index fdcd9f287..6850d0964 100644
--- a/src/EditView.cxx
+++ b/src/EditView.cxx
@@ -1334,7 +1334,9 @@ void EditView::DrawCarets(Surface *surface, const EditModel &model, const ViewSt
for (size_t r = 0; (r<model.sel.Count()) || drawDrag; r++) {
const bool mainCaret = r == model.sel.Main();
SelectionPosition posCaret = (drawDrag ? model.posDrag : model.sel.Range(r).caret);
- if ((vsDraw.IsBlockCaretStyle() || imeCaretBlockOverride) && !drawDrag && posCaret > model.sel.Range(r).anchor) {
+ if ((vsDraw.DrawCaretInsideSelection(model.inOverstrike, imeCaretBlockOverride)) &&
+ !drawDrag &&
+ posCaret > model.sel.Range(r).anchor) {
if (posCaret.VirtualSpace() > 0)
posCaret.SetVirtualSpace(posCaret.VirtualSpace() - 1);
else
diff --git a/src/ViewStyle.cxx b/src/ViewStyle.cxx
index ddebf862b..c867c2f76 100644
--- a/src/ViewStyle.cxx
+++ b/src/ViewStyle.cxx
@@ -548,6 +548,12 @@ bool ViewStyle::IsBlockCaretStyle() const noexcept {
return (caretStyle == CARETSTYLE_BLOCK) || (caretStyle & CARETSTYLE_OVERSTRIKE_BLOCK) != 0;
}
+bool ViewStyle::DrawCaretInsideSelection(bool inOverstrike, bool imeCaretBlockOverride) const noexcept {
+ return ((caretStyle & CARETSTYLE_INS_MASK) == CARETSTYLE_BLOCK) ||
+ (inOverstrike && (caretStyle & CARETSTYLE_OVERSTRIKE_BLOCK) != 0) ||
+ imeCaretBlockOverride;
+}
+
ViewStyle::CaretShape ViewStyle::CaretShapeForMode(bool inOverstrike) const noexcept {
if (inOverstrike) {
return (caretStyle & CARETSTYLE_OVERSTRIKE_BLOCK) ? CaretShape::block : CaretShape::bar;
diff --git a/src/ViewStyle.h b/src/ViewStyle.h
index 587eb976a..0235b3651 100644
--- a/src/ViewStyle.h
+++ b/src/ViewStyle.h
@@ -201,6 +201,7 @@ public:
enum class CaretShape { invisible, line, block, bar };
bool IsBlockCaretStyle() const noexcept;
+ bool DrawCaretInsideSelection(bool inOverstrike, bool imeCaretBlockOverride) const noexcept;
CaretShape CaretShapeForMode(bool inOverstrike) const noexcept;
private: