summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/screen-write.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/tmux/screen-write.c')
-rw-r--r--usr.bin/tmux/screen-write.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/usr.bin/tmux/screen-write.c b/usr.bin/tmux/screen-write.c
index e66a350afa6..7723d610b77 100644
--- a/usr.bin/tmux/screen-write.c
+++ b/usr.bin/tmux/screen-write.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen-write.c,v 1.29 2009/10/12 16:59:55 nicm Exp $ */
+/* $OpenBSD: screen-write.c,v 1.30 2009/10/12 17:19:47 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -833,15 +833,15 @@ screen_write_mousemode(struct screen_write_ctx *ctx, int state)
s->mode &= ~MODE_MOUSE;
}
-/* Line feed (down with scroll). */
+/*
+ * Line feed the screen only (don't update the tty). Used for printing single
+ * characters, where might want to let the scroll happen naturally.
+ */
void
-screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped)
+screen_write_linefeedscreen(struct screen_write_ctx *ctx, int wrapped)
{
struct screen *s = ctx->s;
struct grid_line *gl;
- struct tty_ctx ttyctx;
-
- screen_write_initctx(ctx, &ttyctx);
gl = &s->grid->linedata[s->grid->hsize + s->cy];
if (wrapped)
@@ -853,6 +853,17 @@ screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped)
grid_view_scroll_region_up(s->grid, s->rupper, s->rlower);
else if (s->cy < screen_size_y(s) - 1)
s->cy++;
+}
+
+/* Line feed (down with scroll). */
+void
+screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped)
+{
+ struct tty_ctx ttyctx;
+
+ screen_write_initctx(ctx, &ttyctx);
+
+ screen_write_linefeedscreen(ctx, wrapped);
tty_write(tty_cmd_linefeed, &ttyctx);
}
@@ -952,6 +963,7 @@ screen_write_cell(
struct screen_write_ctx *ctx, const struct grid_cell *gc, u_char *udata)
{
struct screen *s = ctx->s;
+ struct window_pane *wp = ctx->wp;
struct grid *gd = s->grid;
struct tty_ctx ttyctx;
struct grid_utf8 gu, *tmp_gu;
@@ -1016,8 +1028,16 @@ screen_write_cell(
/* Check this will fit on the current line and wrap if not. */
if (s->cx > screen_size_x(s) - width) {
- screen_write_carriagereturn(ctx);
- screen_write_linefeed(ctx, 1);
+ /*
+ * Don't update the terminal now, just update the screen and
+ * leave the cursor to scroll naturally, unless this is only
+ * part of the screen width.
+ */
+ if (wp->xoff != 0 || wp->sx != screen_size_x(s))
+ screen_write_linefeed(ctx, 1);
+ else
+ screen_write_linefeedscreen(ctx, 1);
+ s->cx = 0; /* carriage return */
}
/* Sanity checks. */