diff --git a/collects/mred/private/kernel.rkt b/collects/mred/private/kernel.rkt index 225f28e596..419c640824 100644 --- a/collects/mred/private/kernel.rkt +++ b/collects/mred/private/kernel.rkt @@ -33,4 +33,5 @@ main-eventspace? eventspace-handler-thread queue-callback - middle-queue-key) + middle-queue-key + get-top-level-windows) diff --git a/collects/mred/private/wx/cocoa/button.rkt b/collects/mred/private/wx/cocoa/button.rkt index 93ec7a9dbd..8410b59dd9 100644 --- a/collects/mred/private/wx/cocoa/button.rkt +++ b/collects/mred/private/wx/cocoa/button.rkt @@ -103,6 +103,13 @@ (tellv button-cocoa setAction: #:type _SEL (selector clicked:)) (define/override (get-cocoa-control) button-cocoa) + + (define/override (set-label label) + (cond + [(string? label) + (tellv cocoa setTitleWithMnemonic: #:type _NSString label)] + [else + (tellv cocoa setImage: (bitmap->image label))])) (define callback cb) (define/public (clicked) diff --git a/collects/mred/private/wx/cocoa/frame.rkt b/collects/mred/private/wx/cocoa/frame.rkt index 669ba55327..4dc7edf4f4 100644 --- a/collects/mred/private/wx/cocoa/frame.rkt +++ b/collects/mred/private/wx/cocoa/frame.rkt @@ -217,8 +217,9 @@ (define/override (call-pre-on-char w e) (pre-on-char w e)) + (define/public (on-menu-click) (void)) + (def/public-unimplemented on-toolbar-click) - (def/public-unimplemented on-menu-click) (def/public-unimplemented on-menu-command) (def/public-unimplemented on-mdi-activate) (def/public-unimplemented on-close) diff --git a/collects/mred/private/wx/cocoa/image.rkt b/collects/mred/private/wx/cocoa/image.rkt index d43e19513c..808b9b4208 100644 --- a/collects/mred/private/wx/cocoa/image.rkt +++ b/collects/mred/private/wx/cocoa/image.rkt @@ -57,12 +57,11 @@ [h (send bm get-height)] [str (make-bytes (* w h 4) 255)]) (send bm get-argb-pixels 0 0 w h str #f) - (let ([mask-bm (send bm get-loaded-mask)]) - (when mask-bm - (send mask-bm get-argb-pixels 0 0 w h str #t))) + (when (send bm get-loaded-mask) + (send bm get-argb-pixels 0 0 w h str #t)) (as-entry (lambda () - (let ([rgba (scheme_make_sized_byte_string (malloc (* w h 4)) (* w h 4) 1)]) + (let ([rgba (scheme_make_sized_byte_string (malloc (* w h 4) 'raw) (* w h 4) 0)]) (memcpy rgba str (sub1 (* w h 4))) (let* ([cs (CGColorSpaceCreateDeviceRGB)] [provider (CGDataProviderCreateWithData #f rgba (* w h 4) free-it)] diff --git a/collects/mred/private/wx/cocoa/menu.rkt b/collects/mred/private/wx/cocoa/menu.rkt index cbc1e1bd0d..7bf877cade 100644 --- a/collects/mred/private/wx/cocoa/menu.rkt +++ b/collects/mred/private/wx/cocoa/menu.rkt @@ -125,13 +125,14 @@ (define/public (checked? item) (send item get-checked)) - (def/public-unimplemented delete-by-position) + (define/public (delete-by-position pos) + (let ([mitem (list-ref items pos)]) + (set! items (append (take items pos) + (drop items (add1 pos)))) + (when cocoa-menu + (tellv cocoa-menu removeItemAtIndex: #:type _NSInteger pos)))) (define/public (delete item) (let ([pos (find-pos item)]) (when pos - (let ([mitem (list-ref items pos)]) - (set! items (append (take items pos) - (drop items (add1 pos)))) - (when cocoa-menu - (tellv cocoa-menu removeItemAtIndex: #:type _NSInteger pos))))))) + (delete-by-position pos))))) diff --git a/collects/mred/private/wx/cocoa/platform.rkt b/collects/mred/private/wx/cocoa/platform.rkt index 5e94474f24..77bc402c39 100644 --- a/collects/mred/private/wx/cocoa/platform.rkt +++ b/collects/mred/private/wx/cocoa/platform.rkt @@ -93,7 +93,6 @@ shortcut-visible-in-label? unregister-collecting-blit register-collecting-blit - get-top-level-windows find-graphical-system-path check-for-break play-sound diff --git a/collects/mred/private/wx/cocoa/procs.rkt b/collects/mred/private/wx/cocoa/procs.rkt index b58496d645..1317a4c1bd 100644 --- a/collects/mred/private/wx/cocoa/procs.rkt +++ b/collects/mred/private/wx/cocoa/procs.rkt @@ -21,7 +21,6 @@ play-sound check-for-break find-graphical-system-path - get-top-level-windows register-collecting-blit unregister-collecting-blit shortcut-visible-in-label? @@ -73,7 +72,6 @@ (define-unimplemented play-sound) (define-unimplemented check-for-break) (define-unimplemented find-graphical-system-path) -(define-unimplemented get-top-level-windows) (define (register-collecting-blit . args) (void)) (define (unregister-collecting-blit . args) (void)) (define (shortcut-visible-in-label? [x #f]) #f) diff --git a/collects/mred/private/wx/common/freeze.rkt b/collects/mred/private/wx/common/freeze.rkt index e8278e1021..0183381f27 100644 --- a/collects/mred/private/wx/common/freeze.rkt +++ b/collects/mred/private/wx/common/freeze.rkt @@ -29,16 +29,18 @@ ;; Out of atomic mode: (let ([k (unbox b)]) (when k - (call-with-continuation-prompt - k - freeze-tag))) + (call-with-continuation-prompt ; to catch aborts + (lambda () + (call-with-continuation-prompt + k + freeze-tag))))) (void)))) ;; FIXME: waiting 200msec is not a good enough rule. (define (constrained-reply es thunk default [should-give-up? (let ([now (current-inexact-milliseconds)]) (lambda () - ((current-inexact-milliseconds) . > . 200)))]) + ((current-inexact-milliseconds) . > . (+ now 200))))]) (unless (freezer-box) (log-error "internal error: constrained-reply not within an unfreeze point")) (if (eq? (current-thread) (eventspace-handler-thread es)) diff --git a/collects/mred/private/wx/common/queue.rkt b/collects/mred/private/wx/common/queue.rkt index e37778f5c0..84f2077639 100644 --- a/collects/mred/private/wx/common/queue.rkt +++ b/collects/mred/private/wx/common/queue.rkt @@ -34,6 +34,7 @@ remove-timer-callback register-frame-shown + get-top-level-windows queue-quit-event) @@ -101,7 +102,7 @@ ;; ------------------------------------------------------------ ;; Eventspaces -(define-struct eventspace (handler-thread queue-proc done-evt) +(define-struct eventspace (handler-thread queue-proc frames-hash done-evt) #:property prop:evt (lambda (v) (wrap-evt (eventspace-done-evt v) (lambda (_) v)))) @@ -126,7 +127,8 @@ [else 1])))) (define (make-eventspace* th) - (let ([done-sema (make-semaphore 1)]) + (let ([done-sema (make-semaphore 1)] + [frames (make-hasheq)]) (make-eventspace th (let ([count 0]) (let ([lo (mcons #f #f)] @@ -134,7 +136,6 @@ [hi (mcons #f #f)] [timer (box '())] [timer-counter 0] - [frames (make-hasheq)] [newly-posted-sema (make-semaphore)]) (let* ([check-done (lambda () @@ -234,6 +235,7 @@ never-evt))]) (end-atomic) e))])))) + frames (semaphore-peek-evt done-sema)))) (define main-eventspace (make-eventspace* (current-thread))) @@ -317,5 +319,9 @@ 'frame-add 'frame-remove))) +(define (get-top-level-windows) + (hash-map (eventspace-frames-hash (current-eventspace)) + (lambda (k v) k))) + (define (queue-quit-event) (queue-event main-eventspace (application-quit-handler) 'med)) diff --git a/collects/mred/private/wx/gtk/button.rkt b/collects/mred/private/wx/gtk/button.rkt index 6eeb09ee35..dbcb1e03de 100644 --- a/collects/mred/private/wx/gtk/button.rkt +++ b/collects/mred/private/wx/gtk/button.rkt @@ -20,6 +20,10 @@ (define-gtk gtk_button_new_with_mnemonic (_fun _string -> _GtkWidget)) (define-gtk gtk_button_new (_fun -> _GtkWidget)) (define-gtk gtk_window_set_default (_fun _GtkWidget (_or-null _GtkWidget) -> _void)) +(define-gtk gtk_button_set_label (_fun _GtkWidget _string -> _void)) + +(define-gtk gtk_container_remove (_fun _GtkWidget _GtkWidget -> _void)) +(define-gtk gtk_bin_get_child (_fun _GtkWidget -> _GtkWidget)) (define-signal-handler connect-clicked "clicked" (_fun _GtkWidget -> _void) @@ -71,6 +75,17 @@ ;; Called from event-handling thread (queue-window-event this (lambda () (clicked)))) + (define/override (set-label s) + (cond + [(string? s) + (gtk_button_set_label gtk (mnemonic-string s))] + [else + (let ([image-gtk (gtk_image_new_from_pixbuf + (bitmap->pixbuf s))]) + (gtk_container_remove gtk (gtk_bin_get_child gtk)) + (gtk_container_add gtk image-gtk) + (gtk_widget_show image-gtk))])) + (define/public (set-border on?) (gtk_window_set_default (get-window-gtk) (if on? gtk #f)))) diff --git a/collects/mred/private/wx/gtk/pixbuf.rkt b/collects/mred/private/wx/gtk/pixbuf.rkt index 42cca9e2fa..d94c74d527 100644 --- a/collects/mred/private/wx/gtk/pixbuf.rkt +++ b/collects/mred/private/wx/gtk/pixbuf.rkt @@ -2,6 +2,7 @@ (require racket/class ffi/unsafe racket/draw + "../../lock.rkt" "../common/bstr.rkt" "utils.rkt" "types.rkt" @@ -35,19 +36,20 @@ [h (send bm get-height)] [str (make-bytes (* w h 4) 255)]) (send bm get-argb-pixels 0 0 w h str #f) - (let ([mask-bm (send bm get-loaded-mask)]) - (when mask-bm - (send mask-bm get-argb-pixels 0 0 w h str #t))) - (let ([rgba (scheme_make_sized_byte_string (malloc (* w h 4) 'raw) (* w h 4) 1)]) - (memcpy rgba (ptr-add str 1) (sub1 (* w h 4))) - (for ([i (in-range 0 (* w h 4) 4)]) - (bytes-set! rgba (+ i 3) (bytes-ref str i))) - (gdk_pixbuf_new_from_data rgba - 0 - #t - 8 - w - h - (* w 4) - free-it - #f)))) + (when (send bm get-loaded-mask) + (send bm get-argb-pixels 0 0 w h str #t)) + (as-entry + (lambda () + (let ([rgba (scheme_make_sized_byte_string (malloc (* w h 4) 'raw) (* w h 4) 0)]) + (memcpy rgba (ptr-add str 1) (sub1 (* w h 4))) + (for ([i (in-range 0 (* w h 4) 4)]) + (bytes-set! rgba (+ i 3) (bytes-ref str i))) + (gdk_pixbuf_new_from_data rgba + 0 + #t + 8 + w + h + (* w 4) + free-it + #f)))))) diff --git a/collects/mred/private/wx/gtk/platform.rkt b/collects/mred/private/wx/gtk/platform.rkt index bec2c5eed3..e5305e47aa 100644 --- a/collects/mred/private/wx/gtk/platform.rkt +++ b/collects/mred/private/wx/gtk/platform.rkt @@ -93,7 +93,6 @@ shortcut-visible-in-label? unregister-collecting-blit register-collecting-blit - get-top-level-windows find-graphical-system-path check-for-break play-sound diff --git a/collects/mred/private/wx/gtk/procs.rkt b/collects/mred/private/wx/gtk/procs.rkt index 99b26a6f15..7183f9ad3a 100644 --- a/collects/mred/private/wx/gtk/procs.rkt +++ b/collects/mred/private/wx/gtk/procs.rkt @@ -21,7 +21,6 @@ play-sound check-for-break find-graphical-system-path - get-top-level-windows register-collecting-blit unregister-collecting-blit shortcut-visible-in-label? @@ -71,7 +70,6 @@ (define-unimplemented play-sound) (define-unimplemented check-for-break) (define-unimplemented find-graphical-system-path) -(define (get-top-level-windows) null) (define (register-collecting-blit . args) (void)) (define (unregister-collecting-blit . args) (void)) (define (shortcut-visible-in-label? [mbar? #f]) #t) diff --git a/collects/mred/private/wx/gtk/radio-box.rkt b/collects/mred/private/wx/gtk/radio-box.rkt index f289e429bc..f928be2e88 100644 --- a/collects/mred/private/wx/gtk/radio-box.rkt +++ b/collects/mred/private/wx/gtk/radio-box.rkt @@ -99,7 +99,11 @@ (as-entry (lambda () (set! no-clicked? #t) - (gtk_toggle_button_set_active (list-ref radio-gtks i) #t) + (if (= i -1) + (let ([i (get-selection)]) + (unless (= i -1) + (gtk_toggle_button_set_active (list-ref radio-gtks i) #f))) + (gtk_toggle_button_set_active (list-ref radio-gtks i) #t)) (set! no-clicked? #f)))) (define/public (get-selection) diff --git a/collects/mred/private/wx/platform.rkt b/collects/mred/private/wx/platform.rkt index d67ffc6acc..e76fadfda4 100644 --- a/collects/mred/private/wx/platform.rkt +++ b/collects/mred/private/wx/platform.rkt @@ -71,7 +71,6 @@ shortcut-visible-in-label? unregister-collecting-blit register-collecting-blit - get-top-level-windows find-graphical-system-path check-for-break play-sound diff --git a/collects/mred/private/wx/win32/platform.rkt b/collects/mred/private/wx/win32/platform.rkt index 246271c50a..ba32858c5f 100644 --- a/collects/mred/private/wx/win32/platform.rkt +++ b/collects/mred/private/wx/win32/platform.rkt @@ -92,7 +92,6 @@ shortcut-visible-in-label? unregister-collecting-blit register-collecting-blit - get-top-level-windows find-graphical-system-path check-for-break play-sound diff --git a/collects/mred/private/wx/win32/procs.rkt b/collects/mred/private/wx/win32/procs.rkt index 8d790d2f60..2c953a8ba8 100644 --- a/collects/mred/private/wx/win32/procs.rkt +++ b/collects/mred/private/wx/win32/procs.rkt @@ -14,7 +14,6 @@ play-sound check-for-break find-graphical-system-path - get-top-level-windows register-collecting-blit unregister-collecting-blit shortcut-visible-in-label? @@ -68,7 +67,6 @@ (define-unimplemented play-sound) (define-unimplemented check-for-break) (define-unimplemented find-graphical-system-path) -(define-unimplemented get-top-level-windows) (define-unimplemented register-collecting-blit) (define-unimplemented unregister-collecting-blit) (define-unimplemented shortcut-visible-in-label?) diff --git a/collects/mrlib/bitmap-label.rkt b/collects/mrlib/bitmap-label.rkt index 1d6a988de2..08495da077 100644 --- a/collects/mrlib/bitmap-label.rkt +++ b/collects/mrlib/bitmap-label.rkt @@ -96,6 +96,7 @@ outside-margin (- (/ new-height 2) (/ img-height 2))) (send bitmap-dc set-bitmap #f) + new-bitmap))) (define (bitmap-label-maker text filename-or-bitmap) diff --git a/collects/racket/draw/lock.rkt b/collects/racket/draw/lock.rkt index 1a03c80906..5462bb44e2 100644 --- a/collects/racket/draw/lock.rkt +++ b/collects/racket/draw/lock.rkt @@ -84,7 +84,7 @@ (lambda (t) (t))))])) (define (as-exit f) - ;; (unless (eq? monitor-owner (current-thread)) (error 'monitor-exit "not in monitored area for ~e" f)) + (unless (eq? monitor-owner (current-thread)) (error 'monitor-exit "not in monitored area for ~e" f)) (let ([paramz old-paramz] [break-paramz old-break-paramz]) (with-continuation-mark