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