aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto E. Vargas Caballero <k0ga@shike2.com>2013-06-23 12:09:19 +0200
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2013-07-04 09:14:50 +0200
commitebbac77d7416d365a2a33f159780ef0f06cc3351 (patch)
treeeb2a09055418bea363d6bcc9f33ed2f1d4071816
parent7af030c999ba87cad2f3155bb9f58bf2854ad2bb (diff)
downloadst-ebbac77d7416d365a2a33f159780ef0f06cc3351.tar.gz
Fix selection clearing
The way st knows if there is a selection activated is checking if sel.ob.x is equal to -1. In some parts of the code the way of disabling the selection was only setting it to -1, but after it you can't be sure if the selection is clearing from the terminal representation, because it is necessary mark all the lines affected by the selection as dirty. Already there is a functon which perform this task, selclear.
-rw-r--r--st.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/st.c b/st.c
index 2811876..96111a0 100644
--- a/st.c
+++ b/st.c
@@ -888,11 +888,7 @@ bpress(XEvent *e) {
gettimeofday(&now, NULL);
/* Clear previous selection, logically and visually. */
- if(sel.ob.x != -1) {
- sel.ob.x = -1;
- tsetdirt(sel.nb.y, sel.ne.y);
- draw();
- }
+ selclear(NULL);
sel.mode = 1;
sel.type = SEL_REGULAR;
sel.oe.x = sel.ob.x = x2col(e->xbutton.x);
@@ -1108,7 +1104,7 @@ brelease(XEvent *e) {
selpaste(NULL);
} else if(e->xbutton.button == Button1) {
if(sel.mode < 2) {
- sel.ob.x = -1;
+ selclear(NULL);
} else {
getbuttoninfo(e);
selcopy();
@@ -1441,7 +1437,7 @@ selscroll(int orig, int n) {
if(BETWEEN(sel.ob.y, orig, term.bot) || BETWEEN(sel.oe.y, orig, term.bot)) {
if((sel.ob.y += n) > term.bot || (sel.oe.y += n) < term.top) {
- sel.ob.x = -1;
+ selclear(NULL);
return;
}
if(sel.type == SEL_RECTANGULAR) {
@@ -1951,7 +1947,7 @@ csihandle(void) {
tputtab(1);
break;
case 'J': /* ED -- Clear screen */
- sel.ob.x = -1;
+ selclear(NULL);
switch(csiescseq.arg[0]) {
case 0: /* below */
tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
@@ -2448,7 +2444,7 @@ tputc(char *c, int len) {
if(control && !(term.c.attr.mode & ATTR_GFX))
return;
if(sel.ob.x != -1 && BETWEEN(term.c.y, sel.ob.y, sel.oe.y))
- sel.ob.x = -1;
+ selclear(NULL);
if(IS_SET(MODE_WRAP) && (term.c.state & CURSOR_WRAPNEXT)) {
term.line[term.c.y][term.c.x].mode |= ATTR_WRAP;
tnewline(1);