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 <20h@r-36.net>
Alexander Sedov alex0player@gmail.com
1 files changed,
34 insertions(+),
45 deletions(-)
jump to
M
st.c
→
st.c
@@ -98,11 +98,6 @@ CURSOR_WRAPNEXT = 1,
CURSOR_ORIGIN = 2 }; -enum glyph_state { - GLYPH_SET = 1, - GLYPH_DIRTY = 2 -}; - enum term_mode { MODE_WRAP = 1, MODE_INSERT = 2,@@ -154,7 +149,6 @@ char c[UTF_SIZ]; /* character code */
uchar mode; /* attribute flags */ ushort fg; /* foreground */ ushort bg; /* background */ - uchar state; /* state flags */ } Glyph; typedef Glyph *Line;@@ -757,7 +751,7 @@ }
void selcopy(void) { - char *str, *ptr, *p; + char *str, *ptr; int x, y, bufsize, isselected = 0, size; Glyph *gp, *last;@@ -773,8 +767,8 @@ isselected = 0;
gp = &term.line[y][0]; last = gp + term.col; - while(--last >= gp && !((last->state & GLYPH_SET) && \ - selected(last - gp, y) && strcmp(last->c, " ") != 0)) + while(--last >= gp && !(selected(last - gp, y) && \ + strcmp(last->c, " ") != 0)) /* nothing */; for(x = 0; gp <= last; x++, ++gp) {@@ -784,9 +778,8 @@ } else {
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; }@@ -943,13 +936,11 @@ selcopy();
} else if(TIMEDIFF(now, sel.tclick1) <= doubleclicktimeout) { /* double click to select word */ sel.bx = sel.ex; - while(sel.bx > 0 && term.line[sel.ey][sel.bx-1].state & GLYPH_SET && - term.line[sel.ey][sel.bx-1].c[0] != ' ') { + while(sel.bx > 0 && term.line[sel.ey][sel.bx-1].c[0] != ' ') { sel.bx--; } sel.b.x = sel.bx; - while(sel.ex < term.col-1 && term.line[sel.ey][sel.ex+1].state & GLYPH_SET && - term.line[sel.ey][sel.ex+1].c[0] != ' ') { + while(sel.ex < term.col-1 && term.line[sel.ey][sel.ex+1].c[0] != ' ') { sel.ex++; } sel.e.x = sel.ex;@@ -1373,7 +1364,6 @@
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@@ -1395,7 +1385,6 @@ term.dirty[y] = 1;
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; } } }@@ -2263,11 +2252,12 @@ }
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;@@ -2303,10 +2293,6 @@ for(i = 0; i < minrow; i++) {
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 */@@ -2331,6 +2317,17 @@ /* reset scrolling region */
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); }@@ -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))) {@@ -3045,23 +3037,20 @@ for(x = x1; x < x2; x++) {
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; - } + if(ib == 0) { + ox = x; + base = new; + } - sl = utf8size(new.c); - memcpy(buf+ib, new.c, sl); - ib += sl; - ++ic; - } + sl = utf8size(new.c); + memcpy(buf+ib, new.c, sl); + ib += sl; + ++ic; } if(ib > 0) xdraws(buf, base, ox, y, ic, ib);