summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2013-03-22 10:36:55 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2013-03-22 10:36:55 +0000
commit137a4bbc41fe6e0976510998536f8a256c2db738 (patch)
tree2feb3b6ca7bec7a99bf02764626bb3bfe64cc861
parent4988d8fd04f07e5d2462fe91e5111b3c0c70a189 (diff)
Implement DECAWM (SM/RM 7) using existing MODE_WRAP flag.
-rw-r--r--usr.bin/tmux/input.c8
-rw-r--r--usr.bin/tmux/screen-write.c25
2 files changed, 23 insertions, 10 deletions
diff --git a/usr.bin/tmux/input.c b/usr.bin/tmux/input.c
index 2f27a0e7d54..e2d61345295 100644
--- a/usr.bin/tmux/input.c
+++ b/usr.bin/tmux/input.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: input.c,v 1.60 2013/03/22 10:33:50 nicm Exp $ */
+/* $OpenBSD: input.c,v 1.61 2013/03/22 10:36:53 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -1248,6 +1248,9 @@ input_csi_dispatch(struct input_ctx *ictx)
screen_write_cursormove(&ictx->ctx, 0, 0);
screen_write_clearscreen(&ictx->ctx);
break;
+ case 7: /* DECAWM */
+ screen_write_mode_clear(&ictx->ctx, MODE_WRAP);
+ break;
case 25: /* TCEM */
screen_write_mode_clear(&ictx->ctx, MODE_CURSOR);
break;
@@ -1305,6 +1308,9 @@ input_csi_dispatch(struct input_ctx *ictx)
screen_write_cursormove(&ictx->ctx, 0, 0);
screen_write_clearscreen(&ictx->ctx);
break;
+ case 7: /* DECAWM */
+ screen_write_mode_set(&ictx->ctx, MODE_WRAP);
+ break;
case 25: /* TCEM */
screen_write_mode_set(&ictx->ctx, MODE_CURSOR);
break;
diff --git a/usr.bin/tmux/screen-write.c b/usr.bin/tmux/screen-write.c
index 030538d5948..e08a9916e01 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.63 2013/03/22 10:33:50 nicm Exp $ */
+/* $OpenBSD: screen-write.c,v 1.64 2013/03/22 10:36:54 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -979,10 +979,10 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
struct screen *s = ctx->s;
struct grid *gd = s->grid;
struct tty_ctx ttyctx;
- u_int width, xx;
+ u_int width, xx, last;
struct grid_cell tmp_gc, *tmp_gcp;
struct utf8_data ud;
- int insert = 0;
+ int insert;
/* Ignore padding. */
if (gc->flags & GRID_FLAG_PADDING)
@@ -1020,7 +1020,8 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
xx = screen_size_x(s) - s->cx - width;
grid_move_cells(s->grid, s->cx + width, s->cx, s->cy, xx);
insert = 1;
- }
+ } else
+ insert = 0;
/* Check this will fit on the current line and wrap if not. */
if ((s->mode & MODE_WRAP) && s->cx > screen_size_x(s) - width) {
@@ -1028,9 +1029,8 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
s->cx = 0; /* carriage return */
}
- /* Sanity checks. */
- if (((s->mode & MODE_WRAP) && s->cx > screen_size_x(s) - width)
- || s->cy > screen_size_y(s) - 1)
+ /* Sanity check cursor position. */
+ if (s->cx > screen_size_x(s) - width || s->cy > screen_size_y(s) - 1)
return;
/* Handle overwriting of UTF-8 characters. */
@@ -1049,8 +1049,15 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
/* Set the cell. */
grid_view_set_cell(gd, s->cx, s->cy, gc);
- /* Move the cursor. */
- s->cx += width;
+ /*
+ * Move the cursor. If not wrapping, stick at the last character and
+ * replace it.
+ */
+ last = !!(s->mode & MODE_WRAP);
+ if (s->cx <= screen_size_x(s) - last - width)
+ s->cx += width;
+ else
+ s->cx = screen_size_x(s) - last;
/* Draw to the screen if necessary. */
if (insert) {