X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;ds=sidebyside;f=st.c;h=65829a824cff899e51d542c6411aadfb3cf8cf1d;hb=5ce6c5c0324ef3b7d0f5b9e6e2ba4d87ae0d3bb1;hp=a5cca1710cdc17da5fd79d4bd9393f5b5cc43674;hpb=cfe897554d4467fdf4c002429370fc7716e419bc;p=st.git diff --git a/st.c b/st.c index a5cca17..65829a8 100644 --- a/st.c +++ b/st.c @@ -387,13 +387,15 @@ dump(char c) { void ttyread(void) { - char buf[BUFSIZ] = {0}; + char buf[BUFSIZ]; int ret; - if((ret = read(cmdfd, buf, BUFSIZ)) < 0) + if((ret = read(cmdfd, buf, LEN(buf))) < 0) die("Couldn't read from shell: %s\n", SERRNO); - else + else { + printf("ttyread %d\n", ret); tputs(buf, ret); + } } void @@ -465,8 +467,7 @@ tscrolldown (int n) { LIMIT(n, 0, term.bot-term.top+1); - for(i = 0; i < n; i++) - memset(term.line[term.bot-i], 0, term.col*sizeof(Glyph)); + tclearregion(0, term.bot-n+1, term.col-1, term.bot); for(i = term.bot; i >= term.top+n; i--) { temp = term.line[i]; @@ -481,8 +482,7 @@ tscrollup (int n) { Line temp; LIMIT(n, 0, term.bot-term.top+1); - for(i = 0; i < n; i++) - memset(term.line[term.top+i], 0, term.col*sizeof(Glyph)); + tclearregion(0, term.top, term.col-1, term.top+n-1); for(i = term.top; i <= term.bot-n; i++) { temp = term.line[i]; @@ -591,21 +591,16 @@ tinsertblankline(int n) { Line blank; int bot = term.bot; - if(term.c.y > term.bot) - bot = term.row - 1; - else if(term.c.y < term.top) - bot = term.top - 1; - if(term.c.y + n >= bot) { - tclearregion(0, term.c.y, term.col-1, bot); + if(term.c.y < term.top || term.c.y > term.bot) return; - } + + LIMIT(n, 0, bot-term.c.y+1); + tclearregion(0, bot-n+1, term.col-1, bot); for(i = bot; i >= term.c.y+n; i--) { /* swap deleted line <-> blanked line */ blank = term.line[i]; term.line[i] = term.line[i-n]; term.line[i-n] = blank; - /* blank it */ - memset(blank, 0, term.col * sizeof(Glyph)); } } @@ -615,21 +610,16 @@ tdeleteline(int n) { Line blank; int bot = term.bot; - if(term.c.y > term.bot) - bot = term.row - 1; - else if(term.c.y < term.top) - bot = term.top - 1; - if(term.c.y + n >= bot) { - tclearregion(0, term.c.y, term.col-1, bot); + if(term.c.y < term.top || term.c.y > term.bot) return; - } + + LIMIT(n, 0, bot-term.c.y+1); + tclearregion(0, term.c.y, term.col-1, term.c.y+n-1); for(i = term.c.y; i <= bot-n; i++) { /* swap deleted line <-> blanked line */ blank = term.line[i]; term.line[i] = term.line[i+n]; term.line[i+n] = blank; - /* blank it */ - memset(blank, 0, term.col * sizeof(Glyph)); } } @@ -957,7 +947,8 @@ tputc(char c) { term.esc = 0; csiparse(), csihandle(); } - } else if(term.esc & ESC_OSC) { + /* TODO: handle other OSC */ + } else if(term.esc & ESC_OSC) { if(c == ';') { term.titlelen = 0; term.esc = ESC_START | ESC_TITLE; @@ -1201,18 +1192,18 @@ xinit(void) { xloadcols(); /* windows */ - xw.h = term.row * xw.ch + 2*BORDER; - xw.w = term.col * xw.cw + 2*BORDER; + xw.bufh = term.row * xw.ch; + xw.bufw = term.col * xw.cw; + xw.h = xw.bufh + 2*BORDER; + xw.w = xw.bufw + 2*BORDER; xw.win = XCreateSimpleWindow(xw.dis, XRootWindow(xw.dis, xw.scr), 0, 0, xw.w, xw.h, 0, dc.col[DefaultBG], dc.col[DefaultBG]); - xw.bufw = xw.w - 2*BORDER; - xw.bufh = xw.h - 2*BORDER; xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr)); /* gc */ dc.gc = XCreateGC(xw.dis, xw.win, 0, NULL); - + /* event mask */ XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNotifyMask | FocusChangeMask | PointerMotionMask