diff --git a/src/Edit.cpp b/src/Edit.cpp index d45a55e505..2ad0ca7b52 100644 --- a/src/Edit.cpp +++ b/src/Edit.cpp @@ -4332,19 +4332,20 @@ void EditJumpTo(Sci_Line iNewLine, Sci_Position iNewCol) noexcept { // void EditSelectEx(Sci_Position iAnchorPos, Sci_Position iCurrentPos) noexcept { const Sci_Line iNewLine = SciCall_LineFromPosition(iCurrentPos); - const Sci_Line iAnchorLine = (iAnchorPos == iCurrentPos)? iNewLine : SciCall_LineFromPosition(iAnchorPos); - SciCall_EnsureVisible(iAnchorLine); - if (iAnchorLine == iNewLine) { - // TODO: center current line on screen when it's not visible - } else { + if (iAnchorPos != iCurrentPos) { + const Sci_Line iAnchorLine = SciCall_LineFromPosition(iAnchorPos); // Ensure that the first and last lines of a selection are always unfolded // This needs to be done *before* the SciCall_SetSel() message - SciCall_EnsureVisible(iNewLine); + if (iAnchorLine != iNewLine) { + SciCall_EnsureVisible(iAnchorLine); + } } SciCall_SetXCaretPolicy(CARET_SLOP | CARET_STRICT | CARET_EVEN, 50); SciCall_SetYCaretPolicy(CARET_SLOP | CARET_STRICT | CARET_EVEN, 5); + // center current line on screen when it's not visible + SciCall_EnsureVisibleEnforcePolicy(iNewLine); if (iAnchorPos == iCurrentPos) { SciCall_GotoPos(iAnchorPos); } else { diff --git a/src/SciCall.h b/src/SciCall.h index 1e127e669e..b46a16b716 100644 --- a/src/SciCall.h +++ b/src/SciCall.h @@ -1368,6 +1368,10 @@ inline void SciCall_EnsureVisible(Sci_Line line) noexcept { SciCall(SCI_ENSUREVISIBLE, line, 0); } +inline void SciCall_EnsureVisibleEnforcePolicy(Sci_Line line) noexcept { + SciCall(SCI_ENSUREVISIBLEENFORCEPOLICY, line, 0); +} + // Line wrapping inline void SciCall_SetWrapMode(int wrapMode) noexcept {