From 9a1b068c3593d87ef23c6cc0d05cc230aee5070c Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Mon, 3 Jan 2022 22:02:21 -0600 Subject: [PATCH] Remove tty_esc() and tty_jump() wrappers, just output ANSI directly. --- lib/lib.h | 2 -- lib/linestack.c | 4 ++-- lib/tty.c | 19 +------------------ toys/example/demo_scankey.c | 14 +++++--------- toys/pending/vi.c | 32 ++++++++++++++------------------ toys/posix/ps.c | 5 +++-- 6 files changed, 25 insertions(+), 51 deletions(-) diff --git a/lib/lib.h b/lib/lib.h index 3880d799..16255da8 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -348,8 +348,6 @@ int scan_key_getsize(char *scratch, int timeout_ms, unsigned *xx, unsigned *yy); void xsetspeed(struct termios *tio, int speed); int set_terminal(int fd, int raw, int speed, struct termios *old); void xset_terminal(int fd, int raw, int speed, struct termios *old); -void tty_esc(char *s); -void tty_jump(int x, int y); void tty_reset(void); void tty_sigreset(int i); void start_redraw(unsigned *width, unsigned *height); diff --git a/lib/linestack.c b/lib/linestack.c index e6ae1b57..47eb2af9 100644 --- a/lib/linestack.c +++ b/lib/linestack.c @@ -142,9 +142,9 @@ int crunch_rev_escape(FILE *out, int cols, int wc) { int rc; - tty_esc("7m"); + xputsn("\e[7m"); rc = crunch_escape(out, cols, wc); - tty_esc("27m"); + xputsn("\e[27m"); return rc; } diff --git a/lib/tty.c b/lib/tty.c index e5e3d41e..77ddf671 100644 --- a/lib/tty.c +++ b/lib/tty.c @@ -252,27 +252,10 @@ int scan_key(char *scratch, int timeout_ms) return scan_key_getsize(scratch, timeout_ms, NULL, NULL); } -void tty_esc(char *s) -{ - printf("\e[%s", s); -} - -void tty_jump(int x, int y) -{ - char s[32]; - - sprintf(s, "%d;%dH", y+1, x+1); - tty_esc(s); -} - void tty_reset(void) { set_terminal(0, 0, 0, 0); - tty_esc("?25h"); - tty_esc("0m"); - tty_jump(0, 999); - tty_esc("K"); - fflush(0); + xputsn("\e[?25h\e[0m\e[999H\e[K"); } // If you call set_terminal(), use sigatexit(tty_sigreset); diff --git a/toys/example/demo_scankey.c b/toys/example/demo_scankey.c index cc625092..1b6326d2 100644 --- a/toys/example/demo_scankey.c +++ b/toys/example/demo_scankey.c @@ -30,20 +30,17 @@ void demo_scankey_main(void) y = 1; sigatexit(tty_sigreset); // Make ctrl-c restore tty - tty_esc("?25l"); // hide cursor - tty_esc("0m"); // reset color to default - tty_esc("2J"); // Clear screen + // hide cursor, reset color to default, clear screen + xputsn("\e[?25l\e0m\e[2J"); xset_terminal(1, 1, 0, 0); // Raw mode for (;;) { - tty_jump(x, y); - xputc(c); + printf("\e[%u;%uH%c", y+1, x+1, c); t[1&++tick] = time(0); if (t[0] != t[1]) terminal_probesize(&width, &height); // Don't block first time through, to force header print key = scan_key_getsize(scratch, -1*!!t[0], &width, &height); - tty_jump(0, 0); - printf("ESC to exit: "); + printf("\e[HESC to exit: "); // Print unknown escape sequence if (*scratch) { printf("key=[ESC"); @@ -58,8 +55,7 @@ void demo_scankey_main(void) if (key == -2) continue; if (key <= ' ') break; if (key>=256) { - tty_jump(x, y); - xputc(' '); + printf("\e[%u;%uH ", y+1, x+1); key -= 256; if (key==KEY_UP) y--; diff --git a/toys/pending/vi.c b/toys/pending/vi.c index fc46f355..b11dd642 100644 --- a/toys/pending/vi.c +++ b/toys/pending/vi.c @@ -1294,9 +1294,9 @@ static int vi_crunch(FILE *out, int cols, int wc) { int ret = 0; if (wc < 32 && TT.list) { - tty_esc("1m"); + xputsn("\e[1m"); ret = crunch_escape(out,cols,wc); - tty_esc("m"); + xputsn("\e[m"); } else if (wc == 0x09) { if (out) { int i = TT.tabstop; @@ -1368,10 +1368,10 @@ static void draw_page() if (TT.drawn_row<0 || TT.cur_row<0 || TT.scr_row<0) redraw = 3; else if (abs(scroll)>TT.screen_height/2) redraw = 3; - tty_jump(0, 0); - if (redraw&2) tty_esc("2J"), tty_esc("H"); //clear screen - else if (scroll>0) printf("\033[%dL", scroll); //scroll up - else if (scroll<0) printf("\033[%dM", -scroll); //scroll down + xputsn("\e[H"); // jump to top left + if (redraw&2) xputsn("\e[2J\e[h"); //clear screen + else if (scroll>0) printf("\e[%dL", scroll); //scroll up + else if (scroll<0) printf("\e[%dM", -scroll); //scroll down SOL = text_sol(TT.cursor); bytes = text_getline(toybuf, SOL, ARRAY_LEN(toybuf)); @@ -1388,8 +1388,7 @@ static void draw_page() end = line; - tty_jump(0, y); - tty_esc("2K"); + xputsn("\e[%uH\e[2K", y+1); //find cursor position aw = crunch_nstr(&end, INT_MAX, bytes, 0, "\t\n", vi_crunch); @@ -1454,9 +1453,9 @@ static void draw_page() scroll++, draw_line++; else if (scroll>0) scroll--, draw_line++; - tty_jump(0, y); + printf("\e[%uH", y+1); if (draw_line) { - tty_esc("2K"); + xputsn("\e[2K"); if (line && strlen(line)) { aw = crunch_nstr(&line, clip, bytes, 0, "\t\n", vi_crunch); crunch_str(&line, TT.screen_width-1, stdout, "\t\n", vi_crunch); @@ -1473,8 +1472,7 @@ static void draw_page() TT.drawn_row = TT.scr_row, TT.drawn_col = clip; // Finished updating visual area, show status line. - tty_jump(0, TT.screen_height); - tty_esc("2K"); + printf("\e[%uH\e[2K", TT.screen_height+1); if (TT.vi_mode == 2) printf("\033[1m-- INSERT --\033[m"); if (!TT.vi_mode) { cx_scr = printf("%s", TT.il->data); @@ -1487,10 +1485,8 @@ static void draw_page() (100*TT.cursor)/(TT.filesize ? : 1), TT.cur_row+1, TT.cur_col+1); if (TT.cur_col != cx_scr) sprintf(toybuf+strlen(toybuf),"-%d", cx_scr+1); } - tty_jump(TT.screen_width-strlen(toybuf), TT.screen_height); - printf("%s", toybuf); - - tty_jump(cx_scr, cy_scr); + printf("\e[%u;%uH%s\e[%u;%uH", toybuf, TT.screen_height+1, + 1+TT.screen_width-strlen(toybuf), cy_scr+1, cx_scr+1); xflush(1); } @@ -1525,7 +1521,7 @@ void vi_main(void) set_terminal(0, 1, 0, 0); //writes stdout into different xterm buffer so when we exit //we dont get scroll log full of junk - tty_esc("?1049h"); + xputsn("\e[?1049h"); for (;;) { int key = 0; @@ -1696,5 +1692,5 @@ cleanup_vi: linelist_unload(); free(TT.il->data), free(TT.il), free(TT.yank.data); tty_reset(); - tty_esc("?1049l"); + xputsn("\e[?1049l"); } diff --git a/toys/posix/ps.c b/toys/posix/ps.c index f8b2e03a..b8b2ef3c 100644 --- a/toys/posix/ps.c +++ b/toys/posix/ps.c @@ -43,6 +43,7 @@ * at right edge? (Not adjusting to screen size at all? Header wraps?) * TODO: top: thread support and SMP * TODO: pgrep -f only searches the amount of cmdline that fits in toybuf. + * TODO: pgrep qemu-system-i386 never matches because one char too long USE_PS(NEWTOY(ps, "k(sort)*P(ppid)*aAdeflMno*O*p(pid)*s*t*Tu*U*g*G*wZ[!ol][+Ae][!oO]", TOYFLAG_BIN|TOYFLAG_LOCALE)) // stayroot because iotop needs root to read other process' proc/$$/io @@ -1466,7 +1467,7 @@ static int header_line(int line, int rev) static void top_cursor_cleanup(void) { - tty_esc("?25h"); + xputsn("\e[?25h"); } static void top_common( @@ -1490,7 +1491,7 @@ static void top_common( if (!FLAG(b)) { setbuf(stdout, stdout_buf); sigatexit(top_cursor_cleanup); - tty_esc("?25l"); + xputsn("\e[?25l"); } toys.signal = SIGWINCH; -- 2.39.2