diff options
author | nicm <nicm> | 2023-02-05 21:15:32 +0000 |
---|---|---|
committer | nicm <nicm> | 2023-02-05 21:15:32 +0000 |
commit | 93b1b781504f8de30f1858a4d0cf013396143c53 (patch) | |
tree | db08d6daad277090c8763a1689f3f11591795123 /server-client.c | |
parent | f10854cfc5e43f646b02b3031bfc4bc3f5f6c513 (diff) |
Extend display-message to work for control clients. GitHub issue 3449.
Diffstat (limited to 'server-client.c')
-rw-r--r-- | server-client.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/server-client.c b/server-client.c index f0d1d538..1c927bb5 100644 --- a/server-client.c +++ b/server-client.c @@ -29,6 +29,7 @@ #include <string.h> #include <time.h> #include <unistd.h> +#include <vis.h> #include "tmux.h" @@ -3239,3 +3240,69 @@ server_client_remove_pane(struct window_pane *wp) } } } + +/* Print to a client. */ +void +server_client_print(struct client *c, int parse, struct evbuffer *evb) +{ + void *data = EVBUFFER_DATA(evb); + size_t size = EVBUFFER_LENGTH(evb); + struct window_pane *wp; + struct window_mode_entry *wme; + char *sanitized, *msg, *line; + + if (!parse) { + utf8_stravisx(&msg, data, size, + VIS_OCTAL|VIS_CSTYLE|VIS_NOSLASH); + log_debug("%s: %s", __func__, msg); + } else { + msg = EVBUFFER_DATA(evb); + if (msg[size - 1] != '\0') + evbuffer_add(evb, "", 1); + } + + if (c == NULL) + goto out; + + if (c->session == NULL || (c->flags & CLIENT_CONTROL)) { + if (~c->flags & CLIENT_UTF8) { + sanitized = utf8_sanitize(msg); + if (c->flags & CLIENT_CONTROL) + control_write(c, "%s", sanitized); + else + file_print(c, "%s\n", sanitized); + free(sanitized); + } else { + if (c->flags & CLIENT_CONTROL) + control_write(c, "%s", msg); + else + file_print(c, "%s\n", msg); + } + goto out; + } + + wp = server_client_get_pane(c); + wme = TAILQ_FIRST(&wp->modes); + if (wme == NULL || wme->mode != &window_view_mode) + window_pane_set_mode(wp, NULL, &window_view_mode, NULL, NULL); + if (parse) { + do { + line = evbuffer_readln(evb, NULL, EVBUFFER_EOL_LF); + if (line != NULL) { + window_copy_add(wp, 1, "%s", line); + free(line); + } + } while (line != NULL); + + size = EVBUFFER_LENGTH(evb); + if (size != 0) { + line = EVBUFFER_DATA(evb); + window_copy_add(wp, 1, "%.*s", (int)size, line); + } + } else + window_copy_add(wp, 0, "%s", msg); + +out: + if (!parse) + free(msg); +} |