Introduction
Introduction Statistics Contact Development Disclaimer Help
Got rid of redundant Glyph state. - st - simple terminal
git clone git://git.suckless.org/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
@@ -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) && strc…
+ 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) <= 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;
@@ -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);
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.