From 911155a862761a48ac977759f9d76ae3ff770f91 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Mon, 27 Jul 2020 22:38:54 +0200 Subject: [PATCH] [clipboard] Added "ui.clipboard_file" to add text to the system clipboard. ui.clipboard_file is filename of the clipboard file. This file can be a named pipe. See contrib/clipboard/clip.sh how to set up copying to clipboard using socat and xclip. Just run clip.sh (it will be running in a loop) before starting elinks and set ui.clipboard_file = "~/.elinks/clipboard.fifo". --- contrib/clipboard/clip.sh | 8 ++++++++ src/config/options.inc | 4 ++++ src/osdep/osdep.c | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100755 contrib/clipboard/clip.sh diff --git a/contrib/clipboard/clip.sh b/contrib/clipboard/clip.sh new file mode 100755 index 00000000..9398f98d --- /dev/null +++ b/contrib/clipboard/clip.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +trap exit SIGTERM SIGINT + +while true +do + socat -u PIPE:$HOME/.elinks/clipboard.fifo EXEC:"xclip -sel clip" +done diff --git a/src/config/options.inc b/src/config/options.inc index a31ee5ce..b77b7add 100644 --- a/src/config/options.inc +++ b/src/config/options.inc @@ -1459,6 +1459,10 @@ static union option_info config_options_info[] = { N_("Keep the session active even if the last terminal " "exits.")), + INIT_OPT_STRING("ui", N_("Clipboard file"), + "clipboard_file", 0, "", + N_("Filename of the clipboard file.")), + #ifdef HAVE_STRFTIME INIT_OPT_STRING("ui", N_("Date format"), "date_format", 0, "%b %e %H:%M", diff --git a/src/osdep/osdep.c b/src/osdep/osdep.c index b355d5d1..934e14b7 100644 --- a/src/osdep/osdep.c +++ b/src/osdep/osdep.c @@ -67,11 +67,13 @@ #include "elinks.h" +#include "config/options.h" #include "main/select.h" #include "osdep/osdep.h" #include "osdep/signals.h" #include "terminal/terminal.h" #include "util/conv.h" +#include "util/file.h" #include "util/memory.h" #include "util/string.h" @@ -403,6 +405,26 @@ get_clipboard_text(void) void set_clipboard_text(unsigned char *data) { + unsigned char *f = get_opt_str("ui.clipboard_file", NULL); + + if (f && *f) { + unsigned char *filename = expand_tilde(f); + + if (filename) { +#ifdef HAVE_ACCESS + if (access(filename, W_OK) >= 0) { + FILE *out = fopen(filename, "a"); + + if (out) { + fputs(data, out); + fclose(out); + } + } +#endif + mem_free(filename); + } + } + /* GNU Screen's clipboard */ if (is_gnuscreen()) { struct string str;