From 7ea4b65c8dd3ab2eb5e27f363d29d3fd96d26a7d Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Mon, 5 Jun 2017 17:43:23 +0200 Subject: [PATCH] termptyops: handle right/left margins. Ref T5533 --- src/bin/termptyops.c | 79 ++++++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/src/bin/termptyops.c b/src/bin/termptyops.c index c6a93dd4..a3646d5c 100644 --- a/src/bin/termptyops.c +++ b/src/bin/termptyops.c @@ -38,40 +38,47 @@ termpty_text_scroll(Termpty *ty, Eina_Bool clear) Termcell *cells = NULL, *cells2; int y, start_y = 0, end_y = ty->h - 1; + start_y = ty->termstate.top_margin; if (ty->termstate.bottom_margin != 0) - { - start_y = ty->termstate.top_margin; - end_y = ty->termstate.bottom_margin - 1; - } - else - if (!ty->altbuf) - termpty_text_save_top(ty, &(TERMPTY_SCREEN(ty, 0, 0)), ty->w); + end_y = ty->termstate.bottom_margin - 1; + if (!(ty->termstate.top_margin || ty->termstate.bottom_margin || + ty->termstate.left_margin || ty->termstate.right_margin) && + (!ty->altbuf)) + termpty_text_save_top(ty, &(TERMPTY_SCREEN(ty, 0, 0)), ty->w); termio_scroll(ty->obj, -1, start_y, end_y); DBG("... scroll!!!!! [%i->%i]", start_y, end_y); - if (start_y == 0 && end_y == ty->h - 1) + if ((start_y == 0 && end_y == ty->h - 1) && + (ty->termstate.left_margin == 0) && + (ty->termstate.right_margin == 0)) { - // screen is a circular buffer now - cells = &(ty->screen[ty->circular_offset * ty->w]); - if (clear) + // screen is a circular buffer now + cells = &(ty->screen[ty->circular_offset * ty->w]); + if (clear) termpty_cells_clear(ty, cells, ty->w); - ty->circular_offset++; - if (ty->circular_offset >= ty->h) - ty->circular_offset = 0; + ty->circular_offset++; + if (ty->circular_offset >= ty->h) + ty->circular_offset = 0; } else { - cells = &(TERMPTY_SCREEN(ty, 0, end_y)); - for (y = start_y; y < end_y; y++) - { - cells = &(TERMPTY_SCREEN(ty, 0, (y + 1))); - cells2 = &(TERMPTY_SCREEN(ty, 0, y)); - termpty_cell_copy(ty, cells, cells2, ty->w); - } - if (clear) - termpty_cells_clear(ty, cells, ty->w); + int x = ty->termstate.left_margin; + int w = ty->w; + + if (ty->termstate.right_margin) + w = ty->termstate.right_margin - x; + + cells = &(TERMPTY_SCREEN(ty, x, end_y)); + for (y = start_y; y < end_y; y++) + { + cells = &(TERMPTY_SCREEN(ty, x, (y + 1))); + cells2 = &(TERMPTY_SCREEN(ty, x, y)); + termpty_cell_copy(ty, cells, cells2, w); + } + if (clear) + termpty_cells_clear(ty, cells + x, w); } } @@ -147,7 +154,13 @@ termpty_text_append(Termpty *ty, const Eina_Unicode *codepoints, int len) { Termcell *cells; int i, j; + int origin = ty->termstate.left_margin; + int max_right = ty->w; + if (ty->termstate.right_margin) + max_right = ty->termstate.right_margin; + + /* TODO: have content_change_box*/ termio_content_change(ty->obj, ty->cursor_state.cx, ty->cursor_state.cy, len); cells = &(TERMPTY_SCREEN(ty, 0, ty->cursor_state.cy)); @@ -157,16 +170,16 @@ termpty_text_append(Termpty *ty, const Eina_Unicode *codepoints, int len) if (ty->termstate.wrapnext) { - cells[ty->w - 1].att.autowrapped = 1; + cells[max_right-1].att.autowrapped = 1; ty->termstate.wrapnext = 0; - ty->cursor_state.cx = 0; + ty->cursor_state.cx = origin; ty->cursor_state.cy++; termpty_text_scroll_test(ty, EINA_TRUE); cells = &(TERMPTY_SCREEN(ty, 0, ty->cursor_state.cy)); } if (ty->termstate.insert) { - for (j = ty->w - 1; j > ty->cursor_state.cx; j--) + for (j = max_right-1; j > ty->cursor_state.cx; j--) termpty_cell_copy(ty, &(cells[j - 1]), &(cells[j]), 1); } @@ -194,7 +207,7 @@ termpty_text_append(Termpty *ty, const Eina_Unicode *codepoints, int len) cells[ty->cursor_state.cx].att.strike = 1; } cells[ty->cursor_state.cx].att.dblwidth = _termpty_is_dblwidth_get(ty, g); - if (EINA_UNLIKELY((cells[ty->cursor_state.cx].att.dblwidth) && (ty->cursor_state.cx < (ty->w - 1)))) + if (EINA_UNLIKELY((cells[ty->cursor_state.cx].att.dblwidth) && (ty->cursor_state.cx < (max_right - 1)))) { TERMPTY_FMTCLR(cells[ty->cursor_state.cx].att); termpty_cell_codepoint_att_fill(ty, 0, cells[ty->cursor_state.cx].att, @@ -207,12 +220,12 @@ termpty_text_append(Termpty *ty, const Eina_Unicode *codepoints, int len) ty->termstate.wrapnext = 0; if (EINA_UNLIKELY(cells[ty->cursor_state.cx].att.dblwidth)) offset = 2; - if (EINA_UNLIKELY(ty->cursor_state.cx >= (ty->w - offset))) + if (EINA_UNLIKELY(ty->cursor_state.cx >= (max_right - offset))) ty->termstate.wrapnext = 1; else { ty->cursor_state.cx += offset; - TERMPTY_RESTRICT_FIELD(ty->cursor_state.cx, 0, ty->w); + TERMPTY_RESTRICT_FIELD(ty->cursor_state.cx, 0, max_right); } } else @@ -223,13 +236,13 @@ termpty_text_append(Termpty *ty, const Eina_Unicode *codepoints, int len) if (EINA_UNLIKELY(cells[ty->cursor_state.cx].att.dblwidth)) offset = 2; ty->cursor_state.cx += offset; - if (ty->cursor_state.cx > (ty->w - offset)) + if (ty->cursor_state.cx > (max_right - offset)) { - ty->cursor_state.cx = ty->w - offset; - TERMPTY_RESTRICT_FIELD(ty->cursor_state.cx, 0, ty->w); + ty->cursor_state.cx = max_right - offset; + TERMPTY_RESTRICT_FIELD(ty->cursor_state.cx, 0, max_right); return; } - TERMPTY_RESTRICT_FIELD(ty->cursor_state.cx, 0, ty->w); + TERMPTY_RESTRICT_FIELD(ty->cursor_state.cx, 0, max_right); } } }