X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=st.c;h=653cd49a5af05cf214cd394f4bce159b0e10d4f4;hb=4a8574b439e2118bd4cb40374185fba861903620;hp=1a2b1ddc82148e4b16201eda50cbc8ac6258bad0;hpb=99d2d6007ace1d5558ee349224af275722fcc701;p=st.git diff --git a/st.c b/st.c index 1a2b1dd..653cd49 100644 --- a/st.c +++ b/st.c @@ -375,7 +375,7 @@ static void tmoveto(int, int); static void tmoveato(int, int); static void tnew(int, int); static void tnewline(int); -static void tputtab(bool); +static void tputtab(int); static void tputc(char *, int); static void treset(void); static int tresize(int, int); @@ -992,7 +992,7 @@ selnotify(XEvent *e) { } /* - * As seen in selcopy: + * As seen in getsel: * Line endings are inconsistent in the terminal and GUI world * copy and pasting. When receiving some selection data, * replace all '\n' with '\r'. @@ -1996,8 +1996,7 @@ csihandle(void) { break; case 'I': /* CHT -- Cursor Forward Tabulation tab stops */ DEFAULT(csiescseq.arg[0], 1); - while(csiescseq.arg[0]--) - tputtab(1); + tputtab(csiescseq.arg[0]); break; case 'J': /* ED -- Clear screen */ selclear(NULL); @@ -2065,8 +2064,7 @@ csihandle(void) { break; case 'Z': /* CBT -- Cursor Backward Tabulation tab stops */ DEFAULT(csiescseq.arg[0], 1); - while(csiescseq.arg[0]--) - tputtab(0); + tputtab(-csiescseq.arg[0]); break; case 'd': /* VPA -- Move to */ DEFAULT(csiescseq.arg[0], 1); @@ -2281,19 +2279,17 @@ tdump(void) { } void -tputtab(bool forward) { +tputtab(int n) { uint x = term.c.x; - if(forward) { - if(x == term.col) - return; - for(++x; x < term.col && !term.tabs[x]; ++x) - /* nothing */ ; - } else { - if(x == 0) - return; - for(--x; x > 0 && !term.tabs[x]; --x) - /* nothing */ ; + if(n > 0) { + while(x < term.col && n--) + for(++x; x < term.col && !term.tabs[x]; ++x) + /* nothing */ ; + } else if(n < 0) { + while(x > 0 && n++) + for(--x; x > 0 && !term.tabs[x]; --x) + /* nothing */ ; } tmoveto(x, term.c.y); } @@ -2678,7 +2674,9 @@ tresize(int col, int row) { if(0 < col && minrow < row) { tclearregion(0, minrow, col - 1, row - 1); } + tcursor(CURSOR_SAVE); tswapscreen(); + tcursor(CURSOR_LOAD); } while(orig != term.line); return (slide > 0); @@ -3457,7 +3455,7 @@ drawregion(int x1, int y1, int x2, int y2) { bool ena_sel = sel.ob.x != -1; long unicodep; - if(sel.alt ^ IS_SET(MODE_ALTSCREEN)) + if(sel.alt != IS_SET(MODE_ALTSCREEN)) ena_sel = 0; if(!(xw.state & WIN_VISIBLE))