racket/gui: implement set-clipboard-bitmap' in clipboard<%>'

Closes PR 12689

Cocoa implementation provided by Jens Axel Søgaard

original commit: 58db5f8b46bc8e9603a1557c1804a8a87e70b1c4
This commit is contained in:
Matthew Flatt 2012-05-26 19:08:11 -06:00
parent af300b7857
commit 3078c04c20
4 changed files with 31 additions and 3 deletions

View File

@ -100,4 +100,14 @@
(let ([i (tell (tell NSImage alloc) (let ([i (tell (tell NSImage alloc)
initWithPasteboard: (tell NSPasteboard generalPasteboard))]) initWithPasteboard: (tell NSPasteboard generalPasteboard))])
(and i (and i
(image->bitmap i))))))) (image->bitmap i))))))
(define/public (set-bitmap-data bm timestamp)
(define image (bitmap->image bm))
(atomically
(with-autorelease
(let ([pasteboard (tell NSPasteboard generalPasteboard)])
(tell pasteboard clearContents)
(let ([copied-objects (tell NSArray arrayWithObject: image)])
(tell pasteboard writeObjects: copied-objects)
(void)))))))

View File

@ -1,5 +1,6 @@
#lang racket/base #lang racket/base
(require racket/class (require racket/class
(only-in racket/draw bitmap%)
"../../syntax.rkt" "../../syntax.rkt"
"../platform.rkt" "../platform.rkt"
"local.rkt" "local.rkt"
@ -61,7 +62,8 @@
(def/public (get-clipboard-bitmap [exact-integer? timestamp]) (def/public (get-clipboard-bitmap [exact-integer? timestamp])
(send driver get-bitmap-data)) (send driver get-bitmap-data))
(def/public-unimplemented set-clipboard-bitmap) (def/public (set-clipboard-bitmap [bitmap% bm] [exact-integer? timestamp])
(send driver set-bitmap-data bm timestamp))
(def/public (get-clipboard-data [string? type] (def/public (get-clipboard-data [string? type]
[exact-integer? timestamp]) [exact-integer? timestamp])
(send driver get-data type)) (send driver get-data type))

View File

@ -127,6 +127,8 @@
(_fun _GtkClipboard (_fpointer = string_request_received) _pointer -> _void)) (_fun _GtkClipboard (_fpointer = string_request_received) _pointer -> _void))
(define-gtk gtk_clipboard_request_image (define-gtk gtk_clipboard_request_image
(_fun _GtkClipboard (_fpointer = image_request_received) _pointer -> _void)) (_fun _GtkClipboard (_fpointer = image_request_received) _pointer -> _void))
(define-gtk gtk_clipboard_set_image
(_fun _GtkClipboard _GdkPixbuf -> _void))
;; ---------------------------------------- ;; ----------------------------------------
@ -295,6 +297,10 @@
(let-values ([(l backref) (make-request-backref)]) (let-values ([(l backref) (make-request-backref)])
(gtk_clipboard_request_image cb backref) (gtk_clipboard_request_image cb backref)
l)))) l))))
(define/public (set-bitmap-data bm timestamp)
(define pb (bitmap->pixbuf bm))
(gtk_clipboard_set_image cb pb))
(super-new)) (super-new))

View File

@ -196,7 +196,17 @@
(begin0 (begin0
(get-bitmap-from-clipboard) (get-bitmap-from-clipboard)
(CloseClipboard))))) (CloseClipboard)))))
(define/public (set-bitmap-data bm timestamp)
(define h (bitmap->hbitmap bm))
(set-cpointer-tag! h '(HBITMAP HANDLE))
(atomically
(when (OpenClipboard clipboard-owner-hwnd)
(EmptyClipboard)
(SetClipboardData CF_BITMAP h)
(CloseClipboard)
(void))))
(super-new)) (super-new))