=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/tty.c,v retrieving revision 1.45 retrieving revision 1.46 diff -c -r1.45 -r1.46 *** src/usr.bin/tmux/tty.c 2009/10/12 16:41:02 1.45 --- src/usr.bin/tmux/tty.c 2009/10/12 17:19:47 1.46 *************** *** 1,4 **** ! /* $OpenBSD: tty.c,v 1.45 2009/10/12 16:41:02 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: tty.c,v 1.46 2009/10/12 17:19:47 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 327,335 **** if (tty->term->flags & TERM_EARLYWRAP) sx--; ! if (tty->cx == sx) { ! tty->cx = 0; ! tty->cy++; } else tty->cx++; } --- 327,336 ---- if (tty->term->flags & TERM_EARLYWRAP) sx--; ! if (tty->cx >= sx) { ! tty->cx = 1; ! if (tty->cy != tty->rlower) ! tty->cy++; } else tty->cx++; } *************** *** 440,445 **** --- 441,447 ---- 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; *************** *** 452,458 **** if (sx > tty->sx) sx = tty->sx; ! tty_cursor(tty, ox, oy + py); for (i = 0; i < sx; i++) { gc = grid_view_peek_cell(s->grid, i, py); --- 454,470 ---- if (sx > tty->sx) sx = tty->sx; ! /* ! * 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); *************** *** 827,833 **** void tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx) { ! tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); tty_cell(tty, ctx->cell, ctx->utf8); } --- 839,874 ---- void tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx) { ! 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); }