=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/screen-write.c,v retrieving revision 1.105 retrieving revision 1.106 diff -c -r1.105 -r1.106 *** src/usr.bin/tmux/screen-write.c 2017/02/06 19:26:49 1.105 --- src/usr.bin/tmux/screen-write.c 2017/02/08 08:50:10 1.106 *************** *** 1,4 **** ! /* $OpenBSD: screen-write.c,v 1.105 2017/02/06 19:26:49 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: screen-write.c,v 1.106 2017/02/08 08:50:10 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 25,32 **** static void screen_write_initctx(struct screen_write_ctx *, struct tty_ctx *); - static void screen_write_save_last(struct screen_write_ctx *, - struct tty_ctx *); static void screen_write_flush(struct screen_write_ctx *); static int screen_write_overwrite(struct screen_write_ctx *, --- 25,30 ---- *************** *** 437,460 **** ttyctx->orupper = s->rupper; } - /* Save last cell on screen. */ - static void - screen_write_save_last(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx) - { - struct screen *s = ctx->s; - struct grid *gd = s->grid; - struct grid_cell gc; - u_int xx; - - memcpy(&gc, &grid_default_cell, sizeof gc); - for (xx = 1; xx <= screen_size_x(s); xx++) { - grid_view_get_cell(gd, screen_size_x(s) - xx, s->cy, &gc); - if (~gc.flags & GRID_FLAG_PADDING) - break; - } - memcpy(&ttyctx->last_cell, &gc, sizeof ttyctx->last_cell); - } - /* Set a mode. */ void screen_write_mode_set(struct screen_write_ctx *ctx, int mode) --- 435,440 ---- *************** *** 1040,1046 **** struct grid_line *gl; struct grid_cell tmp_gc, now_gc; struct grid_cell_entry *gce; ! int insert, skip, selected, wrapped = 0; ctx->cells++; --- 1020,1026 ---- struct grid_line *gl; struct grid_cell tmp_gc, now_gc; struct grid_cell_entry *gce; ! int insert, skip, selected; ctx->cells++; *************** *** 1071,1079 **** return; } - /* Initialise the redraw context. */ - screen_write_initctx(ctx, &ttyctx); - /* If in insert mode, make space for the cells. */ if (s->mode & MODE_INSERT) { if (s->cx <= sx - width) { --- 1051,1056 ---- *************** *** 1088,1105 **** /* Check this will fit on the current line and wrap if not. */ if ((s->mode & MODE_WRAP) && s->cx > sx - width) { - screen_write_flush(ctx); - screen_write_save_last(ctx, &ttyctx); screen_write_linefeed(ctx, 1); s->cx = 0; /* carriage return */ - skip = 0; - wrapped = 1; } /* Sanity check cursor position. */ if (s->cx > sx - width || s->cy > sy - 1) return; /* Handle overwriting of UTF-8 characters. */ gl = &s->grid->linedata[s->grid->hsize + s->cy]; if (gl->flags & GRID_LINE_EXTENDED) { --- 1065,1081 ---- /* Check this will fit on the current line and wrap if not. */ if ((s->mode & MODE_WRAP) && s->cx > sx - width) { screen_write_linefeed(ctx, 1); s->cx = 0; /* carriage return */ } /* Sanity check cursor position. */ if (s->cx > sx - width || s->cy > sy - 1) return; + /* Initialise the redraw context. */ + screen_write_initctx(ctx, &ttyctx); + /* Handle overwriting of UTF-8 characters. */ gl = &s->grid->linedata[s->grid->hsize + s->cy]; if (gl->flags & GRID_LINE_EXTENDED) { *************** *** 1179,1205 **** tty_write(tty_cmd_cell, &ttyctx); ctx->written++; } else if (!skip) { ! if (wrapped) { ! ttyctx.cell = gc; ! tty_write(tty_cmd_cell, &ttyctx); ! ctx->written++; ! } else { ! /* ! * If wp is NULL, we are not updating the terminal and ! * don't care about actually writing the cells ! * (tty_write will just return). So don't even bother ! * allocating the dirty array. ! */ ! if (ctx->wp != NULL && s->dirty == NULL) { ! log_debug("%s: allocating %u bits", __func__, ! s->dirtysize); ! s->dirty = bit_alloc(s->dirtysize); ! } ! if (s->dirty != NULL) { ! bit_set(s->dirty, screen_dirty_bit(s, ! ttyctx.ocx, ttyctx.ocy)); ! ctx->dirty++; ! } } } else ctx->skipped++; --- 1155,1174 ---- tty_write(tty_cmd_cell, &ttyctx); ctx->written++; } else if (!skip) { ! /* ! * If wp is NULL, we are not updating the terminal and don't ! * care about actually writing the cells (tty_write will just ! * return). So don't even bother allocating the dirty array. ! */ ! if (ctx->wp != NULL && s->dirty == NULL) { ! log_debug("%s: allocating %u bits", __func__, ! s->dirtysize); ! s->dirty = bit_alloc(s->dirtysize); ! } ! if (s->dirty != NULL) { ! bit_set(s->dirty, screen_dirty_bit(s, ! ttyctx.ocx, ttyctx.ocy)); ! ctx->dirty++; } } else ctx->skipped++;