# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit b7e6a5c825a8d786a0cc4dbacc82df1c90ad7020
    parent 3ae02990648447ec3252b42f5b64e18818c19fd8
    Author: Alexander Sedov <alex0player@gmail.com>
    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 <20h@r-36.net>

    Diffstat:
    Mst.c | 79++++++++++++++++++++++++++++++++++---------------------------------------------

    1 file changed, 34 insertions(+), 45 deletions(-)
    diff --git a/st.c b/st.c
    @@ -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,
    @@ -154,7 +149,6 @@ typedef struct {
     	uchar mode;  /* attribute flags */
     	ushort fg;   /* foreground  */
     	ushort bg;   /* background  */
    -	uchar state; /* state flags    */
     } Glyph;

     typedef Glyph *Line;
    @@ -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;

    @@ -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) && 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 @@ 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;
     			}

    @@ -943,13 +936,11 @@ brelease(XEvent *e) {
     			} 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 @@ 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
    @@ -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;
     		}
     	}
     }
    @@ -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;
    @@ -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 */
    @@ -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);
     }
    @@ -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 @@ 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);