csi: fix bad implementation of CBT (back tab)

* It takes a parameter, that indicates the number of tab stops to move
  through
* Use the tab stops defined in the tab stops list, not hard coded mod
  8 columns.
This commit is contained in:
Daniel Eklöf 2019-11-17 11:20:59 +01:00
parent ca58c4c621
commit 616e506f2e
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 14 additions and 6 deletions

19
csi.c
View file

@ -611,13 +611,20 @@ csi_dispatch(struct terminal *term, uint8_t final)
break;
}
case 'Z': {
/* Back tab */
int col = term->cursor.point.col;
col = (col - 8 + 7) / 8 * 8;
term_cursor_right(term, col - term->cursor.point.col);
case 'Z':
/* CBT - Back tab (param is number of tab stops to move back through) */
for (int i = 0; i < vt_param_get(term, 0, 1); i++) {
int new_col = 0;
tll_rforeach(term->tab_stops, it) {
if (it->item < term->cursor.point.col) {
new_col = it->item;
break;
}
}
assert(term->cursor.point.col >= new_col);
term_cursor_left(term, term->cursor.point.col - new_col);
}
break;
}
case 'h':
/* Set mode */

1
vt.c
View file

@ -875,6 +875,7 @@ action(struct terminal *term, enum action _action, uint8_t c)
break;
}
}
assert(new_col >= term->cursor.point.col);
term_cursor_right(term, new_col - term->cursor.point.col);
break;
}