aboutsummaryrefslogtreecommitdiff
path: root/tty.c
diff options
context:
space:
mode:
Diffstat (limited to 'tty.c')
-rw-r--r--tty.c53
1 files changed, 47 insertions, 6 deletions
diff --git a/tty.c b/tty.c
index d82b117b..dc7328dd 100644
--- a/tty.c
+++ b/tty.c
@@ -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);
}