Check alternative screen before drawing box selection - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 98b6f84bfcb63cff54f8aee87191432fa769346c
 (DIR) parent 66669a558560c0ba3b5da4cd2009de81d68a2263
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Tue,  4 Sep 2012 20:33:01 +0200
       
       Check alternative screen before drawing box selection
       
       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(-)
       Diffstat:
         M st.c                                |       7 ++++++-
       
       1 file changed, 6 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git 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)) {