Я пишу небольшой инструмент в clojure и хочу знать, когда в буфере обмена произошли изменения. Вот упрощенная версия того, что происходит.clojure (add-watch) не сообщается, когда изменения сделаны в буфере обмена
(:import java.awt.Toolkit)
(:import (java.awt.datatransfer Clipboard
ClipboardOwner
Transferable
StringSelection
DataFlavor
FlavorListener))
(defn get-clipboard [] (. (Toolkit/getDefaultToolkit)
(getSystemClipboard)))
(defn get-content []
(.getContents (get-clipboard) nil))
(def content (agent (get-content)))
(defn watch [key f]
(add-watch content key f))
(defn -main []
(while (not= content "banana-man")
(watch :watcher
(fn [key agent old-state new-state]
(prn "-- agent Changed --")
(prn "key" key)
(prn "atom" agent)
(prn "old-state" old-state)
(prn "new-state" new-state)))))
Я добавил в цикл while, чтобы немедленно отключить основную функцию.
Это выполняется без каких-либо ошибок, но не сообщает о внесении изменений в буфер обмена или прекращении цикла while при копировании bannan-man в буфер обмена. Я боролся с этим в течение нескольких недель, и я уверен, что я пропустил что-то простое. Если у кого-нибудь есть совет, я бы очень признателен!
Спасибо за ваше время Noisemith, – Sawin
Извините, преждевременно нажмите enter. Я довольно новичок в clojure и программировании в целом, поэтому извиняюсь за любые неэффективные методы, которые я использовал в своем примере. И спасибо за ваше предложение! Но я должен спросить, нет ли способа вернуть функцию add-watch новое состояние без активной отправки для контента? Чтобы быть ясным, я нацелен на то, что пользователь сканирует документ на текст ctrl-c, который будет автоматически вытащен из буфера обмена и обработан для просмотра пользователем позже. У меня есть чувство, что ваше предложение - лучший вариант, но я просто хотел проверить. Еще раз спасибо! – Sawin
Не то, чтобы это было неэффективно - это было бы на самом деле ничего не делать. Агент изменяется только в том случае, если вы вызываете 'send' или' send-off'. Он не является автономным. И наблюдатель только срабатывает, если агент меняется - он еще менее автономный. Вам нужно * что-то *, которое многократно проверяет состояние буфера обмена в цикле. Я думаю, что проще в явном виде включить это действие в цикл. – noisesmith