diff --git a/source/clog-navigator.lisp b/source/clog-navigator.lisp index b6d4a0a..81d2c86 100644 --- a/source/clog-navigator.lisp +++ b/source/clog-navigator.lisp @@ -62,3 +62,35 @@ (defmethod vendor ((obj clog-navigator)) (query obj "vendor")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; system-clipboard-write ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defgeneric system-clipboard-write (clog-obj text) + (:documentation "Write text to system clipboard")) + +(defmethod system-clipboard-write ((obj clog-obj) text) + (js-execute obj (format nil "navigator.clipboard.writeText('~A')" + (escape-string text)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; system-clipboard-read ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defgeneric system-clipboard-read (clog-obj &key wait-timeout) + (:documentation "Read text from system clipboard and return text.")) + +(defmethod system-clipboard-read ((obj clog-obj) &key (wait-timeout 1)) + (let ((doc (html-document (connection-body obj))) + (sem (bordeaux-threads:make-semaphore)) + ret) + (flet ((on-data (obj data) + (declare (ignore obj)) + (bordeaux-threads:signal-semaphore sem) + (setf ret data))) + (set-on-event-with-data doc "on-clip-data" #'on-data :one-time t) + (js-execute obj "navigator.clipboard.readText().then(function(text) {~ + $(clog['document']).trigger('on-clip-data', text)})") + (bordeaux-threads:wait-on-semaphore sem :timeout wait-timeout) + ret))) diff --git a/source/clog.lisp b/source/clog.lisp index ae068f6..bf328cc 100644 --- a/source/clog.lisp +++ b/source/clog.lisp @@ -922,7 +922,11 @@ embedded in a native template application.)" (cookie-enabled-p generic-function) (language generic-function) (user-agent generic-function) - (vendor generic-function)) + (vendor generic-function) + + "CLOG-Navigator - Clipboard" + (system-clipboard-write generic-function) + (system-clipboard-read generic-function)) (defsection @clog-location (:title "CLOG Location Objects") "Clog-Location - CLOG Location Objects"