windows fixes

This commit is contained in:
Matthew Flatt 2010-07-29 16:56:58 -06:00
parent 4134b06b4c
commit e0bbe944aa
10 changed files with 66 additions and 22 deletions

View File

@ -69,7 +69,7 @@
(CGContextScaleCTM cg 1 -1) (CGContextScaleCTM cg 1 -1)
(CGContextTranslateCTM cg (- old-dx) (- old-dy)) (CGContextTranslateCTM cg (- old-dx) (- old-dy))
(set-bounds dx dy width height) (set-bounds dx dy width height)
(reset-cr)) (reset-cr cr))
(def/override (get-size) (def/override (get-size)
(values (exact->inexact clip-width) (values (exact->inexact clip-width)

View File

@ -85,7 +85,7 @@
[gl-config #f]) [gl-config #f])
(inherit get-gtk set-size get-size get-client-size (inherit get-gtk set-size get-size get-client-size
on-size register-as-child) on-size register-as-child get-top-win)
(define client-gtk (gtk_drawing_area_new)) (define client-gtk (gtk_drawing_area_new))
(define-values (gtk hscroll-adj vscroll-adj hscroll-gtk vscroll-gtk resize-box) (define-values (gtk hscroll-adj vscroll-adj hscroll-gtk vscroll-gtk resize-box)
@ -134,7 +134,8 @@
(let ([w (box 0)] (let ([w (box 0)]
[h (box 0)]) [h (box 0)])
(get-client-size w h) (get-client-size w h)
(values (unbox w) (unbox h))))])) (values (unbox w) (unbox h))))]
[window-lock (send (get-top-win) get-dc-lock)]))
(gtk_widget_realize gtk) (gtk_widget_realize gtk)
(gtk_widget_realize client-gtk) (gtk_widget_realize client-gtk)

View File

@ -20,7 +20,9 @@
(define dc-backend% (define dc-backend%
(class default-dc-backend% (class default-dc-backend%
(init-field gtk (init-field gtk
get-client-size) get-client-size
window-lock)
(inherit reset-cr)
(define c #f) (define c #f)
@ -28,8 +30,21 @@
(or c (or c
(let ([w (g_object_get_window gtk)]) (let ([w (g_object_get_window gtk)])
(and w (and w
(begin
;; Under Windows, creating a Cairo context within
;; a frame inteferes with any other Cairo context
;; within the same frame. So we use a lock to
;; serialize drawing to different contexts.
(when window-lock (semaphore-wait window-lock))
(set! c (gdk_cairo_create w)) (set! c (gdk_cairo_create w))
c)))) (reset-cr c)
c)))))
(define/override (release-cr cr)
(when window-lock
(cairo_destroy c)
(set! c #f)
(semaphore-post window-lock)))
(define/public (reset-dc) (define/public (reset-dc)
;; FIXME: ensure that the dc is not in use ;; FIXME: ensure that the dc is not in use

View File

@ -124,6 +124,11 @@
(define/public (enforce-size min-x min-y max-x max-y inc-x inc-y) (define/public (enforce-size min-x min-y max-x max-y inc-x inc-y)
(void)) (void))
(define/override (get-top-win) this)
(define dc-lock (and (eq? 'windows (system-type)) (make-semaphore 1)))
(define/public (get-dc-lock) dc-lock)
(define/override (center dir wrt) (define/override (center dir wrt)
(let ([w-box (box 0)] (let ([w-box (box 0)]
[h-box (box 0)] [h-box (box 0)]

View File

@ -18,6 +18,8 @@
(define-gtk gtk_menu_item_new_with_mnemonic (_fun _string -> _GtkWidget)) (define-gtk gtk_menu_item_new_with_mnemonic (_fun _string -> _GtkWidget))
(define-gtk gtk_menu_item_set_submenu (_fun _GtkWidget (_or-null _GtkWidget) -> _void)) (define-gtk gtk_menu_item_set_submenu (_fun _GtkWidget (_or-null _GtkWidget) -> _void))
(define-gtk gtk_container_remove (_fun _GtkWidget _GtkWidget -> _void)) (define-gtk gtk_container_remove (_fun _GtkWidget _GtkWidget -> _void))
(define-gtk gtk_label_set_text_with_mnemonic (_fun _GtkWidget _string -> _void))
(define-gtk gtk_bin_get_child (_fun _GtkWidget -> _GtkWidget))
(define (fixup-mneumonic title) (define (fixup-mneumonic title)
(regexp-replace* (regexp-replace*
@ -56,7 +58,12 @@
(define/public (get-top-window) (define/public (get-top-window)
top-wx) top-wx)
(def/public-unimplemented set-label-top) (define/public (set-label-top pos str)
(let ([l (list-ref menus pos)])
(let ([item-gtk (car l)])
(gtk_label_set_text_with_mnemonic (gtk_bin_get_child item-gtk)
(fixup-mneumonic str)))))
(def/public-unimplemented number) (def/public-unimplemented number)
(def/public-unimplemented enable-top) (def/public-unimplemented enable-top)
@ -77,7 +84,7 @@
(define (append-menu menu title) (define (append-menu menu title)
(send menu set-parent this) (send menu set-parent this)
(let ([item (gtk_menu_item_new_with_mnemonic (fixup-mneumonic title))]) (let ([item (gtk_menu_item_new_with_mnemonic (fixup-mneumonic title))])
(set! menus (append menus (list (list item menu title)))) (set! menus (append menus (list (list item menu))))
(let ([gtk (send menu get-gtk)]) (let ([gtk (send menu get-gtk)])
(g_object_ref gtk) (g_object_ref gtk)
(gtk_menu_item_set_submenu item gtk)) (gtk_menu_item_set_submenu item gtk))

View File

@ -285,6 +285,8 @@
(define/public (get-parent) parent) (define/public (get-parent) parent)
(define/public (get-top-win) (send parent get-top-win))
(define/public (get-size xb yb) (define/public (get-size xb yb)
(set-box! xb save-w) (set-box! xb save-w)
(set-box! yb save-h)) (set-box! yb save-h))

View File

@ -32,7 +32,7 @@
(def/public (set-bitmap [(make-or-false bitmap%) v]) (def/public (set-bitmap [(make-or-false bitmap%) v])
(do-set-bitmap v) (do-set-bitmap v)
(reset-cr)) (when c (reset-cr c)))
(def/public (get-bitmap) bm) (def/public (get-bitmap) bm)

View File

@ -49,14 +49,19 @@
;; This is the interface that the backend specific code must implement ;; This is the interface that the backend specific code must implement
(define dc-backend<%> (define dc-backend<%>
(interface () (interface ()
;; get-cr : -> cairo_t ;; get-cr : -> cairo_t or #f
;; ;;
;; Gets a cairo_t created in a backend specific manner. ;; Gets a cairo_t created in a backend specific manner.
;; We assume that no one else is using this Cairo context ;; We assume that no one else is using this Cairo context
;; or its surface (i.e., no state will change out frm user us, ;; or its surface (i.e., no state will change out from user us,
;; and our state won't bother anyone else). ;; and our state won't bother anyone else).
get-cr get-cr
;; release-cr : cairo_t -> void
;;
;; Stops using a cairo_t obtained by a get-cr
release-cr
;; Ends a document ;; Ends a document
end-cr end-cr
@ -110,6 +115,7 @@
(class* object% (dc-backend<%>) (class* object% (dc-backend<%>)
(define/public (get-cr) #f) (define/public (get-cr) #f)
(define/public (release-cr cr) (void))
(define/public (end-cr) (void)) (define/public (end-cr) (void))
(define/public (reset-cr) (void)) (define/public (reset-cr) (void))
@ -153,7 +159,7 @@
(defclass* dc% backend% (dc<%>) (defclass* dc% backend% (dc<%>)
(super-new) (super-new)
(inherit flush-cr get-cr end-cr init-cr-matrix get-pango (inherit flush-cr get-cr release-cr end-cr init-cr-matrix get-pango
install-color dc-adjust-smoothing reset-clip install-color dc-adjust-smoothing reset-clip
collapse-bitmap-b&w?) collapse-bitmap-b&w?)
@ -165,7 +171,10 @@
(lambda () (lambda ()
(let ([cr (get-cr)]) (let ([cr (get-cr)])
(if cr (if cr
(begin . body) (dynamic-wind
void
(lambda () . body)
(lambda () (release-cr cr)))
default))))) default)))))
(define/public (in-cairo-context cb) (define/public (in-cairo-context cb)
@ -250,23 +259,28 @@
(cairo_matrix_t-x0 m) (cairo_matrix_t-x0 m)
(cairo_matrix_t-y0 m)))) (cairo_matrix_t-y0 m))))
(define/private (do-reset-matrix cr)
(cairo_set_matrix cr matrix)
(cairo_translate cr origin-x origin-y)
(cairo_scale cr scale-x scale-y)
(cairo_rotate cr rotation))
(define/private (reset-matrix) (define/private (reset-matrix)
(with-cr (with-cr
(void) (void)
cr cr
(cairo_set_matrix cr matrix) (do-reset-matrix cr)))
(cairo_translate cr origin-x origin-y)
(cairo_scale cr scale-x scale-y)
(cairo_rotate cr rotation)))
(inherit get-font-metrics-key) (inherit get-font-metrics-key)
(define/public (cache-font-metrics-key) (define/public (cache-font-metrics-key)
(get-font-metrics-key scale-x scale-y)) (get-font-metrics-key scale-x scale-y))
(define/override (reset-cr) (define/override (reset-cr cr)
(set! context #f) (set! context #f)
(reset-layouts!) (reset-layouts!)
(reset-matrix)) (do-reset-matrix cr)
(when clipping-region
(send clipping-region install-region cr)))
(define smoothing 'unsmoothed) (define smoothing 'unsmoothed)

View File

@ -20,7 +20,7 @@
(define PNG_LIBPNG_VER_STRING (define PNG_LIBPNG_VER_STRING
(case (system-type) (case (system-type)
[(macosx) #"1.4"] [(macosx windows) #"1.4"]
[else #"1.2"])) [else #"1.2"]))
(define _png_structp (_cpointer 'png_structp)) (define _png_structp (_cpointer 'png_structp))

View File

@ -38,7 +38,7 @@
(err "unrecognized format"))) (err "unrecognized format")))
(for ([i (in-range (bytes->int (cadddr m) 10))]) (read-color)) (for ([i (in-range (bytes->int (cadddr m) 10))]) (read-color))
(values (bytes->int (cadr m) 10) (bytes->int (caddr m) 10))) (values (bytes->int (cadr m) 10) (bytes->int (caddr m) 10)))
(unless (equal? "/* XPM */" (read-line in)) (err "not an XPM file")) (unless (equal? "/* XPM */" (read-line in 'any)) (err "not an XPM file"))
(unless (regexp-match? rx:start in) (err "expected C prefix not found")) (unless (regexp-match? rx:start in) (err "expected C prefix not found"))
(let*-values ([(width height) (read-meta)] (let*-values ([(width height) (read-meta)]
[(result) (make-vector height)] [(result) (make-vector height)]