From 826423c7d7cc4f9965269466fe1de046ba9e2e0f Mon Sep 17 00:00:00 2001
From: cage <cage@invalid>
Date: Fri, 4 Mar 2022 14:33:55 +0100
Subject: [PATCH] - added command to copy a link to clipboard.

---
 README.org            | 10 +++++---
 README.txt            |  9 +++++--
 etc/init.lisp         |  2 ++
 quick_quicklisp.sh.in | 57 ++++++++++++++++++++++---------------------
 src/package.lisp      |  1 +
 src/ui-goodies.lisp   |  8 ++++++
 tinmop.asd            |  1 +
 7 files changed, 55 insertions(+), 33 deletions(-)

diff --git a/README.org b/README.org
index 8ddeb03..d2b02b6 100644
--- a/README.org
+++ b/README.org
@@ -55,9 +55,8 @@ All  the dependencies  above  should be  available  using the  package
 manager of your distribution (~apt~, ~yum~ etc).
 
 ** Lisp Libraries
-
    - alexandria;
-   - cl-ppcre;
+   - cl-ppcre-unicode;
    - tooter;
    - croatoan;
    - osicat;
@@ -79,7 +78,12 @@ manager of your distribution (~apt~, ~yum~ etc).
    - cl-html5-parser;
    - unix-opts;
    - crypto-shortcuts;
-   - drakma.
+   - drakma;
+   - usocket;
+   - cffi;
+   - babel;
+   - percent-encoding;
+   - trivial-clipboard.
 
    All these libraries  will be downloaded, compiled  and installed by
    the script ~quick_quicklisp.sh~, see below.
diff --git a/README.txt b/README.txt
index b8e7de3..a454a53 100644
--- a/README.txt
+++ b/README.txt
@@ -100,7 +100,7 @@ Table of Contents
 ──────────────────
 
   • alexandria;
-  • cl-ppcre;
+  • cl-ppcre-unicode;
   • tooter;
   • croatoan;
   • osicat;
@@ -122,7 +122,12 @@ Table of Contents
   • cl-html5-parser;
   • unix-opts;
   • crypto-shortcuts;
-  • drakma.
+  • drakma;
+  • usocket;
+  • cffi;
+  • babel;
+  • percent-encoding;
+  • trivial-clipboard.
 
   All these libraries will be downloaded, compiled and installed by the
   script `quick_quicklisp.sh', see below.
diff --git a/etc/init.lisp b/etc/init.lisp
index 3f1b447..1f57d14 100644
--- a/etc/init.lisp
+++ b/etc/init.lisp
@@ -595,6 +595,8 @@
 
 (define-key "C-J"       #'open-message-link-perform-opening             *open-message-link-keymap*)
 
+(define-key "C-c"       #'copy-link-to-clipboard                        *open-message-link-keymap*)
+
 (define-key "up"        #'open-message-link-go-up                       *open-message-link-keymap*)
 
 (define-key "down"      #'open-message-link-go-down                     *open-message-link-keymap*)
diff --git a/quick_quicklisp.sh.in b/quick_quicklisp.sh.in
index b536ffb..d506ba1 100644
--- a/quick_quicklisp.sh.in
+++ b/quick_quicklisp.sh.in
@@ -115,34 +115,35 @@ install_dependency () {
     #  --eval "(ql:quickload \"swank\")" \ <- note the '\'
     #  --eval "(sb-ext:quit)";             <- keep this line as latest
     @LISP_COMPILER@  \
-     --eval "(ql:quickload \"alexandria\")"       \
-     --eval "(ql:quickload \"cl-ppcre-unicode\")" \
-     --eval "(ql:quickload \"tooter\")"           \
-     --eval "(ql:quickload \"croatoan\")"         \
-     --eval "(ql:quickload \"osicat\")"           \
-     --eval "(ql:quickload \"cl-spark\")"         \
-     --eval "(ql:quickload \"access\")"           \
-     --eval "(ql:quickload \"sqlite\")"           \
-     --eval "(ql:quickload \"sxql\")"             \
-     --eval "(ql:quickload \"sxql-composer\")"    \
-     --eval "(ql:quickload \"marshal\")"          \
-     --eval "(ql:quickload \"bordeaux-threads\")" \
-     --eval "(ql:quickload \"log4cl\")"           \
-     --eval "(ql:quickload \"local-time\")"       \
-     --eval "(ql:quickload \"cl-colors2\")"       \
-     --eval "(ql:quickload \"cl-i18n\")"          \
-     --eval "(ql:quickload \"clunit2\")"          \
-     --eval "(ql:quickload \"esrap\")"            \
-     --eval "(ql:quickload \"ieee-floats\")"      \
-     --eval "(ql:quickload \"parse-number\")"     \
-     --eval "(ql:quickload \"cl-html5-parser\")"  \
-     --eval "(ql:quickload \"unix-opts\")"        \
-     --eval "(ql:quickload \"crypto-shortcuts\")" \
-     --eval "(ql:quickload \"drakma\")"           \
-     --eval "(ql:quickload \"usocket\")"          \
-     --eval "(ql:quickload \"cffi\")"             \
-     --eval "(ql:quickload \"babel\")"            \
-     --eval "(ql:quickload \"percent-encoding\")" \
+     --eval "(ql:quickload \"alexandria\")"        \
+     --eval "(ql:quickload \"cl-ppcre-unicode\")"  \
+     --eval "(ql:quickload \"tooter\")"            \
+     --eval "(ql:quickload \"croatoan\")"          \
+     --eval "(ql:quickload \"osicat\")"            \
+     --eval "(ql:quickload \"cl-spark\")"          \
+     --eval "(ql:quickload \"access\")"            \
+     --eval "(ql:quickload \"sqlite\")"            \
+     --eval "(ql:quickload \"sxql\")"              \
+     --eval "(ql:quickload \"sxql-composer\")"     \
+     --eval "(ql:quickload \"marshal\")"           \
+     --eval "(ql:quickload \"bordeaux-threads\")"  \
+     --eval "(ql:quickload \"log4cl\")"            \
+     --eval "(ql:quickload \"local-time\")"        \
+     --eval "(ql:quickload \"cl-colors2\")"        \
+     --eval "(ql:quickload \"cl-i18n\")"           \
+     --eval "(ql:quickload \"clunit2\")"           \
+     --eval "(ql:quickload \"esrap\")"             \
+     --eval "(ql:quickload \"ieee-floats\")"       \
+     --eval "(ql:quickload \"parse-number\")"      \
+     --eval "(ql:quickload \"cl-html5-parser\")"   \
+     --eval "(ql:quickload \"unix-opts\")"         \
+     --eval "(ql:quickload \"crypto-shortcuts\")"  \
+     --eval "(ql:quickload \"drakma\")"            \
+     --eval "(ql:quickload \"usocket\")"           \
+     --eval "(ql:quickload \"cffi\")"              \
+     --eval "(ql:quickload \"babel\")"             \
+     --eval "(ql:quickload \"percent-encoding\")"  \
+     --eval "(ql:quickload \"trivial-clipboard\")" \
      --eval "(sb-ext:quit)"
 }
 
diff --git a/src/package.lisp b/src/package.lisp
index 215dee4..a57b510 100644
--- a/src/package.lisp
+++ b/src/package.lisp
@@ -2709,6 +2709,7 @@
    :open-next-visible-link
    :go-to-next-link
    :go-to-previous-link
+   :copy-link-to-clipboard
    :close-open-message-link-window
    :open-message-link-window-scroll-begin
    :open-message-link-window-scroll-end
diff --git a/src/ui-goodies.lisp b/src/ui-goodies.lisp
index 8624b89..a62487f 100644
--- a/src/ui-goodies.lisp
+++ b/src/ui-goodies.lisp
@@ -1357,6 +1357,14 @@ This makes sense only for gemini file stream, if not this command performs the s
 'open-message-link-perform-opening'"
   (%open-message-link-perform-opening t))
 
+(defun copy-link-to-clipboard ()
+  "Copy the selected link address to clipboard"
+  (when-let* ((selected-line (line-oriented-window:selected-row *open-message-link-window*))
+              (url           (line-oriented-window:normal-text selected-line)))
+    (with-notify-errors
+      (trivial-clipboard:text url)
+      (info-message (_ "Address copied to clipboard")))))
+
 (defun close-open-message-link-window ()
   (when-window-shown (*open-message-link-window*)
     (when (message-window:display-gemini-text-p *open-message-link-window*)
diff --git a/tinmop.asd b/tinmop.asd
index 3b92a64..fc998f5 100644
--- a/tinmop.asd
+++ b/tinmop.asd
@@ -51,6 +51,7 @@
                :usocket
                :babel
                :percent-encoding
+               :trivial-clipboard
                :uiop)
   :components ((:file "package")
                (:file "idn")