mirror of
https://github.com/tmux/tmux.git
synced 2024-12-25 02:48:47 +00:00
If an application gives the first parameter to OSC 52, validate and pass
on to outside terminal. GitHub issue 3192.
This commit is contained in:
parent
c07d582e24
commit
ccc9dc3bb4
@ -77,7 +77,7 @@ cmd_load_buffer_done(__unused struct client *c, const char *path, int error,
|
|||||||
} else if (tc != NULL &&
|
} else if (tc != NULL &&
|
||||||
tc->session != NULL &&
|
tc->session != NULL &&
|
||||||
(~tc->flags & CLIENT_DEAD))
|
(~tc->flags & CLIENT_DEAD))
|
||||||
tty_set_selection(&tc->tty, copy, bsize);
|
tty_set_selection(&tc->tty, "", copy, bsize);
|
||||||
if (tc != NULL)
|
if (tc != NULL)
|
||||||
server_client_unref(tc);
|
server_client_unref(tc);
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ cmd_set_buffer_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
if (args_has(args, 'w') && tc != NULL)
|
if (args_has(args, 'w') && tc != NULL)
|
||||||
tty_set_selection(&tc->tty, bufdata, bufsize);
|
tty_set_selection(&tc->tty, "", bufdata, bufsize);
|
||||||
|
|
||||||
return (CMD_RETURN_NORMAL);
|
return (CMD_RETURN_NORMAL);
|
||||||
}
|
}
|
||||||
|
11
input.c
11
input.c
@ -2693,6 +2693,9 @@ input_osc_52(struct input_ctx *ictx, const char *p)
|
|||||||
int outlen, state;
|
int outlen, state;
|
||||||
struct screen_write_ctx ctx;
|
struct screen_write_ctx ctx;
|
||||||
struct paste_buffer *pb;
|
struct paste_buffer *pb;
|
||||||
|
const char* allow = "cpqs01234567";
|
||||||
|
char flags[sizeof allow] = "";
|
||||||
|
u_int i, j = 0;
|
||||||
|
|
||||||
if (wp == NULL)
|
if (wp == NULL)
|
||||||
return;
|
return;
|
||||||
@ -2707,6 +2710,12 @@ input_osc_52(struct input_ctx *ictx, const char *p)
|
|||||||
return;
|
return;
|
||||||
log_debug("%s: %s", __func__, end);
|
log_debug("%s: %s", __func__, end);
|
||||||
|
|
||||||
|
for (i = 0; p + i != end; i++) {
|
||||||
|
if (strchr(allow, p[i]) != NULL && strchr(flags, p[i]) == NULL)
|
||||||
|
flags[j++] = p[i];
|
||||||
|
}
|
||||||
|
log_debug("%s: %.*s %s", __func__, (int)(end - p - 1), p, flags);
|
||||||
|
|
||||||
if (strcmp(end, "?") == 0) {
|
if (strcmp(end, "?") == 0) {
|
||||||
if ((pb = paste_get_top(NULL)) != NULL)
|
if ((pb = paste_get_top(NULL)) != NULL)
|
||||||
buf = paste_buffer_data(pb, &len);
|
buf = paste_buffer_data(pb, &len);
|
||||||
@ -2728,7 +2737,7 @@ input_osc_52(struct input_ctx *ictx, const char *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
screen_write_start_pane(&ctx, wp, NULL);
|
screen_write_start_pane(&ctx, wp, NULL);
|
||||||
screen_write_setselection(&ctx, out, outlen);
|
screen_write_setselection(&ctx, flags, out, outlen);
|
||||||
screen_write_stop(&ctx);
|
screen_write_stop(&ctx);
|
||||||
notify_pane("pane-set-clipboard", wp);
|
notify_pane("pane-set-clipboard", wp);
|
||||||
|
|
||||||
|
@ -2085,12 +2085,14 @@ screen_write_overwrite(struct screen_write_ctx *ctx, struct grid_cell *gc,
|
|||||||
|
|
||||||
/* Set external clipboard. */
|
/* Set external clipboard. */
|
||||||
void
|
void
|
||||||
screen_write_setselection(struct screen_write_ctx *ctx, u_char *str, u_int len)
|
screen_write_setselection(struct screen_write_ctx *ctx, const char *flags,
|
||||||
|
u_char *str, u_int len)
|
||||||
{
|
{
|
||||||
struct tty_ctx ttyctx;
|
struct tty_ctx ttyctx;
|
||||||
|
|
||||||
screen_write_initctx(ctx, &ttyctx, 0);
|
screen_write_initctx(ctx, &ttyctx, 0);
|
||||||
ttyctx.ptr = str;
|
ttyctx.ptr = str;
|
||||||
|
ttyctx.ptr2 = (void *)flags;
|
||||||
ttyctx.num = len;
|
ttyctx.num = len;
|
||||||
|
|
||||||
tty_write(tty_cmd_setselection, &ttyctx);
|
tty_write(tty_cmd_setselection, &ttyctx);
|
||||||
|
6
tmux.h
6
tmux.h
@ -1421,6 +1421,7 @@ struct tty_ctx {
|
|||||||
|
|
||||||
u_int num;
|
u_int num;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
void *ptr2;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Cursor and region position before the screen was updated - this is
|
* Cursor and region position before the screen was updated - this is
|
||||||
@ -2278,7 +2279,7 @@ int tty_open(struct tty *, char **);
|
|||||||
void tty_close(struct tty *);
|
void tty_close(struct tty *);
|
||||||
void tty_free(struct tty *);
|
void tty_free(struct tty *);
|
||||||
void tty_update_features(struct tty *);
|
void tty_update_features(struct tty *);
|
||||||
void tty_set_selection(struct tty *, const char *, size_t);
|
void tty_set_selection(struct tty *, const char *, const char *, size_t);
|
||||||
void tty_write(void (*)(struct tty *, const struct tty_ctx *),
|
void tty_write(void (*)(struct tty *, const struct tty_ctx *),
|
||||||
struct tty_ctx *);
|
struct tty_ctx *);
|
||||||
void tty_cmd_alignmenttest(struct tty *, const struct tty_ctx *);
|
void tty_cmd_alignmenttest(struct tty *, const struct tty_ctx *);
|
||||||
@ -2872,7 +2873,8 @@ void screen_write_collect_end(struct screen_write_ctx *);
|
|||||||
void screen_write_collect_add(struct screen_write_ctx *,
|
void screen_write_collect_add(struct screen_write_ctx *,
|
||||||
const struct grid_cell *);
|
const struct grid_cell *);
|
||||||
void screen_write_cell(struct screen_write_ctx *, const struct grid_cell *);
|
void screen_write_cell(struct screen_write_ctx *, const struct grid_cell *);
|
||||||
void screen_write_setselection(struct screen_write_ctx *, u_char *, u_int);
|
void screen_write_setselection(struct screen_write_ctx *, const char *,
|
||||||
|
u_char *, u_int);
|
||||||
void screen_write_rawstring(struct screen_write_ctx *, u_char *, u_int);
|
void screen_write_rawstring(struct screen_write_ctx *, u_char *, u_int);
|
||||||
void screen_write_alternateon(struct screen_write_ctx *,
|
void screen_write_alternateon(struct screen_write_ctx *,
|
||||||
struct grid_cell *, int);
|
struct grid_cell *, int);
|
||||||
|
9
tty.c
9
tty.c
@ -671,7 +671,7 @@ static void
|
|||||||
tty_force_cursor_colour(struct tty *tty, int c)
|
tty_force_cursor_colour(struct tty *tty, int c)
|
||||||
{
|
{
|
||||||
u_char r, g, b;
|
u_char r, g, b;
|
||||||
char s[13] = "";
|
char s[13];
|
||||||
|
|
||||||
if (c != -1)
|
if (c != -1)
|
||||||
c = colour_force_rgb(c);
|
c = colour_force_rgb(c);
|
||||||
@ -2082,11 +2082,12 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx)
|
|||||||
void
|
void
|
||||||
tty_cmd_setselection(struct tty *tty, const struct tty_ctx *ctx)
|
tty_cmd_setselection(struct tty *tty, const struct tty_ctx *ctx)
|
||||||
{
|
{
|
||||||
tty_set_selection(tty, ctx->ptr, ctx->num);
|
tty_set_selection(tty, ctx->ptr2, ctx->ptr, ctx->num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tty_set_selection(struct tty *tty, const char *buf, size_t len)
|
tty_set_selection(struct tty *tty, const char *flags, const char *buf,
|
||||||
|
size_t len)
|
||||||
{
|
{
|
||||||
char *encoded;
|
char *encoded;
|
||||||
size_t size;
|
size_t size;
|
||||||
@ -2101,7 +2102,7 @@ tty_set_selection(struct tty *tty, const char *buf, size_t len)
|
|||||||
|
|
||||||
b64_ntop(buf, len, encoded, size);
|
b64_ntop(buf, len, encoded, size);
|
||||||
tty->flags |= TTY_NOBLOCK;
|
tty->flags |= TTY_NOBLOCK;
|
||||||
tty_putcode_ptr2(tty, TTYC_MS, "", encoded);
|
tty_putcode_ptr2(tty, TTYC_MS, flags, encoded);
|
||||||
|
|
||||||
free(encoded);
|
free(encoded);
|
||||||
}
|
}
|
||||||
|
@ -4570,7 +4570,7 @@ window_copy_copy_buffer(struct window_mode_entry *wme, const char *prefix,
|
|||||||
|
|
||||||
if (options_get_number(global_options, "set-clipboard") != 0) {
|
if (options_get_number(global_options, "set-clipboard") != 0) {
|
||||||
screen_write_start_pane(&ctx, wp, NULL);
|
screen_write_start_pane(&ctx, wp, NULL);
|
||||||
screen_write_setselection(&ctx, buf, len);
|
screen_write_setselection(&ctx, "", buf, len);
|
||||||
screen_write_stop(&ctx);
|
screen_write_stop(&ctx);
|
||||||
notify_pane("pane-set-clipboard", wp);
|
notify_pane("pane-set-clipboard", wp);
|
||||||
}
|
}
|
||||||
@ -4644,7 +4644,7 @@ window_copy_append_selection(struct window_mode_entry *wme)
|
|||||||
|
|
||||||
if (options_get_number(global_options, "set-clipboard") != 0) {
|
if (options_get_number(global_options, "set-clipboard") != 0) {
|
||||||
screen_write_start_pane(&ctx, wp, NULL);
|
screen_write_start_pane(&ctx, wp, NULL);
|
||||||
screen_write_setselection(&ctx, buf, len);
|
screen_write_setselection(&ctx, "", buf, len);
|
||||||
screen_write_stop(&ctx);
|
screen_write_stop(&ctx);
|
||||||
notify_pane("pane-set-clipboard", wp);
|
notify_pane("pane-set-clipboard", wp);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user