Redraw selection in tty_draw_line, so it appears when redrawing whole

pane. Reported by Theo Buehler.
pull/581/head
nicm 2016-10-12 13:24:07 +00:00
parent 68bebe1fb7
commit 4160df4ca4
4 changed files with 25 additions and 7 deletions

View File

@ -1141,12 +1141,8 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
/* Write to the screen. */
if (selected) {
memcpy(&tmp_gc, &s->sel.cell, sizeof tmp_gc);
utf8_copy(&tmp_gc.data, &gc->data);
tmp_gc.attr = tmp_gc.attr & ~GRID_ATTR_CHARSET;
tmp_gc.attr |= gc->attr & GRID_ATTR_CHARSET;
tmp_gc.flags = gc->flags;
screen_write_flush(ctx);
screen_select_cell(s, &tmp_gc, gc);
ttyctx.cell = &tmp_gc;
tty_write(tty_cmd_cell, &ttyctx);
ctx->written++;

View File

@ -371,6 +371,22 @@ screen_check_selection(struct screen *s, u_int px, u_int py)
return (1);
}
/* Get selected grid cell. */
void
screen_select_cell(struct screen *s, struct grid_cell *dst,
const struct grid_cell *src)
{
if (!s->sel.flag)
return;
memcpy(dst, &s->sel.cell, sizeof *dst);
utf8_copy(&dst->data, &src->data);
dst->attr = dst->attr & ~GRID_ATTR_CHARSET;
dst->attr |= src->attr & GRID_ATTR_CHARSET;
dst->flags = src->flags;
}
/* Reflow wrapped lines. */
static void
screen_reflow(struct screen *s, u_int new_x)

2
tmux.h
View File

@ -2060,6 +2060,8 @@ void screen_set_selection(struct screen *,
u_int, u_int, u_int, u_int, u_int, struct grid_cell *);
void screen_clear_selection(struct screen *);
int screen_check_selection(struct screen *, u_int, u_int);
void screen_select_cell(struct screen *, struct grid_cell *,
const struct grid_cell *);
/* window.c */
extern struct windows windows;

8
tty.c
View File

@ -658,7 +658,7 @@ void
tty_draw_line(struct tty *tty, const struct window_pane *wp,
struct screen *s, u_int py, u_int ox, u_int oy)
{
struct grid_cell gc;
struct grid_cell gc, tmp_gc;
struct grid_line *gl;
u_int i, sx;
int flags;
@ -687,7 +687,11 @@ tty_draw_line(struct tty *tty, const struct window_pane *wp,
for (i = 0; i < sx; i++) {
grid_view_get_cell(s->grid, i, py, &gc);
tty_cell(tty, &gc, wp);
if (gc.flags & GRID_FLAG_SELECTED) {
screen_select_cell(s, &tmp_gc, &gc);
tty_cell(tty, &tmp_gc, wp);
} else
tty_cell(tty, &gc, wp);
}
if (sx < tty->sx) {