termptyesc: handle correctly Cursor Back Tab. Ref T4992

This commit is contained in:
Boris Faure 2016-12-15 22:57:30 +01:00
parent 60d1c6d05c
commit fae0d7ccee
2 changed files with 14 additions and 17 deletions

View File

@ -1507,8 +1507,10 @@ termpty_cell_codepoint_att_fill(Termpty *ty, Eina_Unicode codepoint,
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
int had_tabmarker = dst[i].att.tab;
_handle_block_codepoint_overwrite(ty, dst[i].codepoint, codepoint); _handle_block_codepoint_overwrite(ty, dst[i].codepoint, codepoint);
dst[i] = local; dst[i] = local;
dst[i].att.tab = had_tabmarker;
} }
} }

View File

@ -1077,35 +1077,30 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
break; break;
*/ */
case 'g': // clear tabulation case 'g': // clear tabulation
/* TODO: handle correctly */
arg = _csi_arg_get(&b); arg = _csi_arg_get(&b);
DBG("Tabulation Clear (TBC): %d", arg); DBG("Tabulation Clear (TBC): %d", arg);
break; break;
case 'Z': // Cursor Back Tab case 'Z':
{ {
int idx, size, cx = ty->cursor_state.cx, cy = ty->cursor_state.cy; int cx = ty->cursor_state.cx, cy = ty->cursor_state.cy;
arg = _csi_arg_get(&b); arg = _csi_arg_get(&b);
DBG("Cursor Backward Tabulation (CBT): %d", arg);
if (arg < 1) arg = 1; if (arg < 1) arg = 1;
size = ty->w * cy + cx + 1; for (; arg > 0; arg--)
for (idx = size - 1; idx >= 0; idx--) {
do
{ {
if (TERMPTY_SCREEN(ty, cx, cy).att.tab) arg--;
cx--; cx--;
if (cx < 0)
{
cx = ty->w - 1;
cy--;
} }
if (!arg) break; while ((cx >= 0) &&
((!TERMPTY_SCREEN(ty, cx, cy).att.tab) && (cx % 8 != 0)));
} }
if (!arg)
{
ty->cursor_state.cx = cx; ty->cursor_state.cx = cx;
TERMPTY_RESTRICT_FIELD(ty->cursor_state.cx, 0, ty->w); TERMPTY_RESTRICT_FIELD(ty->cursor_state.cx, 0, ty->w);
ty->cursor_state.cy = cy;
TERMPTY_RESTRICT_FIELD(ty->cursor_state.cy, 0, ty->h);
}
} }
break; break;
default: default: