X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=st.c;h=5633e4060174663901845309d5622277c40aacd6;hb=97695baf4f9bc3632792a3330fb46e188ef166a2;hp=65829a824cff899e51d542c6411aadfb3cf8cf1d;hpb=5ce6c5c0324ef3b7d0f5b9e6e2ba4d87ae0d3bb1;p=st.git diff --git a/st.c b/st.c index 65829a8..5633e40 100644 --- a/st.c +++ b/st.c @@ -161,8 +161,8 @@ static void tputc(char); static void tputs(char*, int); static void treset(void); static void tresize(int, int); -static void tscrollup(int); -static void tscrolldown(int); +static void tscrollup(int, int); +static void tscrolldown(int, int); static void tsetattr(int*, int); static void tsetchar(char); static void tsetscroll(int, int); @@ -392,10 +392,8 @@ ttyread(void) { if((ret = read(cmdfd, buf, LEN(buf))) < 0) die("Couldn't read from shell: %s\n", SERRNO); - else { - printf("ttyread %d\n", ret); + else tputs(buf, ret); - } } void @@ -461,15 +459,15 @@ tswapscreen(void) { } void -tscrolldown (int n) { +tscrolldown(int orig, int n) { int i; Line temp; - LIMIT(n, 0, term.bot-term.top+1); + LIMIT(n, 0, term.bot-orig+1); tclearregion(0, term.bot-n+1, term.col-1, term.bot); - for(i = term.bot; i >= term.top+n; i--) { + for(i = term.bot; i >= orig+n; i--) { temp = term.line[i]; term.line[i] = term.line[i-n]; term.line[i-n] = temp; @@ -477,14 +475,14 @@ tscrolldown (int n) { } void -tscrollup (int n) { +tscrollup(int orig, int n) { int i; Line temp; - LIMIT(n, 0, term.bot-term.top+1); + LIMIT(n, 0, term.bot-orig+1); - tclearregion(0, term.top, term.col-1, term.top+n-1); + tclearregion(0, orig, term.col-1, orig+n-1); - for(i = term.top; i <= term.bot-n; i++) { + for(i = orig; i <= term.bot-n; i++) { temp = term.line[i]; term.line[i] = term.line[i+n]; term.line[i+n] = temp; @@ -493,9 +491,11 @@ tscrollup (int n) { void tnewline(void) { - int y = term.c.y + 1; - if(y > term.bot) - tscrollup(1), y = term.bot; + int y = term.c.y; + if(term.c.y == term.bot) + tscrollup(term.top, 1); + else + y++; tmoveto(0, y); } @@ -587,40 +587,18 @@ tinsertblank(int n) { void tinsertblankline(int n) { - int i; - Line blank; - int bot = term.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; - } + tscrolldown(term.c.y, n); } void tdeleteline(int n) { - int i; - Line blank; - int bot = term.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; - } + tscrollup(term.c.y, n); } void @@ -792,11 +770,11 @@ csihandle(void) { break; case 'S': /* SU -- Scroll line up */ DEFAULT(escseq.arg[0], 1); - tscrollup(escseq.arg[0]); + tscrollup(term.top, escseq.arg[0]); break; case 'T': /* SD -- Scroll line down */ DEFAULT(escseq.arg[0], 1); - tscrolldown(escseq.arg[0]); + tscrolldown(term.top, escseq.arg[0]); break; case 'L': /* IL -- Insert blank lines */ DEFAULT(escseq.arg[0], 1); @@ -986,7 +964,7 @@ tputc(char c) { break; case 'D': /* IND -- Linefeed */ if(term.c.y == term.bot) - tscrollup(1); + tscrollup(term.top, 1); else tmoveto(term.c.x, term.c.y+1); term.esc = 0; @@ -997,7 +975,7 @@ tputc(char c) { break; case 'M': /* RI -- Reverse index */ if(term.c.y == term.top) - tscrolldown(1); + tscrolldown(term.top, 1); else tmoveto(term.c.x, term.c.y-1); term.esc = 0;