diff options
Diffstat (limited to 'tty.c')
-rw-r--r-- | tty.c | 53 |
1 files changed, 47 insertions, 6 deletions
@@ -1,4 +1,4 @@ -/* $Id: tty.c,v 1.149 2009-10-15 01:38:09 tcunha Exp $ */ +/* $Id: tty.c,v 1.150 2009-10-15 01:41:14 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -332,9 +332,10 @@ tty_putc(struct tty *tty, u_char ch) if (tty->term->flags & TERM_EARLYWRAP) sx--; - if (tty->cx == sx) { - tty->cx = 0; - tty->cy++; + if (tty->cx >= sx) { + tty->cx = 1; + if (tty->cy != tty->rlower) + tty->cy++; } else tty->cx++; } @@ -445,6 +446,7 @@ void tty_draw_line(struct tty *tty, struct screen *s, u_int py, u_int ox, u_int oy) { const struct grid_cell *gc; + struct grid_line *gl; struct grid_cell tmpgc; const struct grid_utf8 *gu; u_int i, sx; @@ -457,7 +459,17 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int py, u_int ox, u_int oy) if (sx > tty->sx) sx = tty->sx; - tty_cursor(tty, ox, oy + py); + /* + * Don't move the cursor to the start permission if it will wrap there + * itself; much the same as the conditions in tty_cmd_cell. + */ + gl = NULL; + if (py != 0) + gl = &s->grid->linedata[s->grid->hsize + py - 1]; + if (ox != 0 || (gl != NULL && !(gl->flags & GRID_LINE_WRAPPED)) || + tty->cy != oy + py - 1 || tty->cx < tty->sx) + tty_cursor(tty, ox, oy + py); + for (i = 0; i < sx; i++) { gc = grid_view_peek_cell(s->grid, i, py); @@ -832,7 +844,36 @@ tty_cmd_alignmenttest(struct tty *tty, const struct tty_ctx *ctx) void tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx) { - tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); + struct window_pane *wp = ctx->wp; + struct screen *s = wp->screen; + struct grid_line *gl; + u_int wx, wy; + + tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); + + wx = ctx->ocx + wp->xoff; + wy = ctx->ocy + wp->yoff; + + /* + * If: + * + * - the line was wrapped: + * - the cursor is beyond the edge of the screen, + * - the desired position is at the left, + * - and either a) the desired next line is the one below the current + * or b) the current line is the bottom of the scroll region, + * + * Then just printing the next character will be enough to scroll into + * place, so don't do an explicit cursor move. + */ + gl = NULL; + if (ctx->ocy != 0) + gl = &s->grid->linedata[s->grid->hsize + ctx->ocy - 1]; + if (wy == 0 || (gl != NULL && !(gl->flags & GRID_LINE_WRAPPED)) || + tty->cx < tty->sx || /* not at edge of screen */ + wx != 0 || /* don't want 0 next */ + (wy != tty->cy + 1 && tty->cy != ctx->orlower + wp->yoff)) + tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); tty_cell(tty, ctx->cell, ctx->utf8); } |