diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/src/parser.c b/src/parser.c index bff3be1..cef8907 100644 --- a/src/parser.c +++ b/src/parser.c @@ -2474,7 +2474,7 @@ static void vt100_parser_handle_bel(VT100Screen *vt) static void vt100_parser_handle_bs(VT100Screen *vt) { DEBUG_TRACE1("BS"); - vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col - 1, 0); + vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col - 1); } static void vt100_parser_handle_tab(VT100Screen *vt) @@ -2482,19 +2482,19 @@ static void vt100_parser_handle_tab(VT100Screen *vt) DEBUG_TRACE1("TAB"); vt100_screen_move_to( vt, vt->grid->cur.row, - vt->grid->cur.col - (vt->grid->cur.col % 8) + 8, 0); + vt->grid->cur.col - (vt->grid->cur.col % 8) + 8); } static void vt100_parser_handle_lf(VT100Screen *vt) { DEBUG_TRACE1("LF"); - vt100_screen_move_to(vt, vt->grid->cur.row + 1, vt->grid->cur.col, 1); + vt100_screen_move_down_or_scroll(vt); } static void vt100_parser_handle_cr(VT100Screen *vt) { DEBUG_TRACE1("CR"); - vt100_screen_move_to(vt, vt->grid->cur.row, 0, 0); + vt100_screen_move_to(vt, vt->grid->cur.row, 0); } static void vt100_parser_handle_deckpam(VT100Screen *vt) @@ -2512,7 +2512,7 @@ static void vt100_parser_handle_deckpnm(VT100Screen *vt) static void vt100_parser_handle_ri(VT100Screen *vt) { DEBUG_TRACE1("RI"); - vt100_screen_move_to(vt, vt->grid->cur.row - 1, vt->grid->cur.col, 1); + vt100_screen_move_up_or_scroll(vt); } static void vt100_parser_handle_ris(VT100Screen *vt) @@ -2521,7 +2521,7 @@ static void vt100_parser_handle_ris(VT100Screen *vt) vt100_screen_use_normal_buffer(vt); vt100_screen_set_scroll_region( vt, 0, vt->grid->max.row - 1, 0, vt->grid->max.col - 1); - vt100_screen_move_to(vt, 0, 0, 0); + vt100_screen_move_to(vt, 0, 0); vt100_screen_clear_screen(vt); vt100_screen_save_cursor(vt); vt100_screen_reset_text_attributes(vt); @@ -2610,21 +2610,29 @@ static void vt100_parser_handle_ich(VT100Screen *vt, char *buf, size_t len) static void vt100_parser_handle_cuu(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; + int row = vt->grid->cur.row, new_row; DEBUG_TRACE3("CUU", buf + 2, len - 3); 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, 0); + new_row = row - params[0]; + if (row >= vt->grid->scroll_top && new_row < vt->grid->scroll_top) { + new_row = vt->grid->scroll_top; + } + vt100_screen_move_to(vt, new_row, vt->grid->cur.col); } static void vt100_parser_handle_cud(VT100Screen *vt, char *buf, size_t len) { int params[VT100_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; + int row = vt->grid->cur.row, new_row; DEBUG_TRACE3("CUD", buf + 2, len - 3); 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, 0); + new_row = row + params[0]; + if (row <= vt->grid->scroll_bottom && new_row > vt->grid->scroll_bottom) { + new_row = vt->grid->scroll_bottom; + } + vt100_screen_move_to(vt, new_row, vt->grid->cur.col); } static void vt100_parser_handle_cuf(VT100Screen *vt, char *buf, size_t len) @@ -2633,8 +2641,7 @@ static void vt100_parser_handle_cuf(VT100Screen *vt, char *buf, size_t len) DEBUG_TRACE3("CUF", buf + 2, len - 3); 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], 0); + vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col + params[0]); } static void vt100_parser_handle_cub(VT100Screen *vt, char *buf, size_t len) @@ -2643,8 +2650,7 @@ static void vt100_parser_handle_cub(VT100Screen *vt, char *buf, size_t len) DEBUG_TRACE3("CUB", buf + 2, len - 3); 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], 0); + vt100_screen_move_to(vt, vt->grid->cur.row, vt->grid->cur.col - params[0]); } static void vt100_parser_handle_cha(VT100Screen *vt, char *buf, size_t len) @@ -2653,7 +2659,7 @@ static void vt100_parser_handle_cha(VT100Screen *vt, char *buf, size_t len) DEBUG_TRACE3("CHA", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); - vt100_screen_move_to(vt, vt->grid->cur.row, params[0] - 1, 0); + vt100_screen_move_to(vt, vt->grid->cur.row, params[0] - 1); } static void vt100_parser_handle_cup(VT100Screen *vt, char *buf, size_t len) @@ -2668,7 +2674,7 @@ static void vt100_parser_handle_cup(VT100Screen *vt, char *buf, size_t len) if (params[1] == 0) { params[1] = 1; } - vt100_screen_move_to(vt, params[0] - 1, params[1] - 1, 0); + vt100_screen_move_to(vt, params[0] - 1, params[1] - 1); } static void vt100_parser_handle_ed(VT100Screen *vt, char *buf, size_t len) @@ -2803,7 +2809,7 @@ static void vt100_parser_handle_vpa(VT100Screen *vt, char *buf, size_t len) DEBUG_TRACE3("VPA", buf + 2, len - 3); vt100_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); - vt100_screen_move_to(vt, params[0] - 1, vt->grid->cur.col, 0); + vt100_screen_move_to(vt, params[0] - 1, vt->grid->cur.col); } static void vt100_parser_handle_sm(VT100Screen *vt, char *buf, size_t len) |