From c9662de55d78baa82dfcac1afab170a0d8e4f163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sat, 30 Jan 2016 20:15:30 +0100 Subject: Implement system clipboard registers "* and "+ Both registers are currently treated identically. The actual system integration is performed by two shell scripts vis-copy and vis-paste. --- register.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 4 deletions(-) (limited to 'register.c') diff --git a/register.c b/register.c index 30e4c58..a15e8b3 100644 --- a/register.c +++ b/register.c @@ -1,20 +1,56 @@ #include #include -#include "register.h" -#include "buffer.h" +#include "vis.h" #include "text.h" #include "util.h" +#include "register.h" + +typedef struct { + Buffer *stdout; + Buffer *stderr; +} Clipboard; + +static ssize_t read_stdout(void *context, char *data, size_t len) { + Buffer *buf = ((Clipboard*)context)->stdout; + buffer_append(buf, data, len); + return len; +} + +static ssize_t read_stderr(void *context, char *data, size_t len) { + Buffer *buf = ((Clipboard*)context)->stderr; + buffer_append(buf, data, len); + return len; +} void register_release(Register *reg) { buffer_release(®->buf); } -const char *register_get(Register *reg, size_t *len) { +const char *register_get(Vis *vis, Register *reg, size_t *len) { switch (reg->type) { case REGISTER_NORMAL: *len = reg->buf.len; return reg->buf.data; + case REGISTER_CLIPBOARD: + { + Buffer stderr; + buffer_init(&stderr); + buffer_clear(®->buf); + Clipboard clipboard = { + .stdout = ®->buf, + .stderr = &stderr, + }; + + int status = vis_pipe(vis, &clipboard, + &(Filerange){ .start = 0, .end = 0 }, + (const char*[]){ "vis-paste", "vis-paste", NULL }, + read_stdout, read_stderr); + if (status != 0) + vis_info_show(vis, "Command failed %s", stderr.len > 0 ? stderr.data : ""); + *len = reg->buf.len; + return reg->buf.data; + } case REGISTER_BLACKHOLE: default: *len = 0; @@ -22,7 +58,7 @@ const char *register_get(Register *reg, size_t *len) { } } -bool register_put(Register *reg, Text *txt, Filerange *range) { +bool register_put(Vis *vis, Register *reg, Text *txt, Filerange *range) { switch (reg->type) { case REGISTER_NORMAL: { @@ -32,6 +68,22 @@ bool register_put(Register *reg, Text *txt, Filerange *range) { reg->buf.len = text_bytes_get(txt, range->start, len, reg->buf.data); return true; } + case REGISTER_CLIPBOARD: + { + Buffer stderr; + buffer_init(&stderr); + Clipboard clipboard = { + .stderr = &stderr, + }; + + int status = vis_pipe(vis, &clipboard, range, + (const char*[]){ "vis-copy", "vis-copy", NULL }, + NULL, read_stderr); + + if (status != 0) + vis_info_show(vis, "Command failed %s", stderr.len > 0 ? stderr.data : ""); + return status == 0; + } case REGISTER_BLACKHOLE: return true; default: -- cgit v1.2.3