(module clipboard mzscheme
(require (lib "etc.ss")
(lib "class.ss")
(lib "mred.ss" "mred")
(lib "contract.ss")
"../rope.ss")
(define last-remembered-clip #f)
(define last-remembered-clip-id #f)
(define (get-clipboard-content)
(local ((define str/false
(send the-clipboard get-clipboard-string 0)))
(cond
[(not str/false)
#f]
[(and last-remembered-clip-id
(string=? str/false last-remembered-clip-id))
last-remembered-clip]
[else
(string->rope str/false)])))
(define (set-clipboard-content a-rope)
(when a-rope
(set! last-remembered-clip a-rope)
(cond [(rope-has-special? a-rope)
(set! last-remembered-clip-id
(format "~a~n~nclipboard-id-for-special-content-~a"
(rope->string/erasing-specials a-rope)
(random)))
(send the-clipboard set-clipboard-string
last-remembered-clip-id
0)]
[else
(set! last-remembered-clip #f)
(set! last-remembered-clip-id #f)
(send the-clipboard set-clipboard-string
(rope->string a-rope)
0)])))
(provide/contract [get-clipboard-content
(-> (or/c rope? false/c))]
[set-clipboard-content
((or/c rope? false/c) . -> . any)]))