summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2017-05-31 23:07:32 -0400
committerJesse Luehrs <doy@tozt.net>2017-06-01 03:16:10 -0400
commit1fbbf3965775648f188e191e9230e0921d7b37e3 (patch)
treeb2cca66d97515060fe456ce5a9df3145e99d2832 /src
parent01655fc9992dab503fc66a0000d38500eee54256 (diff)
downloadlibvt100-1fbbf3965775648f188e191e9230e0921d7b37e3.tar.gz
libvt100-1fbbf3965775648f188e191e9230e0921d7b37e3.zip
implement origin mode
Diffstat (limited to 'src')
-rw-r--r--src/parser.c9
-rw-r--r--src/parser.l9
-rw-r--r--src/screen.c17
-rw-r--r--src/screen.h3
4 files changed, 38 insertions, 0 deletions
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);