tGot rid of redundant Glyph state. - st - [fork] customized build of st, the si… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit b7e6a5c825a8d786a0cc4dbacc82df1c90ad7020 | |
parent 3ae02990648447ec3252b42f5b64e18818c19fd8 | |
Author: Alexander Sedov <[email protected]> | |
Date: Mon, 15 Apr 2013 17:13:19 +0400 | |
Got rid of redundant Glyph state. | |
Now, newly allocated Glyphs are set to spaces and current cursor colors | |
with tclearregion() routine. | |
Signed-off-by: Christoph Lohmann <[email protected]> | |
Diffstat: | |
M st.c | 79 +++++++++++++----------------… | |
1 file changed, 34 insertions(+), 45 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -98,11 +98,6 @@ enum cursor_state { | |
CURSOR_ORIGIN = 2 | |
}; | |
-enum glyph_state { | |
- GLYPH_SET = 1, | |
- GLYPH_DIRTY = 2 | |
-}; | |
- | |
enum term_mode { | |
MODE_WRAP = 1, | |
MODE_INSERT = 2, | |
t@@ -154,7 +149,6 @@ typedef struct { | |
uchar mode; /* attribute flags */ | |
ushort fg; /* foreground */ | |
ushort bg; /* background */ | |
- uchar state; /* state flags */ | |
} Glyph; | |
typedef Glyph *Line; | |
t@@ -757,7 +751,7 @@ bpress(XEvent *e) { | |
void | |
selcopy(void) { | |
- char *str, *ptr, *p; | |
+ char *str, *ptr; | |
int x, y, bufsize, isselected = 0, size; | |
Glyph *gp, *last; | |
t@@ -773,8 +767,8 @@ selcopy(void) { | |
gp = &term.line[y][0]; | |
last = gp + term.col; | |
- while(--last >= gp && !((last->state & GLYPH_SET) && \ | |
- selected(last - gp, y) && strc… | |
+ while(--last >= gp && !(selected(last - gp, y) && \ | |
+ strcmp(last->c, " ") != 0)) | |
/* nothing */; | |
for(x = 0; gp <= last; x++, ++gp) { | |
t@@ -784,9 +778,8 @@ selcopy(void) { | |
isselected = 1; | |
} | |
- p = (gp->state & GLYPH_SET) ? gp->c : " "; | |
- size = utf8size(p); | |
- memcpy(ptr, p, size); | |
+ size = utf8size(gp->c); | |
+ memcpy(ptr, gp->c, size); | |
ptr += size; | |
} | |
t@@ -943,13 +936,11 @@ brelease(XEvent *e) { | |
} else if(TIMEDIFF(now, sel.tclick1) <= doubleclicktim… | |
/* double click to select word */ | |
sel.bx = sel.ex; | |
- while(sel.bx > 0 && term.line[sel.ey][sel.bx-1… | |
- term.line[sel.ey][sel.bx-1].c[… | |
+ while(sel.bx > 0 && term.line[sel.ey][sel.bx-1… | |
sel.bx--; | |
} | |
sel.b.x = sel.bx; | |
- while(sel.ex < term.col-1 && term.line[sel.ey]… | |
- term.line[sel.ey][sel.ex+1].c[… | |
+ while(sel.ex < term.col-1 && term.line[sel.ey]… | |
sel.ex++; | |
} | |
sel.e.x = sel.ex; | |
t@@ -1373,7 +1364,6 @@ tsetchar(char *c, Glyph *attr, int x, int y) { | |
term.dirty[y] = 1; | |
term.line[y][x] = *attr; | |
memcpy(term.line[y][x].c, c, UTF_SIZ); | |
- term.line[y][x].state |= GLYPH_SET; | |
} | |
void | |
t@@ -1395,7 +1385,6 @@ tclearregion(int x1, int y1, int x2, int y2) { | |
for(x = x1; x <= x2; x++) { | |
term.line[y][x] = term.c.attr; | |
memcpy(term.line[y][x].c, " ", 2); | |
- term.line[y][x].state |= GLYPH_SET; | |
} | |
} | |
} | |
t@@ -2263,11 +2252,12 @@ tputc(char *c, int len) { | |
int | |
tresize(int col, int row) { | |
- int i, x; | |
+ int i; | |
int minrow = MIN(row, term.row); | |
int mincol = MIN(col, term.col); | |
int slide = term.c.y - row + 1; | |
bool *bp; | |
+ Line *orig; | |
if(col < 1 || row < 1) | |
return 0; | |
t@@ -2303,10 +2293,6 @@ tresize(int col, int row) { | |
term.dirty[i] = 1; | |
term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); | |
term.alt[i] = xrealloc(term.alt[i], col * sizeof(Glyph)); | |
- for(x = mincol; x < col; x++) { | |
- term.line[i][x].state = 0; | |
- term.alt[i][x].state = 0; | |
- } | |
} | |
/* allocate any new rows */ | |
t@@ -2331,6 +2317,17 @@ tresize(int col, int row) { | |
tsetscroll(0, row-1); | |
/* make use of the LIMIT in tmoveto */ | |
tmoveto(term.c.x, term.c.y); | |
+ /* Clearing both screens */ | |
+ orig = term.line; | |
+ do { | |
+ if(mincol < col && 0 < minrow) { | |
+ tclearregion(mincol, 0, col - 1, minrow - 1); | |
+ } | |
+ if(0 < col && minrow < row) { | |
+ tclearregion(0, minrow, col - 1, row - 1); | |
+ } | |
+ tswapscreen(); | |
+ } while(orig != term.line); | |
return (slide > 0); | |
} | |
t@@ -2932,22 +2929,17 @@ void | |
xdrawcursor(void) { | |
static int oldx = 0, oldy = 0; | |
int sl; | |
- Glyph g = {{' '}, ATTR_NULL, defaultbg, defaultcs, 0}; | |
+ Glyph g = {{' '}, ATTR_NULL, defaultbg, defaultcs}; | |
LIMIT(oldx, 0, term.col-1); | |
LIMIT(oldy, 0, term.row-1); | |
- if(term.line[term.c.y][term.c.x].state & GLYPH_SET) | |
- memcpy(g.c, term.line[term.c.y][term.c.x].c, UTF_SIZ); | |
+ memcpy(g.c, term.line[term.c.y][term.c.x].c, UTF_SIZ); | |
/* remove the old cursor */ | |
- if(term.line[oldy][oldx].state & GLYPH_SET) { | |
- sl = utf8size(term.line[oldy][oldx].c); | |
- xdraws(term.line[oldy][oldx].c, term.line[oldy][oldx], oldx, | |
- oldy, 1, sl); | |
- } else { | |
- xtermclear(oldx, oldy, oldx, oldy); | |
- } | |
+ sl = utf8size(term.line[oldy][oldx].c); | |
+ xdraws(term.line[oldy][oldx].c, term.line[oldy][oldx], oldx, | |
+ oldy, 1, sl); | |
/* draw the new one */ | |
if(!(IS_SET(MODE_HIDE))) { | |
t@@ -3045,23 +3037,20 @@ drawregion(int x1, int y1, int x2, int y2) { | |
new = term.line[y][x]; | |
if(ena_sel && *(new.c) && selected(x, y)) | |
new.mode ^= ATTR_REVERSE; | |
- if(ib > 0 && (!(new.state & GLYPH_SET) | |
- || ATTRCMP(base, new) | |
+ if(ib > 0 && (ATTRCMP(base, new) | |
|| ib >= DRAW_BUF_SIZ-UTF_SIZ)) { | |
xdraws(buf, base, ox, y, ic, ib); | |
ic = ib = 0; | |
} | |
- if(new.state & GLYPH_SET) { | |
- if(ib == 0) { | |
- ox = x; | |
- base = new; | |
- } | |
- | |
- sl = utf8size(new.c); | |
- memcpy(buf+ib, new.c, sl); | |
- ib += sl; | |
- ++ic; | |
+ if(ib == 0) { | |
+ ox = x; | |
+ base = new; | |
} | |
+ | |
+ sl = utf8size(new.c); | |
+ memcpy(buf+ib, new.c, sl); | |
+ ib += sl; | |
+ ++ic; | |
} | |
if(ib > 0) | |
xdraws(buf, base, ox, y, ic, ib); |