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.
This commit is contained in:
parent
7af030c999
commit
ebbac77d74
1 changed files with 5 additions and 9 deletions
14
st.c
14
st.c
|
@ -888,11 +888,7 @@ bpress(XEvent *e) {
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
|
|
||||||
/* Clear previous selection, logically and visually. */
|
/* Clear previous selection, logically and visually. */
|
||||||
if(sel.ob.x != -1) {
|
selclear(NULL);
|
||||||
sel.ob.x = -1;
|
|
||||||
tsetdirt(sel.nb.y, sel.ne.y);
|
|
||||||
draw();
|
|
||||||
}
|
|
||||||
sel.mode = 1;
|
sel.mode = 1;
|
||||||
sel.type = SEL_REGULAR;
|
sel.type = SEL_REGULAR;
|
||||||
sel.oe.x = sel.ob.x = x2col(e->xbutton.x);
|
sel.oe.x = sel.ob.x = x2col(e->xbutton.x);
|
||||||
|
@ -1108,7 +1104,7 @@ brelease(XEvent *e) {
|
||||||
selpaste(NULL);
|
selpaste(NULL);
|
||||||
} else if(e->xbutton.button == Button1) {
|
} else if(e->xbutton.button == Button1) {
|
||||||
if(sel.mode < 2) {
|
if(sel.mode < 2) {
|
||||||
sel.ob.x = -1;
|
selclear(NULL);
|
||||||
} else {
|
} else {
|
||||||
getbuttoninfo(e);
|
getbuttoninfo(e);
|
||||||
selcopy();
|
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(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) {
|
if((sel.ob.y += n) > term.bot || (sel.oe.y += n) < term.top) {
|
||||||
sel.ob.x = -1;
|
selclear(NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(sel.type == SEL_RECTANGULAR) {
|
if(sel.type == SEL_RECTANGULAR) {
|
||||||
|
@ -1951,7 +1947,7 @@ csihandle(void) {
|
||||||
tputtab(1);
|
tputtab(1);
|
||||||
break;
|
break;
|
||||||
case 'J': /* ED -- Clear screen */
|
case 'J': /* ED -- Clear screen */
|
||||||
sel.ob.x = -1;
|
selclear(NULL);
|
||||||
switch(csiescseq.arg[0]) {
|
switch(csiescseq.arg[0]) {
|
||||||
case 0: /* below */
|
case 0: /* below */
|
||||||
tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
|
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))
|
if(control && !(term.c.attr.mode & ATTR_GFX))
|
||||||
return;
|
return;
|
||||||
if(sel.ob.x != -1 && BETWEEN(term.c.y, sel.ob.y, sel.oe.y))
|
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)) {
|
if(IS_SET(MODE_WRAP) && (term.c.state & CURSOR_WRAPNEXT)) {
|
||||||
term.line[term.c.y][term.c.x].mode |= ATTR_WRAP;
|
term.line[term.c.y][term.c.x].mode |= ATTR_WRAP;
|
||||||
tnewline(1);
|
tnewline(1);
|
||||||
|
|
Loading…
Reference in a new issue