aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--grid.c4
-rw-r--r--screen-write.c2
-rw-r--r--tmux.h2
-rw-r--r--utf8.c54
-rw-r--r--window-copy.c9
5 files changed, 33 insertions, 38 deletions
diff --git a/grid.c b/grid.c
index 6ca14cba..7943d3be 100644
--- a/grid.c
+++ b/grid.c
@@ -76,7 +76,7 @@ grid_need_extended_cell(const struct grid_cell_entry *gce,
return (1);
if (gc->attr > 0xff)
return (1);
- if (gc->data.size > 1 || gc->data.width > 1)
+ if (gc->data.size != 1 || gc->data.width != 1)
return (1);
if ((gc->fg & COLOUR_FLAG_RGB) || (gc->bg & COLOUR_FLAG_RGB))
return (1);
@@ -570,7 +570,7 @@ grid_set_cells(struct grid *gd, u_int px, u_int py, const struct grid_cell *gc,
gce = &gl->celldata[px + i];
if (grid_need_extended_cell(gce, gc)) {
gee = grid_extended_cell(gl, gce, gc);
- gee->data = utf8_build_one(s[i], 1);
+ gee->data = utf8_build_one(s[i]);
} else
grid_store_cell(gce, gc, s[i]);
}
diff --git a/screen-write.c b/screen-write.c
index 33e3f975..68c3aa76 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -39,7 +39,7 @@ 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 = {
- { { ' ' }, 0, 1, 1 }, 0, GRID_FLAG_PADDING, 8, 8, 0
+ { { 0 }, 0, 0, 0 }, 0, GRID_FLAG_PADDING, 8, 8, 0
};
struct screen_write_collect_item {
diff --git a/tmux.h b/tmux.h
index 83e2ed45..f0e6ee8b 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2904,7 +2904,7 @@ u_int session_group_attached_count(struct session_group *);
void session_renumber_windows(struct session *);
/* utf8.c */
-utf8_char utf8_build_one(char, u_int);
+utf8_char utf8_build_one(u_char);
enum utf8_state utf8_from_data(const struct utf8_data *, utf8_char *);
void utf8_to_data(utf8_char, struct utf8_data *);
void utf8_set(struct utf8_data *, u_char);
diff --git a/utf8.c b/utf8.c
index e03d9e6e..44813ac9 100644
--- a/utf8.c
+++ b/utf8.c
@@ -55,19 +55,26 @@ union utf8_map {
utf8_char uc;
struct {
u_char flags;
-#define UTF8_FLAG_SIZE 0x1f
-#define UTF8_FLAG_WIDTH2 0x20
-
u_char data[3];
};
} __packed;
+#define UTF8_GET_SIZE(flags) ((flags) & 0x1f)
+#define UTF8_GET_WIDTH(flags) (((flags) >> 5) - 1)
+
+#define UTF8_SET_SIZE(size) (size)
+#define UTF8_SET_WIDTH(width) ((width + 1) << 5)
+
+static const union utf8_map utf8_space0 = {
+ .flags = UTF8_SET_WIDTH(0)|UTF8_SET_SIZE(0),
+ .data = ""
+};
static const union utf8_map utf8_space1 = {
- .flags = 1,
+ .flags = UTF8_SET_WIDTH(1)|UTF8_SET_SIZE(1),
.data = " "
};
static const union utf8_map utf8_space2 = {
- .flags = UTF8_FLAG_WIDTH2|2,
+ .flags = UTF8_SET_WIDTH(2)|UTF8_SET_SIZE(2),
.data = " "
};
@@ -134,24 +141,12 @@ utf8_from_data(const struct utf8_data *ud, utf8_char *uc)
union utf8_map m = { .uc = 0 };
u_int offset;
- if (ud->width == 0)
- goto fail;
- if (ud->width != 1 && ud->width != 2)
+ if (ud->width > 2)
fatalx("invalid UTF-8 width");
- if (ud->size == 0)
- fatalx("invalid UTF-8 size");
- if (ud->size > UTF8_FLAG_SIZE)
+ if (ud->size > UTF8_SIZE)
goto fail;
- if (ud->size == 1) {
- *uc = utf8_build_one(ud->data[0], 1);
- return (UTF8_DONE);
- }
-
- m.flags = ud->size;
- if (ud->width == 2)
- m.flags |= UTF8_FLAG_WIDTH2;
-
+ m.flags = UTF8_SET_SIZE(ud->size)|UTF8_SET_WIDTH(ud->width);
if (ud->size <= 3)
memcpy(m.data, ud->data, ud->size);
else {
@@ -165,7 +160,9 @@ utf8_from_data(const struct utf8_data *ud, utf8_char *uc)
return (UTF8_DONE);
fail:
- if (ud->width == 1)
+ if (ud->width == 0)
+ *uc = htonl(utf8_space0.uc);
+ else if (ud->width == 1)
*uc = htonl(utf8_space1.uc);
else
*uc = htonl(utf8_space2.uc);
@@ -181,11 +178,8 @@ utf8_to_data(utf8_char uc, struct utf8_data *ud)
u_int offset;
memset(ud, 0, sizeof *ud);
- ud->size = ud->have = (m.flags & UTF8_FLAG_SIZE);
- if (m.flags & UTF8_FLAG_WIDTH2)
- ud->width = 2;
- else
- ud->width = 1;
+ ud->size = ud->have = UTF8_GET_SIZE(m.flags);
+ ud->width = UTF8_GET_WIDTH(m.flags);
if (ud->size <= 3) {
memcpy(ud->data, m.data, ud->size);
@@ -203,12 +197,12 @@ utf8_to_data(utf8_char uc, struct utf8_data *ud)
/* Get UTF-8 character from a single ASCII character. */
u_int
-utf8_build_one(char c, u_int width)
+utf8_build_one(u_char ch)
{
- union utf8_map m = { .flags = 1, .data[0] = c };
+ union utf8_map m;
- if (width == 2)
- m.flags |= UTF8_FLAG_WIDTH2;
+ m.flags = UTF8_SET_SIZE(1)|UTF8_SET_WIDTH(1);
+ m.data[0] = ch;
return (htonl(m.uc));
}
diff --git a/window-copy.c b/window-copy.c
index af80186b..20f351aa 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -3628,6 +3628,8 @@ window_copy_get_selection(struct window_mode_entry *wme, size_t *len)
buf = window_copy_match_at_cursor(data);
if (buf != NULL)
*len = strlen(buf);
+ else
+ *len = 0;
return (buf);
}
@@ -3719,6 +3721,7 @@ window_copy_get_selection(struct window_mode_entry *wme, size_t *len)
/* Don't bother if no data. */
if (off == 0) {
free(buf);
+ *len = 0;
return (NULL);
}
if (keys == MODEKEY_EMACS || lastex <= ey_last)
@@ -3753,9 +3756,6 @@ window_copy_copy_pipe(struct window_mode_entry *wme, struct session *s,
struct job *job;
buf = window_copy_get_selection(wme, &len);
- if (buf == NULL)
- return;
-
if (cmd == NULL || *cmd == '\0')
cmd = options_get_string(global_options, "copy-command");
if (cmd != NULL && *cmd != '\0') {
@@ -3763,7 +3763,8 @@ window_copy_copy_pipe(struct window_mode_entry *wme, struct session *s,
-1, -1);
bufferevent_write(job_get_event(job), buf, len);
}
- window_copy_copy_buffer(wme, prefix, buf, len);
+ if (buf != NULL)
+ window_copy_copy_buffer(wme, prefix, buf, len);
}
static void