commit 2fc7e532b23e2f820c6b73d352ec7c41fefa45b5
Author:     Peter Hofmann <[email protected]>
AuthorDate: Sat Oct 7 07:40:07 2023 +0200
Commit:     Hiltjo Posthuma <[email protected]>
CommitDate: Sat Oct 7 12:16:59 2023 +0200

    Don't scroll selection on the other screen
    
    Fixes garbage selections when switching to/from the alternate screen.
    
    How to reproduce:
    
    -   Be in primary screen.
    -   Select something.
    -   Run this (switches to alternate screen, positions the cursor at the
        bottom, triggers selscroll(), and then goes back to primary screen):
    
            tput smcup; tput cup $(tput lines) 0; echo foo; tput rmcup
    
    -   Notice how the (visual) selection now covers a different line.
    
    The reason is that selscroll() calls selnormalize() and that cannot find
    the original range anymore. It's all empty lines now, so it snaps to
    "select the whole line".

diff --git a/st.c b/st.c
index 623376e..3d250dd 100644
--- a/st.c
+++ b/st.c
@@ -1097,7 +1097,7 @@ tscrollup(int orig, int n)
 void
 selscroll(int orig, int n)
 {
-       if (sel.ob.x == -1)
+       if (sel.ob.x == -1 || sel.alt != IS_SET(MODE_ALTSCREEN))
                return;
 
        if (BETWEEN(sel.nb.y, orig, term.bot) != BETWEEN(sel.ne.y, orig, 
term.bot)) {

Reply via email to