summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2020-02-03 13:46:27 +0000
committernicm <nicm>2020-02-03 13:46:27 +0000
commit265164d251f427bf9275c355a4f205c781d70b20 (patch)
tree9ddc4dee575a2d99de8347a5407dcc9a45d4b305
parent87bcc0c7e0fa0aded9a05093caaf22f3a080753d (diff)
Instead of passing titles through vis() which doubles backslashes, just
ignore any containing control characters or invalid UTF-8. GitHub issue 2070.
-rw-r--r--cmd-select-pane.c4
-rw-r--r--input.c10
-rw-r--r--screen.c9
-rw-r--r--tmux.h2
4 files changed, 13 insertions, 12 deletions
diff --git a/cmd-select-pane.c b/cmd-select-pane.c
index 6542c919..c63c7e61 100644
--- a/cmd-select-pane.c
+++ b/cmd-select-pane.c
@@ -197,8 +197,8 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
if (args_has(self->args, 'T')) {
pane_title = format_single(item, args_get(self->args, 'T'),
c, s, wl, wp);
- screen_set_title(&wp->base, pane_title);
- server_status_window(wp->window);
+ if (screen_set_title(&wp->base, pane_title))
+ server_status_window(wp->window);
free(pane_title);
return (CMD_RETURN_NORMAL);
}
diff --git a/input.c b/input.c
index ea9320d1..82d2b398 100644
--- a/input.c
+++ b/input.c
@@ -2213,10 +2213,8 @@ input_exit_osc(struct input_ctx *ictx)
switch (option) {
case 0:
case 2:
- if (utf8_isvalid(p)) {
- screen_set_title(sctx->s, p);
+ if (screen_set_title(sctx->s, p))
server_status_window(ictx->wp->window);
- }
break;
case 4:
input_osc_4(ictx, p);
@@ -2274,10 +2272,8 @@ input_exit_apc(struct input_ctx *ictx)
return;
log_debug("%s: \"%s\"", __func__, ictx->input_buf);
- if (!utf8_isvalid(ictx->input_buf))
- return;
- screen_set_title(sctx->s, ictx->input_buf);
- server_status_window(ictx->wp->window);
+ if (screen_set_title(sctx->s, ictx->input_buf))
+ server_status_window(ictx->wp->window);
}
/* Rename string started. */
diff --git a/screen.c b/screen.c
index 9db0f609..5aa30271 100644
--- a/screen.c
+++ b/screen.c
@@ -152,11 +152,16 @@ screen_set_cursor_colour(struct screen *s, const char *colour)
}
/* Set screen title. */
-void
+int
screen_set_title(struct screen *s, const char *title)
{
+ char *cp;
+
+ if (!utf8_isvalid(title))
+ return (0);
free(s->title);
- utf8_stravis(&s->title, title, VIS_OCTAL|VIS_CSTYLE|VIS_TAB|VIS_NL);
+ s->title = xstrdup(title);
+ return (1);
}
/* Set screen path. */
diff --git a/tmux.h b/tmux.h
index 418f0a44..bc4b0d6c 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2424,7 +2424,7 @@ void screen_free(struct screen *);
void screen_reset_tabs(struct screen *);
void screen_set_cursor_style(struct screen *, u_int);
void screen_set_cursor_colour(struct screen *, const char *);
-void screen_set_title(struct screen *, const char *);
+int screen_set_title(struct screen *, const char *);
void screen_set_path(struct screen *, const char *);
void screen_push_title(struct screen *);
void screen_pop_title(struct screen *);