tsetattr(int *attr, int l) {
int i;
-#ifdef TRUECOLOR /* ESC [ ? <fg/bg> ; <r> ; <g> ; <b> m */
- Color col;
- if(escseq.priv && escseq.len == 4) { /* True color extension :) */
- col = (escseq.arg[1]<<16) + (escseq.arg[2]<<8) + escseq.arg[3];
- switch(escseq.arg[0]) {
- case 3: /* foreground */
- term.c.attr.fg = col;
- break;
- case 4: /* background */
- term.c.attr.bg = col;
- break;
- }
- }
- else
-#endif
for(i = 0; i < l; i++) {
switch(attr[i]) {
case 0:
}
void
+tputtab(void) {
+ int space = TAB - term.c.x % TAB;
+
+ if(term.c.x + space >= term.col)
+ space--;
+
+ for(; space > 0; space--)
+ tcursor(CSright);
+}
+
+void
tputc(char c) {
static int inesc = 0;
- dump(c);
+ //dump(c);
/* start of escseq */
if(c == '\033')
escreset(), inesc = 1;
tsetchar(c);
tcursor(CSright);
break;
+ case '\t':
+ tputtab();
+ break;
case '\b':
tcursor(CSleft);
break;
if(col < 1 || row < 1)
return;
+ /* alloc */
line = calloc(row, sizeof(Line));
for(i = 0 ; i < row; i++)
line[i] = calloc(col, sizeof(Glyph));
- for(i = 0 ; i < minrow; i++) {
- memcpy(line[i], term.line[i], mincol * sizeof(Glyph));
- free(term.line[i]);
- }
+ /* copy */
+ for(i = 0 ; i < minrow; i++)
+ memcpy(line[i], term.line[i], mincol * sizeof(Glyph));
+ /* free */
+ for(i = 0; i < term.row; i++)
+ free(term.line[i]);
free(term.line);
+
LIMIT(term.c.x, 0, col-1);
LIMIT(term.c.y, 0, row-1);
LIMIT(term.top, 0, row-1);
LIMIT(term.bot, 0, row-1);
- // if(term.bot == term.row-1)
- term.bot = row-1;
+
+ term.bot = row-1;
term.line = line;
term.col = col, term.row = row;
}
xw.dis = XOpenDisplay(NULL);
xw.scr = XDefaultScreen(xw.dis);
- if(!(xw.dis && xw.scr))
+ if(!xw.dis)
die("can not open display");
/* font */
static int oldx = 0;
static int oldy = 0;
Glyph g = {' ', ATnone, DefaultBG, DefaultCS, 0};
-
+
+ LIMIT(oldx, 0, term.col-1);
+ LIMIT(oldy, 0, term.row-1);
+
if(term.line[term.c.y][term.c.x].state & CRset)
g.c = term.line[term.c.y][term.c.x].c;
/* remove the old cursor */
col = e->xconfigure.width / xw.cw;
row = e->xconfigure.height / xw.ch;
- if(term.col != col && term.row != row) {
+ if(term.col != col || term.row != row) {
tresize(col, row);
ttyresize(col, row);
xw.w = e->xconfigure.width;
int
main(int argc, char *argv[]) {
if(argc == 2 && !strncmp("-v", argv[1], 3))
- die("st-"", © 2009 st engineers\n");
+ die("st-" VERSION ", © 2009 st engineers\n");
else if(argc != 1)
die("usage: st [-v]\n");
setlocale(LC_CTYPE, "");