URI: 
       Applying the CBT patch of Roberto Vargas. Thanks. - st - simple terminal
  HTML git clone https://git.parazyd.org/st
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit c58950f2efd8f203e72add7b22e7f5b973c09a7d
   DIR parent 91fa81dbac4f09de234921cdf5afacb8c8295919
  HTML Author: Christoph Lohmann <20h@r-36.net>
       Date:   Thu, 30 Aug 2012 21:17:54 +0200
       
       Applying the CBT patch of Roberto Vargas. Thanks.
       
       Diffstat:
         M st.c                                |      59 +++++++++++++++++++------------
       
       1 file changed, 36 insertions(+), 23 deletions(-)
       ---
   DIR diff --git a/st.c b/st.c
       @@ -97,11 +97,11 @@ enum glyph_state {
        };
        
        enum term_mode {
       -        MODE_WRAP        = 1,
       +        MODE_WRAP        = 1,
                MODE_INSERT      = 2,
                MODE_APPKEYPAD   = 4,
                MODE_ALTSCREEN   = 8,
       -        MODE_CRLF        = 16,
       +        MODE_CRLF        = 16,
                MODE_MOUSEBTN    = 32,
                MODE_MOUSEMOTION = 64,
                MODE_MOUSE       = 32|64,
       @@ -110,8 +110,8 @@ enum term_mode {
        
        enum escape_state {
                ESC_START      = 1,
       -        ESC_CSI        = 2,
       -        ESC_STR        = 4, /* DSC, OSC, PM, APC */
       +        ESC_CSI        = 2,
       +        ESC_STR        = 4, /* DSC, OSC, PM, APC */
                ESC_ALTCHARSET = 8,
                ESC_STR_END    = 16, /* a final string was encountered */
        };
       @@ -152,21 +152,21 @@ typedef struct {
        /* ESC '[' [[ [<priv>] <arg> [;]] <mode>] */
        typedef struct {
                char buf[ESC_BUF_SIZ]; /* raw string */
       -        int len;               /* raw string length */
       +        int len;               /* raw string length */
                char priv;
                int arg[ESC_ARG_SIZ];
       -        int narg;              /* nb of args */
       +        int narg;              /* nb of args */
                char mode;
        } CSIEscape;
        
        /* STR Escape sequence structs */
        /* ESC type [[ [<priv>] <arg> [;]] <mode>] ESC '\' */
        typedef struct {
       -        char type;             /* ESC type ... */
       +        char type;             /* ESC type ... */
                char buf[STR_BUF_SIZ]; /* raw string */
       -        int len;               /* raw string length */
       +        int len;               /* raw string length */
                char *args[STR_ARG_SIZ];
       -        int narg;              /* nb of args */
       +        int narg;              /* nb of args */
        } STREscape;
        
        /* Internal representation of the screen */
       @@ -262,7 +262,7 @@ static void tinsertblankline(int);
        static void tmoveto(int, int);
        static void tnew(int, int);
        static void tnewline(int);
       -static void tputtab(void);
       +static void tputtab(bool);
        static void tputc(char*);
        static void treset(void);
        static int tresize(int, int);
       @@ -1243,7 +1243,7 @@ csihandle(void) {
                case 'I': /* CHT -- Cursor Forward Tabulation <n> tab stops */
                        DEFAULT(csiescseq.arg[0], 1);
                        while (csiescseq.arg[0]--)
       -                        tputtab();
       +                        tputtab(1);
                        break;
                case 'J': /* ED -- Clear screen */
                        sel.bx = -1;
       @@ -1356,7 +1356,11 @@ csihandle(void) {
                        DEFAULT(csiescseq.arg[0], 1);
                        tdeletechar(csiescseq.arg[0]);
                        break;
       -        /* XXX: (CSI n Z) CBT -- Cursor Backward Tabulation <n> tab stops */
       +        case 'Z': /* CBT -- Cursor Backward Tabulation <n> tab stops */
       +                DEFAULT(csiescseq.arg[0], 1);
       +                while (csiescseq.arg[0]--)
       +                        tputtab(0);
       +                break;
                case 'd': /* VPA -- Move to <row> */
                        DEFAULT(csiescseq.arg[0], 1);
                        tmoveto(term.c.x, csiescseq.arg[0]-1);
       @@ -1528,11 +1532,20 @@ strreset(void) {
        }
        
        void
       -tputtab(void) {
       -        unsigned x;
       +tputtab(bool forward) {
       +        unsigned x = term.c.x;
        
       -        for (x = term.c.x + 1; x < term.col && !term.tabs[x]; ++x)
       -                /* nothing */ ;
       +        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 */ ;
       +        }
                tmoveto(x, term.c.y);
        }
        
       @@ -1650,7 +1663,7 @@ tputc(char *c) {
                                sel.bx = -1;
                        switch(ascii) {
                        case '\t':
       -                        tputtab();
       +                        tputtab(1);
                                break;
                        case '\b':
                                tmoveto(term.c.x-1, term.c.y);
       @@ -1806,8 +1819,8 @@ void
        xclear(int x1, int y1, int x2, int y2) {
                XSetForeground(xw.dpy, dc.gc, dc.col[IS_SET(MODE_REVERSE) ? DefaultFG : DefaultBG]);
                XFillRectangle(xw.dpy, xw.buf, dc.gc,
       -                       BORDER + x1 * xw.cw, BORDER + y1 * xw.ch,
       -                       (x2-x1+1) * xw.cw, (y2-y1+1) * xw.ch);
       +                       BORDER + x1 * xw.cw, BORDER + y1 * xw.ch,
       +                       (x2-x1+1) * xw.cw, (y2-y1+1) * xw.ch);
        }
        
        void
       @@ -1982,8 +1995,8 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
        /* copy buffer pixmap to screen pixmap */
        void
        xcopy() {
       -        XdbeSwapInfo swpinfo[1] = {{xw.win, XdbeCopied}};
       -        XdbeSwapBuffers(xw.dpy, swpinfo, 1);
       +        XdbeSwapInfo swpinfo[1] = {{xw.win, XdbeCopied}};
       +        XdbeSwapBuffers(xw.dpy, swpinfo, 1);
        
        }
        
       @@ -2080,8 +2093,8 @@ expose(XEvent *ev) {
                if(xw.state & WIN_REDRAW) {
                        if(!e->count)
                                xw.state &= ~WIN_REDRAW;
       -        }
       -        xcopy();
       +        }
       +        xcopy();
        }
        
        void