From 1fbbf3965775648f188e191e9230e0921d7b37e3 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 31 May 2017 23:07:32 -0400 Subject: implement origin mode --- src/parser.c | 9 +++++++++ src/parser.l | 9 +++++++++ src/screen.c | 17 +++++++++++++++++ src/screen.h | 3 +++ 4 files changed, 38 insertions(+) diff --git a/src/parser.c b/src/parser.c index 870ec71..c13dfd1 100644 --- a/src/parser.c +++ b/src/parser.c @@ -2730,6 +2730,7 @@ static void vt100_parser_handle_ris(VT100Screen *vt) vt100_screen_reset_mouse_reporting_button_motion(vt); vt100_screen_reset_mouse_reporting_sgr_mode(vt); vt100_screen_reset_bracketed_paste(vt); + vt100_screen_reset_origin_mode(vt); } static void vt100_parser_handle_vb(VT100Screen *vt) @@ -3033,6 +3034,10 @@ static void vt100_parser_handle_sm(VT100Screen *vt, char *buf, size_t len) case 1: vt100_screen_set_application_cursor(vt); break; + case 6: + vt100_screen_set_origin_mode(vt); + vt100_screen_move_to(vt, 0, 0); + break; case 9: vt100_screen_set_mouse_reporting_press(vt); break; @@ -3103,6 +3108,10 @@ static void vt100_parser_handle_rm(VT100Screen *vt, char *buf, size_t len) case 1: vt100_screen_reset_application_cursor(vt); break; + case 6: + vt100_screen_reset_origin_mode(vt); + vt100_screen_move_to(vt, 0, 0); + break; case 9: vt100_screen_reset_mouse_reporting_press(vt); break; diff --git a/src/parser.l b/src/parser.l index a4e6cfd..573e387 100644 --- a/src/parser.l +++ b/src/parser.l @@ -335,6 +335,7 @@ static void vt100_parser_handle_ris(VT100Screen *vt) vt100_screen_reset_mouse_reporting_button_motion(vt); vt100_screen_reset_mouse_reporting_sgr_mode(vt); vt100_screen_reset_bracketed_paste(vt); + vt100_screen_reset_origin_mode(vt); } static void vt100_parser_handle_vb(VT100Screen *vt) @@ -638,6 +639,10 @@ static void vt100_parser_handle_sm(VT100Screen *vt, char *buf, size_t len) case 1: vt100_screen_set_application_cursor(vt); break; + case 6: + vt100_screen_set_origin_mode(vt); + vt100_screen_move_to(vt, 0, 0); + break; case 9: vt100_screen_set_mouse_reporting_press(vt); break; @@ -708,6 +713,10 @@ static void vt100_parser_handle_rm(VT100Screen *vt, char *buf, size_t len) case 1: vt100_screen_reset_application_cursor(vt); break; + case 6: + vt100_screen_reset_origin_mode(vt); + vt100_screen_move_to(vt, 0, 0); + break; case 9: vt100_screen_reset_mouse_reporting_press(vt); break; diff --git a/src/screen.c b/src/screen.c index b909cfb..e031e3e 100644 --- a/src/screen.c +++ b/src/screen.c @@ -261,6 +261,13 @@ void vt100_screen_move_to(VT100Screen *vt, int row, int col) : col >= vt->grid->max.col ? vt->grid->max.col - 1 : col; + if (vt->origin_mode) { + row += vt->grid->scroll_top; + if (row > vt->grid->scroll_bottom) { + row = vt->grid->scroll_bottom; + } + } + vt->grid->cur.row = row; vt->grid->cur.col = col; } @@ -835,6 +842,16 @@ void vt100_screen_reset_bracketed_paste(VT100Screen *vt) vt->bracketed_paste = 0; } +void vt100_screen_set_origin_mode(VT100Screen *vt) +{ + vt->origin_mode = 1; +} + +void vt100_screen_reset_origin_mode(VT100Screen *vt) +{ + vt->origin_mode = 0; +} + void vt100_screen_set_window_title(VT100Screen *vt, char *buf, size_t len) { free(vt->title); diff --git a/src/screen.h b/src/screen.h index bd52d49..9a4f24e 100644 --- a/src/screen.h +++ b/src/screen.h @@ -97,6 +97,7 @@ struct vt100_screen { unsigned int mouse_reporting_button_motion: 1; unsigned int mouse_reporting_sgr_mode: 1; unsigned int bracketed_paste: 1; + unsigned int origin_mode: 1; unsigned int visual_bell: 1; unsigned int audible_bell: 1; @@ -178,6 +179,8 @@ void vt100_screen_set_mouse_reporting_sgr_mode(VT100Screen *vt); void vt100_screen_reset_mouse_reporting_sgr_mode(VT100Screen *vt); void vt100_screen_set_bracketed_paste(VT100Screen *vt); void vt100_screen_reset_bracketed_paste(VT100Screen *vt); +void vt100_screen_set_origin_mode(VT100Screen *vt); +void vt100_screen_reset_origin_mode(VT100Screen *vt); void vt100_screen_set_window_title(VT100Screen *vt, char *buf, size_t len); void vt100_screen_set_icon_name(VT100Screen *vt, char *buf, size_t len); int vt100_screen_row_max_col(VT100Screen *vt, int row); -- cgit v1.2.3