aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--screen-write.c38
-rw-r--r--tmux.h1
-rw-r--r--tty.c12
3 files changed, 26 insertions, 25 deletions
diff --git a/screen-write.c b/screen-write.c
index 227316cb..9acb0c03 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -31,8 +31,8 @@ static void screen_write_flush(struct screen_write_ctx *);
static int screen_write_overwrite(struct screen_write_ctx *,
struct grid_cell *, u_int);
-static int screen_write_combine(struct screen_write_ctx *,
- const struct utf8_data *);
+static const struct grid_cell *screen_write_combine(struct screen_write_ctx *,
+ const struct utf8_data *, u_int *);
static const struct grid_cell screen_write_pad_cell = {
GRID_FLAG_PADDING, 0, 8, 8, { { 0 }, 0, 0, 0 }
@@ -1061,9 +1061,11 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
* there is space.
*/
if (width == 0) {
- if (screen_write_combine(ctx, &gc->data) == 0) {
+ if ((gc = screen_write_combine(ctx, &gc->data, &xx)) != 0) {
+ screen_write_cursormove(ctx, xx, s->cy);
screen_write_initctx(ctx, &ttyctx);
- tty_write(tty_cmd_utf8character, &ttyctx);
+ ttyctx.cell = gc;
+ tty_write(tty_cmd_cell, &ttyctx);
}
return;
}
@@ -1203,36 +1205,48 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
}
/* Combine a UTF-8 zero-width character onto the previous. */
-static int
-screen_write_combine(struct screen_write_ctx *ctx, const struct utf8_data *ud)
+static const struct grid_cell *
+screen_write_combine(struct screen_write_ctx *ctx, const struct utf8_data *ud,
+ u_int *xx)
{
struct screen *s = ctx->s;
struct grid *gd = s->grid;
- struct grid_cell gc;
+ static struct grid_cell gc;
+ u_int n;
/* Can't combine if at 0. */
if (s->cx == 0)
- return (-1);
+ return (NULL);
/* Empty data is out. */
if (ud->size == 0)
fatalx("UTF-8 data empty");
/* Retrieve the previous cell. */
- grid_view_get_cell(gd, s->cx - 1, s->cy, &gc);
+ for (n = 1; n < s->cx; n++) {
+ grid_view_get_cell(gd, s->cx - n, s->cy, &gc);
+ if (~gc.flags & GRID_FLAG_PADDING)
+ break;
+ }
+ if (n == s->cx)
+ return (NULL);
+ *xx = s->cx - n;
/* Check there is enough space. */
if (gc.data.size + ud->size > sizeof gc.data.data)
- return (-1);
+ return (NULL);
+
+ log_debug("%s: %.*s onto %.*s at %u,%u", __func__, (int)ud->size,
+ ud->data, (int)gc.data.size, gc.data.data, *xx, s->cy);
/* Append the data. */
memcpy(gc.data.data + gc.data.size, ud->data, ud->size);
gc.data.size += ud->size;
/* Set the new cell. */
- grid_view_set_cell(gd, s->cx - 1, s->cy, &gc);
+ grid_view_set_cell(gd, *xx, s->cy, &gc);
- return (0);
+ return (&gc);
}
/*
diff --git a/tmux.h b/tmux.h
index c980f9bb..068bcbbe 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1667,7 +1667,6 @@ void tty_cmd_erasecharacter(struct tty *, const struct tty_ctx *);
void tty_cmd_insertcharacter(struct tty *, const struct tty_ctx *);
void tty_cmd_insertline(struct tty *, const struct tty_ctx *);
void tty_cmd_linefeed(struct tty *, const struct tty_ctx *);
-void tty_cmd_utf8character(struct tty *, const struct tty_ctx *);
void tty_cmd_reverseindex(struct tty *, const struct tty_ctx *);
void tty_cmd_setselection(struct tty *, const struct tty_ctx *);
void tty_cmd_rawstring(struct tty *, const struct tty_ctx *);
diff --git a/tty.c b/tty.c
index f50fbdb2..0230a60e 100644
--- a/tty.c
+++ b/tty.c
@@ -1174,18 +1174,6 @@ tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx)
}
void
-tty_cmd_utf8character(struct tty *tty, const struct tty_ctx *ctx)
-{
- struct window_pane *wp = ctx->wp;
-
- /*
- * Cannot rely on not being a partial character, so just redraw the
- * whole line.
- */
- tty_draw_pane(tty, wp, ctx->ocy, ctx->xoff, ctx->yoff);
-}
-
-void
tty_cmd_setselection(struct tty *tty, const struct tty_ctx *ctx)
{
char *buf;