From 1f02c35acb0c3b3f7534fb55384cf7f708b5b92d Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 20 Oct 2014 22:47:16 -0400 Subject: in fact, only line feed/reverse line feed should cause scrolling aside from displaying text, of course --- src/parser.c | 33 ++++++++++++++------------------- src/parser.l | 33 ++++++++++++++------------------- src/screen.c | 20 ++++++++++++-------- src/screen.h | 2 +- 4 files changed, 41 insertions(+), 47 deletions(-) diff --git a/src/parser.c b/src/parser.c index ea44ecb..b9fa3ed 100644 --- a/src/parser.c +++ b/src/parser.c @@ -2408,24 +2408,24 @@ static void vt100_parser_handle_bel(VT100Screen *vt) static void vt100_parser_handle_bs(VT100Screen *vt) { - vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col - 1); + vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col - 1, 0); } static void vt100_parser_handle_tab(VT100Screen *vt) { vt100_screen_move_to( vt, vt->grid->cur.row, - vt->grid->cur.col - (vt->grid->cur.col % 8) + 8); + vt->grid->cur.col - (vt->grid->cur.col % 8) + 8, 0); } static void vt100_parser_handle_lf(VT100Screen *vt) { - vt100_screen_move_to(vt, vt->grid->cur.row + 1, vt->grid->cur.col); + vt100_screen_move_to(vt, vt->grid->cur.row + 1, vt->grid->cur.col, 1); } static void vt100_parser_handle_cr(VT100Screen *vt) { - vt100_screen_move_to(vt, vt->grid->cur.row, 0); + vt100_screen_move_to(vt, vt->grid->cur.row, 0, 0); } static void vt100_parser_handle_deckpam(VT100Screen *vt) @@ -2440,7 +2440,7 @@ static void vt100_parser_handle_deckpnm(VT100Screen *vt) static void vt100_parser_handle_ri(VT100Screen *vt) { - vt100_screen_move_to(vt, vt->grid->cur.row - 1, vt->grid->cur.col); + vt100_screen_move_to(vt, vt->grid->cur.row - 1, vt->grid->cur.col, 1); } static void vt100_parser_handle_ris(VT100Screen *vt) @@ -2535,7 +2535,7 @@ static void vt100_parser_handle_cuu(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to( - vt, vt->grid->cur.row - params[0], vt->grid->cur.col); + vt, vt->grid->cur.row - params[0], vt->grid->cur.col, 0); } static void vt100_parser_handle_cud(VT100Screen *vt, char *buf, size_t len) @@ -2544,7 +2544,7 @@ static void vt100_parser_handle_cud(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to( - vt, vt->grid->cur.row + params[0], vt->grid->cur.col); + vt, vt->grid->cur.row + params[0], vt->grid->cur.col, 0); } static void vt100_parser_handle_cuf(VT100Screen *vt, char *buf, size_t len) @@ -2553,7 +2553,7 @@ static void vt100_parser_handle_cuf(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to( - vt, vt->grid->cur.row, vt->grid->cur.col + params[0]); + vt, vt->grid->cur.row, vt->grid->cur.col + params[0], 0); } static void vt100_parser_handle_cub(VT100Screen *vt, char *buf, size_t len) @@ -2562,7 +2562,7 @@ static void vt100_parser_handle_cub(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to( - vt, vt->grid->cur.row, vt->grid->cur.col - params[0]); + vt, vt->grid->cur.row, vt->grid->cur.col - params[0], 0); } static void vt100_parser_handle_cha(VT100Screen *vt, char *buf, size_t len) @@ -2570,7 +2570,7 @@ static void vt100_parser_handle_cha(VT100Screen *vt, char *buf, size_t len) int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); - vt100_screen_move_to(vt, vt->grid->cur.row, params[0] - 1); + vt100_screen_move_to(vt, vt->grid->cur.row, params[0] - 1, 0); } static void vt100_parser_handle_cup(VT100Screen *vt, char *buf, size_t len) @@ -2584,12 +2584,7 @@ static void vt100_parser_handle_cup(VT100Screen *vt, char *buf, size_t len) if (params[1] == 0) { params[1] = 1; } - /* this needs to be fixed up here (and not in screen.c) because CUP should - * never cause scrolling */ - if (params[0] > vt->grid->max.row) { - params[0] = vt->grid->max.row; - } - vt100_screen_move_to(vt, params[0] - 1, params[1] - 1); + vt100_screen_move_to(vt, params[0] - 1, params[1] - 1, 0); } static void vt100_parser_handle_ed(VT100Screen *vt, char *buf, size_t len) @@ -2640,7 +2635,7 @@ static void vt100_parser_handle_il(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_insert_lines(vt, params[0]); - vt100_screen_move_to(vt, vt->grid->cur.row, 0); + vt100_screen_move_to(vt, vt->grid->cur.row, 0, 0); } static void vt100_parser_handle_dl(VT100Screen *vt, char *buf, size_t len) @@ -2649,7 +2644,7 @@ static void vt100_parser_handle_dl(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_delete_lines(vt, params[0]); - vt100_screen_move_to(vt, vt->grid->cur.row, 0); + vt100_screen_move_to(vt, vt->grid->cur.row, 0, 0); } static void vt100_parser_handle_dch(VT100Screen *vt, char *buf, size_t len) @@ -2673,7 +2668,7 @@ static void vt100_parser_handle_vpa(VT100Screen *vt, char *buf, size_t len) int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); - vt100_screen_move_to(vt, params[0] - 1, vt->grid->cur.col); + vt100_screen_move_to(vt, params[0] - 1, vt->grid->cur.col, 0); } static void vt100_parser_handle_sm(VT100Screen *vt, char *buf, size_t len) diff --git a/src/parser.l b/src/parser.l index d64df1c..4ac44d7 100644 --- a/src/parser.l +++ b/src/parser.l @@ -247,24 +247,24 @@ static void vt100_parser_handle_bel(VT100Screen *vt) static void vt100_parser_handle_bs(VT100Screen *vt) { - vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col - 1); + vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col - 1, 0); } static void vt100_parser_handle_tab(VT100Screen *vt) { vt100_screen_move_to( vt, vt->grid->cur.row, - vt->grid->cur.col - (vt->grid->cur.col % 8) + 8); + vt->grid->cur.col - (vt->grid->cur.col % 8) + 8, 0); } static void vt100_parser_handle_lf(VT100Screen *vt) { - vt100_screen_move_to(vt, vt->grid->cur.row + 1, vt->grid->cur.col); + vt100_screen_move_to(vt, vt->grid->cur.row + 1, vt->grid->cur.col, 1); } static void vt100_parser_handle_cr(VT100Screen *vt) { - vt100_screen_move_to(vt, vt->grid->cur.row, 0); + vt100_screen_move_to(vt, vt->grid->cur.row, 0, 0); } static void vt100_parser_handle_deckpam(VT100Screen *vt) @@ -279,7 +279,7 @@ static void vt100_parser_handle_deckpnm(VT100Screen *vt) static void vt100_parser_handle_ri(VT100Screen *vt) { - vt100_screen_move_to(vt, vt->grid->cur.row - 1, vt->grid->cur.col); + vt100_screen_move_to(vt, vt->grid->cur.row - 1, vt->grid->cur.col, 1); } static void vt100_parser_handle_ris(VT100Screen *vt) @@ -374,7 +374,7 @@ static void vt100_parser_handle_cuu(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to( - vt, vt->grid->cur.row - params[0], vt->grid->cur.col); + vt, vt->grid->cur.row - params[0], vt->grid->cur.col, 0); } static void vt100_parser_handle_cud(VT100Screen *vt, char *buf, size_t len) @@ -383,7 +383,7 @@ static void vt100_parser_handle_cud(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to( - vt, vt->grid->cur.row + params[0], vt->grid->cur.col); + vt, vt->grid->cur.row + params[0], vt->grid->cur.col, 0); } static void vt100_parser_handle_cuf(VT100Screen *vt, char *buf, size_t len) @@ -392,7 +392,7 @@ static void vt100_parser_handle_cuf(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to( - vt, vt->grid->cur.row, vt->grid->cur.col + params[0]); + vt, vt->grid->cur.row, vt->grid->cur.col + params[0], 0); } static void vt100_parser_handle_cub(VT100Screen *vt, char *buf, size_t len) @@ -401,7 +401,7 @@ static void vt100_parser_handle_cub(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_move_to( - vt, vt->grid->cur.row, vt->grid->cur.col - params[0]); + vt, vt->grid->cur.row, vt->grid->cur.col - params[0], 0); } static void vt100_parser_handle_cha(VT100Screen *vt, char *buf, size_t len) @@ -409,7 +409,7 @@ static void vt100_parser_handle_cha(VT100Screen *vt, char *buf, size_t len) int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); - vt100_screen_move_to(vt, vt->grid->cur.row, params[0] - 1); + vt100_screen_move_to(vt, vt->grid->cur.row, params[0] - 1, 0); } static void vt100_parser_handle_cup(VT100Screen *vt, char *buf, size_t len) @@ -423,12 +423,7 @@ static void vt100_parser_handle_cup(VT100Screen *vt, char *buf, size_t len) if (params[1] == 0) { params[1] = 1; } - /* this needs to be fixed up here (and not in screen.c) because CUP should - * never cause scrolling */ - if (params[0] > vt->grid->max.row) { - params[0] = vt->grid->max.row; - } - vt100_screen_move_to(vt, params[0] - 1, params[1] - 1); + vt100_screen_move_to(vt, params[0] - 1, params[1] - 1, 0); } static void vt100_parser_handle_ed(VT100Screen *vt, char *buf, size_t len) @@ -479,7 +474,7 @@ static void vt100_parser_handle_il(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_insert_lines(vt, params[0]); - vt100_screen_move_to(vt, vt->grid->cur.row, 0); + vt100_screen_move_to(vt, vt->grid->cur.row, 0, 0); } static void vt100_parser_handle_dl(VT100Screen *vt, char *buf, size_t len) @@ -488,7 +483,7 @@ static void vt100_parser_handle_dl(VT100Screen *vt, char *buf, size_t len) vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); vt100_screen_delete_lines(vt, params[0]); - vt100_screen_move_to(vt, vt->grid->cur.row, 0); + vt100_screen_move_to(vt, vt->grid->cur.row, 0, 0); } static void vt100_parser_handle_dch(VT100Screen *vt, char *buf, size_t len) @@ -512,7 +507,7 @@ static void vt100_parser_handle_vpa(VT100Screen *vt, char *buf, size_t len) int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); - vt100_screen_move_to(vt, params[0] - 1, vt->grid->cur.col); + vt100_screen_move_to(vt, params[0] - 1, vt->grid->cur.col, 0); } static void vt100_parser_handle_sm(VT100Screen *vt, char *buf, size_t len) diff --git a/src/screen.c b/src/screen.c index 52bb37f..acf6f61 100644 --- a/src/screen.c +++ b/src/screen.c @@ -173,7 +173,7 @@ void vt100_screen_show_string_ascii(VT100Screen *vt, char *buf, size_t len) if (col >= vt->grid->max.col) { vt100_screen_row_at(vt, vt->grid->cur.row)->wrapped = 1; - vt100_screen_move_to(vt, vt->grid->cur.row + 1, 0); + vt100_screen_move_to(vt, vt->grid->cur.row + 1, 0, 1); col = 0; } cell = vt100_screen_cell_at(vt, vt->grid->cur.row, col++); @@ -183,7 +183,7 @@ void vt100_screen_show_string_ascii(VT100Screen *vt, char *buf, size_t len) cell->attrs = vt->attrs; cell->is_wide = 0; } - vt100_screen_move_to(vt, vt->grid->cur.row, col); + vt100_screen_move_to(vt, vt->grid->cur.row, col, 0); } void vt100_screen_show_string_utf8(VT100Screen *vt, char *buf, size_t len) @@ -250,7 +250,7 @@ void vt100_screen_show_string_utf8(VT100Screen *vt, char *buf, size_t len) else { if (col + (is_wide ? 2 : 1) > vt->grid->max.col) { vt100_screen_row_at(vt, vt->grid->cur.row)->wrapped = 1; - vt100_screen_move_to(vt, vt->grid->cur.row + 1, 0); + vt100_screen_move_to(vt, vt->grid->cur.row + 1, 0, 1); col = 0; } cell = vt100_screen_cell_at(vt, vt->grid->cur.row, col); @@ -268,19 +268,23 @@ void vt100_screen_show_string_utf8(VT100Screen *vt, char *buf, size_t len) break; } } - vt100_screen_move_to(vt, vt->grid->cur.row, col); + vt100_screen_move_to(vt, vt->grid->cur.row, col, 0); } -void vt100_screen_move_to(VT100Screen *vt, int row, int col) +void vt100_screen_move_to(VT100Screen *vt, int row, int col, int scroll) { int top = vt->grid->scroll_top, bottom = vt->grid->scroll_bottom; if (row > bottom) { - vt100_screen_scroll_down(vt, row - bottom); + if (scroll) { + vt100_screen_scroll_down(vt, row - bottom); + } row = bottom; } else if (row < top) { - vt100_screen_scroll_up(vt, top - row); + if (scroll) { + vt100_screen_scroll_up(vt, top - row); + } row = top; } @@ -528,7 +532,7 @@ void vt100_screen_set_scroll_region( ? vt->grid->max.row - 1 : bottom; - vt100_screen_move_to(vt, vt->grid->scroll_top, 0); + vt100_screen_move_to(vt, vt->grid->scroll_top, 0, 0); } void vt100_screen_reset_text_attributes(VT100Screen *vt) diff --git a/src/screen.h b/src/screen.h index f363071..24133e1 100644 --- a/src/screen.h +++ b/src/screen.h @@ -127,7 +127,7 @@ void vt100_screen_audible_bell(VT100Screen *vt); void vt100_screen_visual_bell(VT100Screen *vt); void vt100_screen_show_string_ascii(VT100Screen *vt, char *buf, size_t len); void vt100_screen_show_string_utf8(VT100Screen *vt, char *buf, size_t len); -void vt100_screen_move_to(VT100Screen *vt, int row, int col); +void vt100_screen_move_to(VT100Screen *vt, int row, int col, int scroll); void vt100_screen_clear_screen(VT100Screen *vt); void vt100_screen_clear_screen_forward(VT100Screen *vt); void vt100_screen_clear_screen_backward(VT100Screen *vt); -- cgit v1.2.3