summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-10-20 22:47:16 -0400
committerJesse Luehrs <doy@tozt.net>2014-10-20 22:47:16 -0400
commit1f02c35acb0c3b3f7534fb55384cf7f708b5b92d (patch)
treef89d2a535c0de3a111e10233a1b3baaf2531ff72
parent71ddc90f1a0f62a22edf63334321d66e7f0467ad (diff)
downloadlibvt100-1f02c35acb0c3b3f7534fb55384cf7f708b5b92d.tar.gz
libvt100-1f02c35acb0c3b3f7534fb55384cf7f708b5b92d.zip
in fact, only line feed/reverse line feed should cause scrolling
aside from displaying text, of course
-rw-r--r--src/parser.c33
-rw-r--r--src/parser.l33
-rw-r--r--src/screen.c20
-rw-r--r--src/screen.h2
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);