termptyesc: DECALN only reset margins and cursor position

This commit is contained in:
Boris Faure 2018-12-28 17:23:03 +01:00
parent 54c3e4790b
commit a95bbbe731
3 changed files with 77 additions and 19 deletions

View File

@ -2756,6 +2756,37 @@ end:
return len;
}
static void
_handle_decaln(Termpty *ty)
{
int size;
Termcell *cells;
DBG("DECALN - fill screen with E");
ty->termstate.top_margin = 0;
ty->termstate.bottom_margin = 0;
ty->termstate.left_margin = 0;
ty->termstate.right_margin = 0;
ty->termstate.had_cr_x = 0;
ty->termstate.had_cr_y = 0;
ty->cursor_state.cx = 0;
ty->cursor_state.cy = 0;
ty->termstate.att.link_id = 0;
termpty_clear_screen(ty, TERMPTY_CLR_ALL);
if (ty->cb.cancel_sel.func)
ty->cb.cancel_sel.func(ty->cb.cancel_sel.data);
cells = ty->screen;
size = ty->w * ty->h;
if (cells)
{
Termatt att;
memset((&att), 0, sizeof(att));
termpty_cell_codepoint_att_fill(ty, 'E', att, cells, size);
}
}
static int
_handle_esc(Termpty *ty, const Eina_Unicode *c, const Eina_Unicode *ce)
{
@ -2845,25 +2876,7 @@ _handle_esc(Termpty *ty, const Eina_Unicode *c, const Eina_Unicode *ce)
case '#': // #8 == test mode -> fill screen with "E";
if (len < 2) return 0;
if (c[1] == '8')
{
int size;
Termcell *cells;
DBG("reset to init mode and clear then fill with E");
termpty_reset_state(ty);
termpty_clear_screen(ty, TERMPTY_CLR_ALL);
if (ty->cb.cancel_sel.func)
ty->cb.cancel_sel.func(ty->cb.cancel_sel.data);
cells = ty->screen;
size = ty->w * ty->h;
if (cells)
{
Termatt att;
memset((&att), 0, sizeof(att));
termpty_cell_codepoint_att_fill(ty, 'E', att, cells, size);
}
}
_handle_decaln(ty);
return 2;
case '@': // just consume this plus next char
if (len < 2) return 0;

44
tests/decaln.sh Executable file
View File

@ -0,0 +1,44 @@
#!/bin/sh
#set color
printf '\033[46;31;3m'
# set top/bottom margins:
printf '\033[10;20r'
# allow left/right margins
printf '\033[?69h'
# set left/right margins:
printf '\033[5;15s'
# fill margin with @
printf '\033[64;10;5;20;15$x'
# restrict cursor
printf '\033[?6h'
# reset wrap mode
printf '\033[?7l'
# set tabs
printf '\033H\033H\033[3C\033H\033[4C\033H\033[5C\033H\033[6C\033H'
printf '\033[7C\033H\033[8C\033H\033[9C#'
# set cursor shape
printf '\033[4 q'
# fill space with E
printf '\033#8'
printf 'start'
#move to 0;0
printf '\033[HST'
printf '\n#\t#\033[2I\033[3g@\t#\t#\t#\t#\t#\t#\t#\t#\t#\t#'
# move to 1; 75
printf '\033[1;75Habcdefghijkl'
# shall be no wrap and in color. also no margin
#set margins again, cursor is still restricted
# set top/bottom margins:
printf '\033[10;20r'
# set left/right margins:
printf '\033[5;15s'
#move to 0;0
printf '\033[22;22H2'

View File

@ -35,3 +35,4 @@ dch.sh 40cf655681c098251f0dc3e7733c4db9
cnl.sh 1f1512179c8e47e4bd880142774a3c66
cpl.sh 9145c88adb762a6a59c5bf69191b949e
cup.sh 11f5939a6cc990f6a7b9d1730ab3a8bf
decaln.sh 38ca494fb468752d510daff797f7c40c