termptyesc: handle DECFRA

This commit is contained in:
Boris Faure 2017-06-05 20:47:41 +02:00
parent 7ea4b65c8d
commit 9f72ea3a9d
3 changed files with 71 additions and 2 deletions

View File

@ -825,6 +825,63 @@ bad:
ty->termstate.bottom_margin = 0;
}
static void
_handle_esc_csi_decfra(Termpty *ty, Eina_Unicode **b)
{
int c = _csi_arg_get(b);
int top = _csi_arg_get(b);
int left = _csi_arg_get(b);
int bottom = _csi_arg_get(b);
int right = _csi_arg_get(b);
int len;
DBG("DECFRA (%d; %d;%d;%d;%d) Fill Rectangular Area",
c, top, left, bottom, right);
if (! ((c >= 32 && c <= 126) || (c >= 160 && c <= 255)))
return;
TERMPTY_RESTRICT_FIELD(top, 1, ty->h);
top--;
if (ty->termstate.restrict_cursor)
top += ty->termstate.top_margin;
TERMPTY_RESTRICT_FIELD(left, 1, ty->w);
left--;
if (ty->termstate.restrict_cursor)
left += ty->termstate.left_margin;
if (right < 1)
right = ty->w;
if (ty->termstate.restrict_cursor)
{
right += ty->termstate.left_margin;
if (ty->termstate.right_margin && right >= ty->termstate.right_margin)
right = ty->termstate.right_margin;
}
if (bottom < 1)
bottom = ty->h;
if (ty->termstate.restrict_cursor)
{
bottom += ty->termstate.top_margin;
if (ty->termstate.bottom_margin && bottom >= ty->termstate.bottom_margin)
bottom = ty->termstate.bottom_margin - 1;
}
bottom--;
if ((bottom < top) || (right < left))
return;
len = right - left;
for (; top <= bottom; top++)
{
Termcell *cells = &(TERMPTY_SCREEN(ty, left, top));
termpty_cells_fill(ty, c, cells, len);
}
}
static void
_handle_esc_csi_cursor_pos_set(Termpty *ty, Eina_Unicode **b,
const Eina_Unicode *cc)
@ -990,6 +1047,9 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
TERMPTY_RESTRICT_FIELD(ty->cursor_state.cy, 0, ty->h);
ty->cursor_state.cx = 0;
break;
case 'x':
_handle_esc_csi_decfra(ty, &b);
break;
case 'X': // erase N chars
arg = _csi_arg_get(&b);
TERMPTY_RESTRICT_FIELD(arg, 1, ty->w);

View File

@ -22,16 +22,24 @@
#define DBG(...) EINA_LOG_DOM_DBG(_termpty_log_dom, __VA_ARGS__)
void
termpty_cells_clear(Termpty *ty, Termcell *cells, int count)
termpty_cells_fill(Termpty *ty, Eina_Unicode codepoint,
Termcell *cells, int count)
{
Termcell src;
memset(&src, 0, sizeof(src));
src.codepoint = 0;
src.codepoint = codepoint;
src.att = ty->termstate.att;
termpty_cell_fill(ty, &src, cells, count);
}
void
termpty_cells_clear(Termpty *ty, Termcell *cells, int count)
{
termpty_cells_fill(ty, 0, cells, count);
}
void
termpty_text_scroll(Termpty *ty, Eina_Bool clear)
{

View File

@ -10,6 +10,7 @@ typedef enum _Termpty_Clear
void termpty_text_save_top(Termpty *ty, Termcell *cells, ssize_t w_max);
void termpty_cells_copy(Termpty *ty, Termcell *cells, Termcell *dest, int count);
void termpty_cells_fill(Termpty *ty, Eina_Unicode codepoint, Termcell *cells, int count);
void termpty_cells_clear(Termpty *ty, Termcell *cells, int count);
void termpty_text_scroll(Termpty *ty, Eina_Bool clear);
void termpty_text_scroll_rev(Termpty *ty, Eina_Bool clear);