Xinqi Bao's Git
projects
/
st.git
/ commitdiff
summary
|
log
|
commit
|
diff
|
tree
raw
|
patch
|
inline
| side by side (from parent 1:
b4b513c
)
Implementing Back Color Erase (BCE).
author
Christoph Lohmann <
[email protected]
>
Sun, 20 Jan 2013 13:54:35 +0000
(14:54 +0100)
committer
Christoph Lohmann <
[email protected]
>
Sun, 20 Jan 2013 13:54:35 +0000
(14:54 +0100)
st.c
patch
|
blob
|
history
st.info
patch
|
blob
|
history
diff --git
a/st.c
b/st.c
index
769de8b
..
5f75c39
100644
(file)
--- a/
st.c
+++ b/
st.c
@@
-152,7
+152,7
@@
typedef struct {
uchar state; /* state flags */
} Glyph;
uchar state; /* state flags */
} Glyph;
-typedef Glyph
*
Line;
+typedef Glyph
*
Line;
typedef struct {
Glyph attr; /* current char attributes */
typedef struct {
Glyph attr; /* current char attributes */
@@
-303,7
+303,7
@@
static void strhandle(void);
static void strparse(void);
static void strreset(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);
static void tcursor(int);
static void tdeletechar(int);
static void tdeleteline(int);
@@
-1113,7
+1113,7
@@
treset(void) {
term.bot = term.row - 1;
term.mode = MODE_WRAP;
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);
}
tmoveto(0, 0);
tcursor(CURSOR_SAVE);
}
@@
-1157,7
+1157,7
@@
tscrolldown(int orig, int n) {
LIMIT(n, 0, term.bot-orig+1);
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];
for(i = term.bot; i >= orig+n; i--) {
temp = term.line[i];
@@
-1177,7
+1177,7
@@
tscrollup(int orig, int n) {
Line temp;
LIMIT(n, 0, term.bot-orig+1);
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];
for(i = orig; i <= term.bot-n; i++) {
temp = term.line[i];
@@
-1305,7
+1305,7
@@
tsetchar(char *c, Glyph *attr, int x, int y) {
}
void
}
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)
int x, y, temp;
if(x1 > x2)
@@
-1320,8
+1320,15
@@
tclearregion(int x1, int y1, int x2, int y2) {
for(y = y1; y <= y2; y++) {
term.dirty[y] = 1;
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;
+ }
+ }
}
}
}
}
@@
-1334,13
+1341,13
@@
tdeletechar(int n) {
term.dirty[term.c.y] = 1;
if(src >= term.col) {
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));
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
}
void
@@
-1352,13
+1359,13
@@
tinsertblank(int n) {
term.dirty[term.c.y] = 1;
if(dst >= term.col) {
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));
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
}
void
@@
-1542,8
+1549,10
@@
tsetmode(bool priv, bool set, int *args, int narg) {
case 47:
case 1047: {
alt = IS_SET(MODE_ALTSCREEN);
case 47:
case 1047: {
alt = IS_SET(MODE_ALTSCREEN);
- if(alt)
- tclearregion(0, 0, term.col-1, term.row-1);
+ if(alt) {
+ tclearregion(0, 0, term.col-1,
+ term.row-1, 0);
+ }
if(set ^ alt) /* set is always 1 or 0 */
tswapscreen();
if(*args != 1049)
if(set ^ alt) /* set is always 1 or 0 */
tswapscreen();
if(*args != 1049)
@@
-1662,17
+1671,19
@@
csihandle(void) {
sel.bx = -1;
switch(csiescseq.arg[0]) {
case 0: /* below */
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.row-1);
+ tclearregion(term.c.x, term.c.y, term.col-1, term.c.y, 1);
+ 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)
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 */
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;
break;
default:
goto unknown;
@@
-1681,13
+1692,14
@@
csihandle(void) {
case 'K': /* EL -- Clear line */
switch(csiescseq.arg[0]) {
case 0: /* right */
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 */
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 */
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;
break;
}
break;
@@
-1712,7
+1724,8
@@
csihandle(void) {
break;
case 'X': /* ECH -- Erase <n> char */
DEFAULT(csiescseq.arg[0], 1);
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], term.c.y);
+ 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);
break;
case 'P': /* DCH -- Delete <n> char */
DEFAULT(csiescseq.arg[0], 1);
@@
-2505,6
+2518,7
@@
xinit(void) {
xw.fy = 0;
}
xw.fy = 0;
}
+ /* Events */
attrs.background_pixel = dc.col[defaultbg].pixel;
attrs.border_pixel = dc.col[defaultbg].pixel;
attrs.bit_gravity = NorthWestGravity;
attrs.background_pixel = dc.col[defaultbg].pixel;
attrs.border_pixel = dc.col[defaultbg].pixel;
attrs.bit_gravity = NorthWestGravity;
@@
-2898,6
+2912,7
@@
drawregion(int x1, int y1, int x2, int y2) {
ox = x;
base = new;
}
ox = x;
base = new;
}
+
sl = utf8size(new.c);
memcpy(buf+ib, new.c, sl);
ib += sl;
sl = utf8size(new.c);
memcpy(buf+ib, new.c, sl);
ib += sl;
diff --git
a/st.info
b/st.info
index
fcaa024
..
1c83dc1
100644
(file)
--- a/
st.info
+++ b/
st.info
@@
-3,7
+3,7
@@
st| simpleterm,
acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
am,
st| simpleterm,
acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
am,
-
#
bce,
+
bce,
bel=^G,
# blink=\E[5m,
bold=\E[1m,
bel=^G,
# blink=\E[5m,
bold=\E[1m,