The branch, master has been updated
       via  a6c4c2cca0d44e0cec9d4a0cc041290a263826fb (commit)
      from  ba3b8ccc1d994ec535721d71b400c3e78ee5ec25 (commit)

- Log -----------------------------------------------------------------
commit a6c4c2cca0d44e0cec9d4a0cc041290a263826fb
Author: Nicholas Marriott <nicholas.marri...@gmail.com>
Commit: Nicholas Marriott <nicholas.marri...@gmail.com>

    Implement DECAWM (SM/RM 7) using existing MODE_WRAP flag.
---
 TODO           |    1 -
 input.c        |    6 ++++++
 screen-write.c |   23 +++++++++++++++--------
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/TODO b/TODO
index aadc5af..1401778 100644
--- a/TODO
+++ b/TODO
@@ -171,7 +171,6 @@ TERMINAL ISSUES
 - support for bce
 - use screen-256color when started on 256 colour terminal??
 - if-shell/run-shell should block further command execution in the same command
-- wrap/no wrap esc seq DEC CSI ? 7 h/l
 * We need a tmux terminfo entry to document the extensions we are using in
   upstream terminfo. Must NOT change (only add or remove) anything from
   TERM=screen so we can fallback!
diff --git a/input.c b/input.c
index c4e19c0..4cf90ec 100644
--- a/input.c
+++ b/input.c
@@ -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/screen-write.c b/screen-write.c
index 59d91fd..a390dad 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -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) {


-----------------------------------------------------------------------

Summary of changes:
 TODO           |    1 -
 input.c        |    6 ++++++
 screen-write.c |   23 +++++++++++++++--------
 3 files changed, 21 insertions(+), 9 deletions(-)


hooks/post-receive
-- 
tmux

------------------------------------------------------------------------------
The Go Parallel Website, sponsored by Intel - in partnership with Geeknet, 
is your hub for all things parallel software development, from weekly thought 
leadership blogs to news, videos, case studies, tutorials, tech docs, 
whitepapers, evaluation guides, and opinion stories. Check out the most 
recent posts - join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
tmux-cvs mailing list
tmux-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to