Scrolling needs to use background colour.

This commit is contained in:
nicm 2017-05-12 13:00:56 +00:00
parent 60f7b05c0c
commit 18bab30792
8 changed files with 57 additions and 34 deletions

View File

@ -96,32 +96,34 @@ grid_view_clear(struct grid *gd, u_int px, u_int py, u_int nx, u_int ny,
/* Scroll region up. */ /* Scroll region up. */
void void
grid_view_scroll_region_up(struct grid *gd, u_int rupper, u_int rlower) grid_view_scroll_region_up(struct grid *gd, u_int rupper, u_int rlower,
u_int bg)
{ {
if (gd->flags & GRID_HISTORY) { if (gd->flags & GRID_HISTORY) {
grid_collect_history(gd, 8); grid_collect_history(gd, bg);
if (rupper == 0 && rlower == gd->sy - 1) if (rupper == 0 && rlower == gd->sy - 1)
grid_scroll_history(gd, 8); grid_scroll_history(gd, bg);
else { else {
rupper = grid_view_y(gd, rupper); rupper = grid_view_y(gd, rupper);
rlower = grid_view_y(gd, rlower); rlower = grid_view_y(gd, rlower);
grid_scroll_history_region(gd, rupper, rlower); grid_scroll_history_region(gd, rupper, rlower, bg);
} }
} else { } else {
rupper = grid_view_y(gd, rupper); rupper = grid_view_y(gd, rupper);
rlower = grid_view_y(gd, rlower); rlower = grid_view_y(gd, rlower);
grid_move_lines(gd, rupper, rupper + 1, rlower - rupper, 8); grid_move_lines(gd, rupper, rupper + 1, rlower - rupper, bg);
} }
} }
/* Scroll region down. */ /* Scroll region down. */
void void
grid_view_scroll_region_down(struct grid *gd, u_int rupper, u_int rlower) grid_view_scroll_region_down(struct grid *gd, u_int rupper, u_int rlower,
u_int bg)
{ {
rupper = grid_view_y(gd, rupper); rupper = grid_view_y(gd, rupper);
rlower = grid_view_y(gd, rlower); rlower = grid_view_y(gd, rlower);
grid_move_lines(gd, rupper + 1, rupper, rlower - rupper, 8); grid_move_lines(gd, rupper + 1, rupper, rlower - rupper, bg);
} }
/* Insert lines. */ /* Insert lines. */

4
grid.c
View File

@ -284,7 +284,7 @@ grid_clear_history(struct grid *gd)
/* Scroll a region up, moving the top line into the history. */ /* Scroll a region up, moving the top line into the history. */
void void
grid_scroll_history_region(struct grid *gd, u_int upper, u_int lower) grid_scroll_history_region(struct grid *gd, u_int upper, u_int lower, u_int bg)
{ {
struct grid_line *gl_history, *gl_upper, *gl_lower; struct grid_line *gl_history, *gl_upper, *gl_lower;
u_int yy; u_int yy;
@ -309,7 +309,7 @@ grid_scroll_history_region(struct grid *gd, u_int upper, u_int lower)
/* Then move the region up and clear the bottom line. */ /* Then move the region up and clear the bottom line. */
memmove(gl_upper, gl_upper + 1, (lower - upper) * sizeof *gl_upper); memmove(gl_upper, gl_upper + 1, (lower - upper) * sizeof *gl_upper);
memset(gl_lower, 0, sizeof *gl_lower); grid_empty_line(gd, lower, bg);
/* Move the history offset down over the line. */ /* Move the history offset down over the line. */
gd->hscrolled++; gd->hscrolled++;

11
input.c
View File

@ -1123,7 +1123,7 @@ input_c0_dispatch(struct input_ctx *ictx)
case '\012': /* LF */ case '\012': /* LF */
case '\013': /* VT */ case '\013': /* VT */
case '\014': /* FF */ case '\014': /* FF */
screen_write_linefeed(sctx, 0); screen_write_linefeed(sctx, 0, ictx->cell.cell.bg);
break; break;
case '\015': /* CR */ case '\015': /* CR */
screen_write_carriagereturn(sctx); screen_write_carriagereturn(sctx);
@ -1168,18 +1168,18 @@ input_esc_dispatch(struct input_ctx *ictx)
screen_write_reset(sctx); screen_write_reset(sctx);
break; break;
case INPUT_ESC_IND: case INPUT_ESC_IND:
screen_write_linefeed(sctx, 0); screen_write_linefeed(sctx, 0, ictx->cell.cell.bg);
break; break;
case INPUT_ESC_NEL: case INPUT_ESC_NEL:
screen_write_carriagereturn(sctx); screen_write_carriagereturn(sctx);
screen_write_linefeed(sctx, 0); screen_write_linefeed(sctx, 0, ictx->cell.cell.bg);
break; break;
case INPUT_ESC_HTS: case INPUT_ESC_HTS:
if (s->cx < screen_size_x(s)) if (s->cx < screen_size_x(s))
bit_set(s->tabs, s->cx); bit_set(s->tabs, s->cx);
break; break;
case INPUT_ESC_RI: case INPUT_ESC_RI:
screen_write_reverseindex(sctx); screen_write_reverseindex(sctx, ictx->cell.cell.bg);
break; break;
case INPUT_ESC_DECKPAM: case INPUT_ESC_DECKPAM:
screen_write_mode_set(sctx, MODE_KKEYPAD); screen_write_mode_set(sctx, MODE_KKEYPAD);
@ -1417,7 +1417,8 @@ input_csi_dispatch(struct input_ctx *ictx)
input_csi_dispatch_sm_private(ictx); input_csi_dispatch_sm_private(ictx);
break; break;
case INPUT_CSI_SU: case INPUT_CSI_SU:
screen_write_scrollup(sctx, input_get(ictx, 0, 1, 1)); screen_write_scrollup(sctx, input_get(ictx, 0, 1, 1),
ictx->cell.cell.bg);
break; break;
case INPUT_CSI_TBC: case INPUT_CSI_TBC:
switch (input_get(ictx, 0, 0, 0)) { switch (input_get(ictx, 0, 0, 0)) {

View File

@ -75,6 +75,9 @@ screen_write_start(struct screen_write_ctx *ctx, struct window_pane *wp,
TAILQ_INIT(&ctx->list[y].items); TAILQ_INIT(&ctx->list[y].items);
ctx->item = xcalloc(1, sizeof *ctx->item); ctx->item = xcalloc(1, sizeof *ctx->item);
ctx->scrolled = 0;
ctx->bg = 8;
if (wp != NULL) if (wp != NULL)
snprintf(tmp, sizeof tmp, "pane %%%u", wp->id); snprintf(tmp, sizeof tmp, "pane %%%u", wp->id);
log_debug("%s: size %ux%u, %s", __func__, screen_size_x(ctx->s), log_debug("%s: size %ux%u, %s", __func__, screen_size_x(ctx->s),
@ -810,15 +813,16 @@ screen_write_cursormove(struct screen_write_ctx *ctx, u_int px, u_int py)
/* Reverse index (up with scroll). */ /* Reverse index (up with scroll). */
void void
screen_write_reverseindex(struct screen_write_ctx *ctx) screen_write_reverseindex(struct screen_write_ctx *ctx, u_int bg)
{ {
struct screen *s = ctx->s; struct screen *s = ctx->s;
struct tty_ctx ttyctx; struct tty_ctx ttyctx;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx);
ttyctx.bg = bg;
if (s->cy == s->rupper) if (s->cy == s->rupper)
grid_view_scroll_region_down(s->grid, s->rupper, s->rlower); grid_view_scroll_region_down(s->grid, s->rupper, s->rlower, bg);
else if (s->cy > 0) else if (s->cy > 0)
s->cy--; s->cy--;
@ -852,7 +856,7 @@ screen_write_scrollregion(struct screen_write_ctx *ctx, u_int rupper,
/* Line feed. */ /* Line feed. */
void void
screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped) screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped, u_int bg)
{ {
struct screen *s = ctx->s; struct screen *s = ctx->s;
struct grid *gd = s->grid; struct grid *gd = s->grid;
@ -867,8 +871,13 @@ screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped)
log_debug("%s: at %u,%u (region %u-%u)", __func__, s->cx, s->cy, log_debug("%s: at %u,%u (region %u-%u)", __func__, s->cx, s->cy,
s->rupper, s->rlower); s->rupper, s->rlower);
if (bg != ctx->bg) {
screen_write_collect_flush(ctx, 1);
ctx->bg = bg;
}
if (s->cy == s->rlower) { if (s->cy == s->rlower) {
grid_view_scroll_region_up(gd, s->rupper, s->rlower); grid_view_scroll_region_up(gd, s->rupper, s->rlower, bg);
screen_write_collect_scroll(ctx); screen_write_collect_scroll(ctx);
ctx->scrolled++; ctx->scrolled++;
} else if (s->cy < screen_size_y(s) - 1) } else if (s->cy < screen_size_y(s) - 1)
@ -877,7 +886,7 @@ screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped)
/* Scroll up. */ /* Scroll up. */
void void
screen_write_scrollup(struct screen_write_ctx *ctx, u_int lines) screen_write_scrollup(struct screen_write_ctx *ctx, u_int lines, u_int bg)
{ {
struct screen *s = ctx->s; struct screen *s = ctx->s;
struct grid *gd = s->grid; struct grid *gd = s->grid;
@ -888,8 +897,13 @@ screen_write_scrollup(struct screen_write_ctx *ctx, u_int lines)
else if (lines > s->rlower - s->rupper + 1) else if (lines > s->rlower - s->rupper + 1)
lines = s->rlower - s->rupper + 1; lines = s->rlower - s->rupper + 1;
if (bg != ctx->bg) {
screen_write_collect_flush(ctx, 1);
ctx->bg = bg;
}
for (i = 0; i < lines; i++) { for (i = 0; i < lines; i++) {
grid_view_scroll_region_up(gd, s->rupper, s->rlower); grid_view_scroll_region_up(gd, s->rupper, s->rlower, bg);
screen_write_collect_scroll(ctx); screen_write_collect_scroll(ctx);
} }
ctx->scrolled += lines; ctx->scrolled += lines;
@ -1044,9 +1058,12 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only)
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx);
ttyctx.num = ctx->scrolled; ttyctx.num = ctx->scrolled;
ttyctx.bg = ctx->bg;
tty_write(tty_cmd_scrollup, &ttyctx); tty_write(tty_cmd_scrollup, &ttyctx);
} }
ctx->scrolled = 0; ctx->scrolled = 0;
ctx->bg = 8;
if (scroll_only) if (scroll_only)
return; return;
@ -1141,7 +1158,7 @@ screen_write_collect_add(struct screen_write_ctx *ctx,
if (s->cx > sx - 1) { if (s->cx > sx - 1) {
log_debug("%s: wrapped at %u,%u", __func__, s->cx, s->cy); log_debug("%s: wrapped at %u,%u", __func__, s->cx, s->cy);
ci->wrapped = 1; ci->wrapped = 1;
screen_write_linefeed(ctx, 1); screen_write_linefeed(ctx, 1, 8);
s->cx = 0; s->cx = 0;
} }
@ -1202,7 +1219,7 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
/* Check this will fit on the current line and wrap if not. */ /* Check this will fit on the current line and wrap if not. */
if ((s->mode & MODE_WRAP) && s->cx > sx - width) { if ((s->mode & MODE_WRAP) && s->cx > sx - width) {
screen_write_linefeed(ctx, 1); screen_write_linefeed(ctx, 1, 8);
s->cx = 0; s->cx = 0;
} }

View File

@ -299,7 +299,7 @@ server_destroy_pane(struct window_pane *wp, int notify)
screen_write_start(&ctx, wp, &wp->base); screen_write_start(&ctx, wp, &wp->base);
screen_write_scrollregion(&ctx, 0, screen_size_y(ctx.s) - 1); screen_write_scrollregion(&ctx, 0, screen_size_y(ctx.s) - 1);
screen_write_cursormove(&ctx, 0, screen_size_y(ctx.s) - 1); screen_write_cursormove(&ctx, 0, screen_size_y(ctx.s) - 1);
screen_write_linefeed(&ctx, 1); screen_write_linefeed(&ctx, 1, 8);
memcpy(&gc, &grid_default_cell, sizeof gc); memcpy(&gc, &grid_default_cell, sizeof gc);
gc.attr |= GRID_ATTR_BRIGHT; gc.attr |= GRID_ATTR_BRIGHT;
screen_write_puts(&ctx, &gc, "Pane is dead"); screen_write_puts(&ctx, &gc, "Pane is dead");

13
tmux.h
View File

@ -672,6 +672,7 @@ struct screen_write_ctx {
struct screen_write_collect_item *item; struct screen_write_collect_item *item;
struct screen_write_collect_line *list; struct screen_write_collect_line *list;
u_int scrolled; u_int scrolled;
u_int bg;
u_int cells; u_int cells;
u_int written; u_int written;
@ -1931,7 +1932,7 @@ void grid_destroy(struct grid *);
int grid_compare(struct grid *, struct grid *); int grid_compare(struct grid *, struct grid *);
void grid_collect_history(struct grid *, u_int); void grid_collect_history(struct grid *, u_int);
void grid_scroll_history(struct grid *, u_int); void grid_scroll_history(struct grid *, u_int);
void grid_scroll_history_region(struct grid *, u_int, u_int); void grid_scroll_history_region(struct grid *, u_int, u_int, u_int);
void grid_clear_history(struct grid *); void grid_clear_history(struct grid *);
const struct grid_line *grid_peek_line(struct grid *, u_int); const struct grid_line *grid_peek_line(struct grid *, u_int);
void grid_get_cell(struct grid *, u_int, u_int, struct grid_cell *); void grid_get_cell(struct grid *, u_int, u_int, struct grid_cell *);
@ -1956,8 +1957,8 @@ void grid_view_set_cells(struct grid *, u_int, u_int,
const struct grid_cell *, const char *, size_t); const struct grid_cell *, const char *, size_t);
void grid_view_clear_history(struct grid *, u_int); void grid_view_clear_history(struct grid *, u_int);
void grid_view_clear(struct grid *, u_int, u_int, u_int, u_int, u_int); void grid_view_clear(struct grid *, u_int, u_int, u_int, u_int, u_int);
void grid_view_scroll_region_up(struct grid *, u_int, u_int); void grid_view_scroll_region_up(struct grid *, u_int, u_int, u_int);
void grid_view_scroll_region_down(struct grid *, u_int, u_int); void grid_view_scroll_region_down(struct grid *, u_int, u_int, u_int);
void grid_view_insert_lines(struct grid *, u_int, u_int, u_int); void grid_view_insert_lines(struct grid *, u_int, u_int, u_int);
void grid_view_insert_lines_region(struct grid *, u_int, u_int, u_int, void grid_view_insert_lines_region(struct grid *, u_int, u_int, u_int,
u_int); u_int);
@ -2004,10 +2005,10 @@ void screen_write_clearline(struct screen_write_ctx *, u_int);
void screen_write_clearendofline(struct screen_write_ctx *, u_int); void screen_write_clearendofline(struct screen_write_ctx *, u_int);
void screen_write_clearstartofline(struct screen_write_ctx *, u_int); void screen_write_clearstartofline(struct screen_write_ctx *, u_int);
void screen_write_cursormove(struct screen_write_ctx *, u_int, u_int); void screen_write_cursormove(struct screen_write_ctx *, u_int, u_int);
void screen_write_reverseindex(struct screen_write_ctx *); void screen_write_reverseindex(struct screen_write_ctx *, u_int);
void screen_write_scrollregion(struct screen_write_ctx *, u_int, u_int); void screen_write_scrollregion(struct screen_write_ctx *, u_int, u_int);
void screen_write_linefeed(struct screen_write_ctx *, int); void screen_write_linefeed(struct screen_write_ctx *, int, u_int);
void screen_write_scrollup(struct screen_write_ctx *, u_int); void screen_write_scrollup(struct screen_write_ctx *, u_int, u_int);
void screen_write_carriagereturn(struct screen_write_ctx *); void screen_write_carriagereturn(struct screen_write_ctx *);
void screen_write_clearendofscreen(struct screen_write_ctx *, u_int); void screen_write_clearendofscreen(struct screen_write_ctx *, u_int);
void screen_write_clearstartofscreen(struct screen_write_ctx *, u_int); void screen_write_clearstartofscreen(struct screen_write_ctx *, u_int);

10
tty.c
View File

@ -1141,18 +1141,20 @@ tty_cmd_clearstartofline(struct tty *tty, const struct tty_ctx *ctx)
void void
tty_cmd_reverseindex(struct tty *tty, const struct tty_ctx *ctx) tty_cmd_reverseindex(struct tty *tty, const struct tty_ctx *ctx)
{ {
struct window_pane *wp = ctx->wp;
if (ctx->ocy != ctx->orupper) if (ctx->ocy != ctx->orupper)
return; return;
if (!tty_pane_full_width(tty, ctx) || if (!tty_pane_full_width(tty, ctx) ||
tty_fake_bce(tty, ctx->wp, 8) || tty_fake_bce(tty, wp, 8) ||
!tty_term_has(tty->term, TTYC_CSR) || !tty_term_has(tty->term, TTYC_CSR) ||
!tty_term_has(tty->term, TTYC_RI)) { !tty_term_has(tty->term, TTYC_RI)) {
tty_redraw_region(tty, ctx); tty_redraw_region(tty, ctx);
return; return;
} }
tty_attributes(tty, &grid_default_cell, ctx->wp); tty_default_attributes(tty, wp, ctx->bg);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
tty_margin_off(tty); tty_margin_off(tty);
@ -1176,7 +1178,7 @@ tty_cmd_linefeed(struct tty *tty, const struct tty_ctx *ctx)
return; return;
} }
tty_attributes(tty, &grid_default_cell, wp); tty_default_attributes(tty, wp, ctx->bg);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
tty_margin_pane(tty, ctx); tty_margin_pane(tty, ctx);
@ -1207,7 +1209,7 @@ tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx)
return; return;
} }
tty_attributes(tty, &grid_default_cell, wp); tty_default_attributes(tty, wp, ctx->bg);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
tty_margin_pane(tty, ctx); tty_margin_pane(tty, ctx);

View File

@ -321,7 +321,7 @@ window_copy_vadd(struct window_pane *wp, const char *fmt, va_list ap)
* (so it's on a new line). * (so it's on a new line).
*/ */
screen_write_carriagereturn(&back_ctx); screen_write_carriagereturn(&back_ctx);
screen_write_linefeed(&back_ctx, 0); screen_write_linefeed(&back_ctx, 0, 8);
} else } else
data->backing_written = 1; data->backing_written = 1;
old_cy = backing->cy; old_cy = backing->cy;