tApplying the CBT patch of Roberto Vargas. Thanks. - st - [fork] customized bui… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c58950f2efd8f203e72add7b22e7f5b973c09a7d | |
parent 91fa81dbac4f09de234921cdf5afacb8c8295919 | |
Author: Christoph Lohmann <[email protected]> | |
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(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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, | |
t@@ -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 */ | |
}; | |
t@@ -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 */ | |
t@@ -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); | |
t@@ -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; | |
t@@ -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); | |
t@@ -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); | |
} | |
t@@ -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); | |
t@@ -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 … | |
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 | |
t@@ -1982,8 +1995,8 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, i… | |
/* 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); | |
} | |
t@@ -2080,8 +2093,8 @@ expose(XEvent *ev) { | |
if(xw.state & WIN_REDRAW) { | |
if(!e->count) | |
xw.state &= ~WIN_REDRAW; | |
- } | |
- xcopy(); | |
+ } | |
+ xcopy(); | |
} | |
void |