tImplementing Back Color Erase (BCE). - st - [fork] customized build of st, the… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit b78c5085f72d66de26468e2c07fb3c72d0afe63b | |
parent b4b513c791e01e46399b460789b830ddfc7cb425 | |
Author: Christoph Lohmann <[email protected]> | |
Date: Sun, 20 Jan 2013 14:54:35 +0100 | |
Implementing Back Color Erase (BCE). | |
Diffstat: | |
M st.c | 63 +++++++++++++++++++----------… | |
M st.info | 2 +- | |
2 files changed, 40 insertions(+), 25 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -152,7 +152,7 @@ typedef struct { | |
uchar state; /* state flags */ | |
} Glyph; | |
-typedef Glyph* Line; | |
+typedef Glyph *Line; | |
typedef struct { | |
Glyph attr; /* current char attributes */ | |
t@@ -303,7 +303,7 @@ static void strhandle(void); | |
static void strparse(void); | |
static void strreset(void); | |
-static void tclearregion(int, int, int, int); | |
+static void tclearregion(int, int, int, int, int); | |
static void tcursor(int); | |
static void tdeletechar(int); | |
static void tdeleteline(int); | |
t@@ -1113,7 +1113,7 @@ treset(void) { | |
term.bot = term.row - 1; | |
term.mode = MODE_WRAP; | |
- tclearregion(0, 0, term.col-1, term.row-1); | |
+ tclearregion(0, 0, term.col-1, term.row-1, 0); | |
tmoveto(0, 0); | |
tcursor(CURSOR_SAVE); | |
} | |
t@@ -1157,7 +1157,7 @@ tscrolldown(int orig, int n) { | |
LIMIT(n, 0, term.bot-orig+1); | |
- tclearregion(0, term.bot-n+1, term.col-1, term.bot); | |
+ tclearregion(0, term.bot-n+1, term.col-1, term.bot, 0); | |
for(i = term.bot; i >= orig+n; i--) { | |
temp = term.line[i]; | |
t@@ -1177,7 +1177,7 @@ tscrollup(int orig, int n) { | |
Line temp; | |
LIMIT(n, 0, term.bot-orig+1); | |
- tclearregion(0, orig, term.col-1, orig+n-1); | |
+ tclearregion(0, orig, term.col-1, orig+n-1, 0); | |
for(i = orig; i <= term.bot-n; i++) { | |
temp = term.line[i]; | |
t@@ -1305,7 +1305,7 @@ tsetchar(char *c, Glyph *attr, int x, int y) { | |
} | |
void | |
-tclearregion(int x1, int y1, int x2, int y2) { | |
+tclearregion(int x1, int y1, int x2, int y2, int bce) { | |
int x, y, temp; | |
if(x1 > x2) | |
t@@ -1320,8 +1320,15 @@ tclearregion(int x1, int y1, int x2, int y2) { | |
for(y = y1; y <= y2; y++) { | |
term.dirty[y] = 1; | |
- for(x = x1; x <= x2; x++) | |
- term.line[y][x].state = 0; | |
+ for(x = x1; x <= x2; x++) { | |
+ if(bce) { | |
+ term.line[y][x] = term.c.attr; | |
+ memcpy(term.line[y][x].c, " ", 2); | |
+ term.line[y][x].state |= GLYPH_SET; | |
+ } else { | |
+ term.line[y][x].state = 0; | |
+ } | |
+ } | |
} | |
} | |
t@@ -1334,13 +1341,13 @@ tdeletechar(int n) { | |
term.dirty[term.c.y] = 1; | |
if(src >= term.col) { | |
- 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, 0); | |
return; | |
} | |
memmove(&term.line[term.c.y][dst], &term.line[term.c.y][src], | |
size * sizeof(Glyph)); | |
- tclearregion(term.col-n, term.c.y, term.col-1, term.c.y); | |
+ tclearregion(term.col-n, term.c.y, term.col-1, term.c.y, 0); | |
} | |
void | |
t@@ -1352,13 +1359,13 @@ tinsertblank(int n) { | |
term.dirty[term.c.y] = 1; | |
if(dst >= term.col) { | |
- 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, 0); | |
return; | |
} | |
memmove(&term.line[term.c.y][dst], &term.line[term.c.y][src], | |
size * sizeof(Glyph)); | |
- tclearregion(src, term.c.y, dst - 1, term.c.y); | |
+ tclearregion(src, term.c.y, dst - 1, term.c.y, 0); | |
} | |
void | |
t@@ -1542,8 +1549,10 @@ tsetmode(bool priv, bool set, int *args, int narg) { | |
case 47: | |
case 1047: { | |
alt = IS_SET(MODE_ALTSCREEN); | |
- if(alt) | |
- tclearregion(0, 0, term.col-1, term.ro… | |
+ if(alt) { | |
+ tclearregion(0, 0, term.col-1, | |
+ term.row-1, 0); | |
+ } | |
if(set ^ alt) /* set is always … | |
tswapscreen(); | |
if(*args != 1049) | |
t@@ -1662,17 +1671,19 @@ csihandle(void) { | |
sel.bx = -1; | |
switch(csiescseq.arg[0]) { | |
case 0: /* below */ | |
- tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); | |
- if(term.c.y < term.row-1) | |
- tclearregion(0, term.c.y+1, term.col-1, term.r… | |
+ tclearregion(term.c.x, term.c.y, term.col-1, term.c.y,… | |
+ if(term.c.y < term.row-1) { | |
+ tclearregion(0, term.c.y+1, term.col-1, | |
+ term.row-1, 1); | |
+ } | |
break; | |
case 1: /* above */ | |
if(term.c.y > 1) | |
- tclearregion(0, 0, term.col-1, term.c.y-1); | |
- tclearregion(0, term.c.y, term.c.x, term.c.y); | |
+ tclearregion(0, 0, term.col-1, term.c.y-1, 1); | |
+ tclearregion(0, term.c.y, term.c.x, term.c.y, 1); | |
break; | |
case 2: /* all */ | |
- tclearregion(0, 0, term.col-1, term.row-1); | |
+ tclearregion(0, 0, term.col-1, term.row-1, 1); | |
break; | |
default: | |
goto unknown; | |
t@@ -1681,13 +1692,14 @@ csihandle(void) { | |
case 'K': /* EL -- Clear line */ | |
switch(csiescseq.arg[0]) { | |
case 0: /* right */ | |
- 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, 1); | |
break; | |
case 1: /* left */ | |
- tclearregion(0, term.c.y, term.c.x, term.c.y); | |
+ tclearregion(0, term.c.y, term.c.x, term.c.y, 1); | |
break; | |
case 2: /* all */ | |
- tclearregion(0, term.c.y, term.col-1, term.c.y); | |
+ tclearregion(0, term.c.y, term.col-1, term.c.y, 1); | |
break; | |
} | |
break; | |
t@@ -1712,7 +1724,8 @@ csihandle(void) { | |
break; | |
case 'X': /* ECH -- Erase <n> char */ | |
DEFAULT(csiescseq.arg[0], 1); | |
- tclearregion(term.c.x, term.c.y, term.c.x + csiescseq.arg[0], … | |
+ tclearregion(term.c.x, term.c.y, term.c.x + csiescseq.arg[0], | |
+ term.c.y, 0); | |
break; | |
case 'P': /* DCH -- Delete <n> char */ | |
DEFAULT(csiescseq.arg[0], 1); | |
t@@ -2505,6 +2518,7 @@ xinit(void) { | |
xw.fy = 0; | |
} | |
+ /* Events */ | |
attrs.background_pixel = dc.col[defaultbg].pixel; | |
attrs.border_pixel = dc.col[defaultbg].pixel; | |
attrs.bit_gravity = NorthWestGravity; | |
t@@ -2898,6 +2912,7 @@ drawregion(int x1, int y1, int x2, int y2) { | |
ox = x; | |
base = new; | |
} | |
+ | |
sl = utf8size(new.c); | |
memcpy(buf+ib, new.c, sl); | |
ib += sl; | |
diff --git a/st.info b/st.info | |
t@@ -3,7 +3,7 @@ | |
st| simpleterm, | |
acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, | |
am, | |
-# bce, | |
+ bce, | |
bel=^G, | |
# blink=\E[5m, | |
bold=\E[1m, |