From c8bcce83d5499ef8e565b59ddcc9803919a3b371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 12 Jan 2021 14:45:41 +0100 Subject: [PATCH] =?UTF-8?q?selection:=20add=20a=20=E2=80=98finish=E2=80=99?= =?UTF-8?q?=20function,=20called=20at=20the=20end=20of=20receiving=20clipb?= =?UTF-8?q?oard=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is necessary to decode the final URI in a text/uri-list offer if it hasn’t been newline terminated. --- selection.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/selection.c b/selection.c index 03ee85da..b9b086a8 100644 --- a/selection.c +++ b/selection.c @@ -1422,6 +1422,7 @@ struct clipboard_receive { struct itimerspec timeout; void (*decoder)(struct clipboard_receive *ctx, char *data, size_t size); + void (*finish)(struct clipboard_receive *ctx); /* URI state */ bool add_space; @@ -1479,6 +1480,11 @@ fdm_receive_decoder_plain(struct clipboard_receive *ctx, char *data, size_t size ctx->cb(data, size, ctx->user); } +static void +fdm_receive_finish_plain(struct clipboard_receive *ctx) +{ +} + static bool decode_one_uri(struct clipboard_receive *ctx, char *uri, size_t len) { @@ -1534,6 +1540,14 @@ fdm_receive_decoder_uri(struct clipboard_receive *ctx, char *data, size_t size) ctx->buf.idx = left; } +static void +fdm_receive_finish_uri(struct clipboard_receive *ctx) +{ + LOG_DBG("finish: %.*s", (int)ctx->buf.idx, ctx->buf.data); + if (ctx->buf.idx > 0) + decode_one_uri(ctx, ctx->buf.data, ctx->buf.idx); +} + static bool fdm_receive(struct fdm *fdm, int fd, int events, void *data) { @@ -1584,6 +1598,7 @@ fdm_receive(struct fdm *fdm, int fd, int events, void *data) } done: + ctx->finish(ctx); clipboard_receive_done(fdm, ctx); return true; } @@ -1625,6 +1640,9 @@ begin_receive_clipboard(struct terminal *term, int read_fd, .decoder = (mime_type == DATA_OFFER_MIME_URI_LIST ? &fdm_receive_decoder_uri : &fdm_receive_decoder_plain), + .finish = (mime_type == DATA_OFFER_MIME_URI_LIST + ? &fdm_receive_finish_uri + : &fdm_receive_finish_plain), .cb = cb, .done = done, .user = user, @@ -1666,6 +1684,9 @@ text_from_clipboard(struct seat *seat, struct terminal *term, return; } + LOG_DBG("receive from clipboard: mime-type=%s", + mime_type_map[clipboard->mime_type]); + int read_fd = fds[0]; int write_fd = fds[1]; @@ -1810,6 +1831,9 @@ text_from_primary( return; } + LOG_DBG("receive from primary: mime-type=%s", + mime_type_map[primary->mime_type]); + int read_fd = fds[0]; int write_fd = fds[1];