]> git.armaanb.net Git - st.git/commitdiff
Check alternative screen before drawing box selection
authorRoberto E. Vargas Caballero <k0ga@shike2.com>
Tue, 4 Sep 2012 18:33:01 +0000 (20:33 +0200)
committerRoberto E. Vargas Caballero <k0ga@shike2.com>
Tue, 4 Sep 2012 18:33:01 +0000 (20:33 +0200)
Some programs use the alternative screen (vi, less, ...), whose
content is different of the main screen. If you select text in one of
the screen, you don't wait the box selection is painted in the other
screen, so it is necessary check if the selection was done in the same
screen we are going to paint. Before to this commit, you could do
something like:

$ LESS="" ls | less
(select some code)
q

and selection box remains drawing in the main screen, but the content
of selection keeps text of the alternate screen.
---
 st.c |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

st.c

diff --git a/st.c b/st.c
index 586d124ecd1db363484a072ceeaf75c97378c38f..b143582f824809062f0ac07281ac0f75b6bb17c8 100644 (file)
--- a/st.c
+++ b/st.c
@@ -221,6 +221,7 @@ typedef struct {
        struct {int x, y;} b, e;
        char *clip;
        Atom xtarget;
+       bool alt;
        struct timeval tclick1;
        struct timeval tclick2;
 } Selection;
@@ -579,6 +580,7 @@ selcopy(void) {
                }
                *ptr = 0;
        }
+       sel.alt = IS_SET(MODE_ALTSCREEN);
        xsetsel(str);
 }
 
@@ -2076,7 +2078,10 @@ drawregion(int x1, int y1, int x2, int y2) {
        int ic, ib, x, y, ox, sl;
        Glyph base, new;
        char buf[DRAW_BUF_SIZ];
+       bool ena_sel = sel.bx != -1, alt = IS_SET(MODE_ALTSCREEN);
 
+       if((sel.alt && !alt) || (!sel.alt && alt))
+               ena_sel = 0;
        if(!(xw.state & WIN_VISIBLE))
                return;
 
@@ -2089,7 +2094,7 @@ drawregion(int x1, int y1, int x2, int y2) {
                ic = ib = ox = 0;
                for(x = x1; x < x2; x++) {
                        new = term.line[y][x];
-                       if(sel.bx != -1 && *(new.c) && selected(x, y))
+                       if(ena_sel && *(new.c) && selected(x, y))
                                new.mode ^= ATTR_REVERSE;
                        if(ib > 0 && (!(new.state & GLYPH_SET) || ATTRCMP(base, new) ||
                                                  ib >= DRAW_BUF_SIZ-UTF_SIZ)) {