tCheck alternative screen before drawing box selection - st - [fork] customized… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 98b6f84bfcb63cff54f8aee87191432fa769346c | |
parent 66669a558560c0ba3b5da4cd2009de81d68a2263 | |
Author: Roberto E. Vargas Caballero <[email protected]> | |
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 | |
tthe 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(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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; | |
t@@ -579,6 +580,7 @@ selcopy(void) { | |
} | |
*ptr = 0; | |
} | |
+ sel.alt = IS_SET(MODE_ALTSCREEN); | |
xsetsel(str); | |
} | |
t@@ -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; | |
t@@ -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… | |
ib >= DRAW_BUF_SIZ-UTF_SIZ))… |