|
|
@ -67,6 +67,7 @@ typedef struct { |
|
|
|
Glyph attr; /* current char attributes */ |
|
|
|
int x; |
|
|
|
int y; |
|
|
|
char hide; |
|
|
|
} TCursor; |
|
|
|
|
|
|
|
/* CSI Escape sequence structs */ |
|
|
@ -86,7 +87,6 @@ typedef struct { |
|
|
|
int col; /* nb col */ |
|
|
|
Line* line; /* screen */ |
|
|
|
TCursor c; /* cursor */ |
|
|
|
char hidec; |
|
|
|
int top; /* top scroll limit */ |
|
|
|
int bot; /* bottom scroll limit */ |
|
|
|
int mode; /* terminal mode flags */ |
|
|
@ -221,17 +221,16 @@ die(const char *errstr, ...) { |
|
|
|
void |
|
|
|
execsh(void) { |
|
|
|
char *args[3] = {getenv("SHELL"), "-i", NULL}; |
|
|
|
DEFAULT(args[0], "/bin/sh"); /* default shell if getenv() failed */ |
|
|
|
DEFAULT(args[0], "/bin/sh"); /* if getenv() failed */ |
|
|
|
putenv("TERM=" TNAME); |
|
|
|
execvp(args[0], args); |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
xbell(void) { /* visual bell */ |
|
|
|
XRectangle r = { BORDER, BORDER, xw.bufw, xw.bufh }; |
|
|
|
xbell(void) { |
|
|
|
XSetForeground(xw.dis, dc.gc, dc.col[BellCol]); |
|
|
|
XFillRectangles(xw.dis, xw.win, dc.gc, &r, 1); |
|
|
|
/* usleep(30000); */ |
|
|
|
XFillRectangle(xw.dis, xw.win, dc.gc, BORDER, BORDER, xw.bufw, xw.bufh); |
|
|
|
usleep(BellTime); |
|
|
|
draw(SCREEN_REDRAW); |
|
|
|
} |
|
|
|
|
|
|
@ -325,11 +324,12 @@ tcursor(int mode) { |
|
|
|
|
|
|
|
void |
|
|
|
treset(void) { |
|
|
|
term.c.attr.mode = ATTR_NULL; |
|
|
|
term.c.attr.fg = DefaultFG; |
|
|
|
term.c.attr.bg = DefaultBG; |
|
|
|
term.c.x = term.c.y = 0; |
|
|
|
term.hidec = 0; |
|
|
|
term.c = (TCursor){{ |
|
|
|
.mode = ATTR_NULL, |
|
|
|
.fg = DefaultFG, |
|
|
|
.bg = DefaultBG |
|
|
|
}, .x = 0, .y = 0, .hide = 0}; |
|
|
|
|
|
|
|
term.top = 0, term.bot = term.row - 1; |
|
|
|
term.mode = MODE_WRAP; |
|
|
|
tclearregion(0, 0, term.col-1, term.row-1); |
|
|
@ -337,21 +337,13 @@ treset(void) { |
|
|
|
|
|
|
|
void |
|
|
|
tnew(int col, int row) { |
|
|
|
/* screen size */ |
|
|
|
/* set screen size */ |
|
|
|
term.row = row, term.col = col; |
|
|
|
term.top = 0, term.bot = term.row - 1; |
|
|
|
/* mode */ |
|
|
|
term.mode = MODE_WRAP; |
|
|
|
/* cursor */ |
|
|
|
term.c.attr.mode = ATTR_NULL; |
|
|
|
term.c.attr.fg = DefaultFG; |
|
|
|
term.c.attr.bg = DefaultBG; |
|
|
|
term.c.x = term.c.y = 0; |
|
|
|
term.hidec = 0; |
|
|
|
/* allocate screen */ |
|
|
|
term.line = calloc(term.row, sizeof(Line)); |
|
|
|
term.line = malloc(term.row * sizeof(Line)); |
|
|
|
for(row = 0 ; row < term.row; row++) |
|
|
|
term.line[row] = calloc(term.col, sizeof(Glyph)); |
|
|
|
term.line[row] = malloc(term.col * sizeof(Glyph)); |
|
|
|
/* setup screen */ |
|
|
|
treset(); |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
@ -718,7 +710,7 @@ csihandle(void) { |
|
|
|
case 12: /* att610 -- Stop blinking cursor (IGNORED) */ |
|
|
|
break; |
|
|
|
case 25: |
|
|
|
term.hidec = 1; |
|
|
|
term.c.hide = 1; |
|
|
|
break; |
|
|
|
case 1048: /* XXX: no alt. screen to erase/save */ |
|
|
|
case 1049: |
|
|
@ -767,7 +759,7 @@ csihandle(void) { |
|
|
|
case 12: /* att610 -- Start blinking cursor (IGNORED) */ |
|
|
|
break; |
|
|
|
case 25: |
|
|
|
term.hidec = 0; |
|
|
|
term.c.hide = 0; |
|
|
|
break; |
|
|
|
case 1048: |
|
|
|
case 1049: /* XXX: no alt. screen to erase/save */ |
|
|
@ -1173,7 +1165,7 @@ draw(int dummy) { |
|
|
|
if(term.line[y][x].state & GLYPH_SET) |
|
|
|
xdrawc(x, y, term.line[y][x]); |
|
|
|
|
|
|
|
if(!term.hidec) |
|
|
|
if(!term.c.hide) |
|
|
|
xcursor(CURSOR_DRAW); |
|
|
|
XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDER, BORDER); |
|
|
|
XFlush(xw.dis); |
|
|
@ -1206,7 +1198,7 @@ draw(int redraw_all) { |
|
|
|
} |
|
|
|
xdraws(buf, base, ox, y, i); |
|
|
|
} |
|
|
|
xcursor(term.hidec ? CURSOR_HIDE : CURSOR_DRAW); |
|
|
|
xcursor(term.c.hide ? CURSOR_HIDE : CURSOR_DRAW); |
|
|
|
XCopyArea(xw.dis, xw.buf, xw.win, dc.gc, 0, 0, xw.bufw, xw.bufh, BORDER, BORDER); |
|
|
|
XFlush(xw.dis); |
|
|
|
} |
|
|
|