X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=st.c;h=623ca29cd71e56936bfc2c6f48fb769564dab178;hb=c56332857145d1c6741d4f6c1bbc87dcc6c6ab97;hp=e288902032a743cb160611d6ff7909d464bc559d;hpb=e8c13ebe8001a7870a70b698d8b8fa80b7c90fd3;p=st.git diff --git a/st.c b/st.c index e288902..623ca29 100644 --- a/st.c +++ b/st.c @@ -34,6 +34,7 @@ #define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b)) #define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) #define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg) +#define IS_SET(flag) (term.mode & (flag)) /* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */ enum { ATTR_NULL=0 , ATTR_REVERSE=1 , ATTR_UNDERLINE=2, ATTR_BOLD=4, ATTR_GFX=8 }; @@ -128,7 +129,6 @@ static void csireset(void); static void tclearregion(int, int, int, int); static void tcursor(int); -static void tmovecursor(int); static void tdeletechar(int); static void tdeleteline(int); static void tinsertblank(int); @@ -336,7 +336,8 @@ treset(void) { } void -tnew(int col, int row) { /* screen size */ +tnew(int col, int row) { + /* screen size */ term.row = row, term.col = col; term.top = 0, term.bot = term.row - 1; /* mode */ @@ -437,32 +438,6 @@ tmoveto(int x, int y) { } void -tmovecursor(int dir) { - int xf = term.c.x, yf = term.c.y; - - switch(dir) { - case CURSOR_UP: - yf--; - break; - case CURSOR_DOWN: - yf++; - break; - case CURSOR_LEFT: - xf--; - break; - case CURSOR_RIGHT: - xf++; - if(term.mode & MODE_WRAP && xf >= term.col) { - xf = 0, yf++; - if(yf > term.bot) - yf = term.bot, tscroll(); - } - break; - } - tmoveto(xf, yf); -} - -void tsetchar(char c) { term.line[term.c.y][term.c.x] = term.c.attr; term.line[term.c.y][term.c.x].c = c; @@ -969,7 +944,7 @@ tputc(char c) { tputtab(); break; case '\b': - tmovecursor(CURSOR_LEFT); + tmoveto(term.c.x-1, term.c.y); break; case '\r': tmoveto(0, term.c.y); @@ -986,7 +961,10 @@ tputc(char c) { break; default: tsetchar(c); - tmovecursor(CURSOR_RIGHT); + if(term.c.x+1 < term.col) { + tmoveto(term.c.x+1, term.c.y); + } else if(IS_SET(MODE_WRAP)) + tnewline(); break; } } @@ -1001,23 +979,28 @@ tputs(char *s, int len) { void tresize(int col, int row) { int i; - Line *line; int minrow = MIN(row, term.row); int mincol = MIN(col, term.col); if(col < 1 || row < 1) return; - /* alloc */ - line = calloc(row, sizeof(Line)); - for(i = 0 ; i < row; i++) - line[i] = calloc(col, sizeof(Glyph)); - /* 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 uneeded rows */ + for(i = row; i < term.row; i++) free(term.line[i]); - free(term.line); + + /* resize to new height */ + term.line = realloc(term.line, row * sizeof(Line)); + + /* resize each row to new width, zero-pad if needed */ + for(i = 0; i < minrow; i++) { + term.line[i] = realloc(term.line[i], col * sizeof(Glyph)); + memset(term.line[i] + mincol, 0, (col - mincol) * sizeof(Glyph)); + } + + /* allocate any new rows */ + for(/* i == minrow */; i < row; i++) + term.line[i] = calloc(col, sizeof(Glyph)); LIMIT(term.c.x, 0, col-1); LIMIT(term.c.y, 0, row-1); @@ -1025,7 +1008,6 @@ tresize(int col, int row) { LIMIT(term.bot, 0, row-1); term.bot = row-1; - term.line = line; term.col = col, term.row = row; } @@ -1096,10 +1078,9 @@ xhints(void) void xinit(void) { - xw.dis = XOpenDisplay(NULL); - xw.scr = XDefaultScreen(xw.dis); - if(!xw.dis) + if(!(xw.dis = XOpenDisplay(NULL))) die("Can't open display\n"); + xw.scr = XDefaultScreen(xw.dis); /* font */ if(!(dc.font = XLoadQueryFont(xw.dis, FONT)) || !(dc.bfont = XLoadQueryFont(xw.dis, BOLDFONT))) @@ -1285,7 +1266,7 @@ kpress(XEvent *ev) { case XK_Down: case XK_Left: case XK_Right: - sprintf(buf, "\033%c%c", term.mode & MODE_APPKEYPAD ? 'O' : '[', "DACB"[ksym - XK_Left]); + sprintf(buf, "\033%c%c", IS_SET(MODE_APPKEYPAD) ? 'O' : '[', "DACB"[ksym - XK_Left]); ttywrite(buf, 3); break; case XK_Insert: @@ -1352,7 +1333,7 @@ run(void) { int main(int argc, char *argv[]) { if(argc == 2 && !strncmp("-v", argv[1], 3)) - die("st-" VERSION ", © 2009 st engineers\n"); + die("st-" VERSION ", (c) 2010 st engineers\n"); else if(argc != 1) die("usage: st [-v]\n"); setlocale(LC_CTYPE, "");