switch cocoa dialog% to common mixin

This commit is contained in:
Matthew Flatt 2010-10-01 20:26:30 -06:00
parent 70b26a5885
commit ba581819fb
3 changed files with 73 additions and 105 deletions

View File

@ -2,34 +2,15 @@
(require scheme/class (require scheme/class
"../../syntax.rkt" "../../syntax.rkt"
"../common/queue.rkt" "../common/queue.rkt"
"../common/dialog.rkt"
"../../lock.rkt" "../../lock.rkt"
"frame.rkt") "frame.rkt")
(provide dialog%) (provide dialog%)
(defclass dialog% frame% (define dialog%
(class (dialog-mixin frame%)
(super-new [is-dialog? #t]) (super-new [is-dialog? #t])
(define close-sema #f)
(define/override (direct-show on?)
(unless on?
(atomically
(when close-sema
(semaphore-post close-sema)
(set! close-sema #f))))
(super direct-show on?))
;; #t result avoids children sheets ;; #t result avoids children sheets
(define/override (get-sheet) #t) (define/override (get-sheet) #t)))
(define/override (show on?)
(if on?
(let ([s (atomically
(let ([s (or close-sema (make-semaphore))])
(unless close-sema (set! close-sema s))
(semaphore-peek-evt s)))])
(super show on?)
(yield s)
(void))
(super show on?))))

View File

@ -34,8 +34,6 @@
(define empty-mb (new menu-bar%)) (define empty-mb (new menu-bar%))
(define root-fake-frame #f) (define root-fake-frame #f)
(define dialog-level-counter 0)
(define all-windows (make-hash)) (define all-windows (make-hash))
(define-objc-mixin (MyWindowMethods Superclass) (define-objc-mixin (MyWindowMethods Superclass)
@ -52,7 +50,8 @@
(queue-window*-event wxb (lambda (wx) (queue-window*-event wxb (lambda (wx)
(unless (other-modal? wx) (unless (other-modal? wx)
(when (send wx on-close) (when (send wx on-close)
(send wx direct-show #f))))) (atomically
(send wx direct-show #f))))))
#f] #f]
[-a _void (windowDidResize: [_id notification]) [-a _void (windowDidResize: [_id notification])
(when wxb (when wxb
@ -187,21 +186,10 @@
(tell NSGraphicsContext graphicsContextWithWindow: cocoa))) (tell NSGraphicsContext graphicsContextWithWindow: cocoa)))
(define is-a-dialog? is-dialog?) (define is-a-dialog? is-dialog?)
(define dialog-level 0)
(define/public (frame-is-dialog?) is-a-dialog?) (define/public (frame-is-dialog?) is-a-dialog?)
(define/public (frame-relative-dialog-status win)
;; called in event-pump thread
(cond
[is-a-dialog? (let ([dl (send win get-dialog-level)])
(cond
[(= dl dialog-level) 'same]
[(dl . > . dialog-level) #f]
[else 'other]))]
[else #f]))
(define/override (get-dialog-level) (define/public (frame-relative-dialog-status win) #f)
;; called in event-pump thread (define/override (get-dialog-level) 0)
dialog-level)
(define/public (clean-up) (define/public (clean-up)
;; When a window is resized, then any drawing that is in flight ;; When a window is resized, then any drawing that is in flight
@ -215,9 +203,11 @@
(define/public (get-sheet) child-sheet) (define/public (get-sheet) child-sheet)
(define/public (set-sheet s) (set! child-sheet s)) (define/public (set-sheet s) (set! child-sheet s))
(define caption? (not (memq 'no-caption style)))
(define/public (can-have-sheet?) caption?)
(define/public (direct-show on?) (define/public (direct-show on?)
(as-entry ;; in atomic mode
(lambda ()
(when (and (not on?) (when (and (not on?)
(eq? front this)) (eq? front this))
(set! front #f) (set! front #f)
@ -226,13 +216,10 @@
(show-children) (show-children)
(hide-children)) (hide-children))
(if on? (if on?
(begin
(when is-a-dialog?
(set! dialog-level-counter (add1 dialog-level-counter))
(set! dialog-level dialog-level-counter))
(if (and is-a-dialog? (if (and is-a-dialog?
(let ([p (get-parent)]) (let ([p (get-parent)])
(and p (and p
(send p can-have-sheet?)
(not (send p get-sheet))))) (not (send p get-sheet)))))
(let ([p (get-parent)]) (let ([p (get-parent)])
(send p set-sheet this) (send p set-sheet this)
@ -242,10 +229,9 @@
modalDelegate: #f modalDelegate: #f
didEndSelector: #:type _SEL #f didEndSelector: #:type _SEL #f
contextInfo: #f)) contextInfo: #f))
(tellv cocoa makeKeyAndOrderFront: #f))) (tellv cocoa makeKeyAndOrderFront: #f))
(begin (begin
(when is-a-dialog? (when is-a-dialog?
(set! dialog-level 0)
(let ([p (get-parent)]) (let ([p (get-parent)])
(when (and p (when (and p
(eq? this (send p get-sheet))) (eq? this (send p get-sheet)))
@ -273,7 +259,7 @@
(hash-remove! all-windows num))) (hash-remove! all-windows num)))
(when on? (when on?
(let ([b (eventspace-wait-cursor-count (get-eventspace))]) (let ([b (eventspace-wait-cursor-count (get-eventspace))])
(set-wait-cursor-mode (not (zero? b)))))))) (set-wait-cursor-mode (not (zero? b))))))
(define/override (show on?) (define/override (show on?)
(let ([es (get-eventspace)]) (let ([es (get-eventspace)])
@ -290,7 +276,8 @@
(do-paint-children) (do-paint-children)
(semaphore-post s))) (semaphore-post s)))
(sync/timeout 1 s)))))) (sync/timeout 1 s))))))
(direct-show on?)) (atomically
(direct-show on?)))
(define/private (do-paint-children) (define/private (do-paint-children)
(when saved-child (when saved-child
@ -300,7 +287,8 @@
(define/public (destroy) (define/public (destroy)
(when child-sheet (send child-sheet destroy)) (when child-sheet (send child-sheet destroy))
(direct-show #f)) (atomically
(direct-show #f)))
(define/override (hide-children) (define/override (hide-children)
(when saved-child (when saved-child

View File

@ -31,10 +31,9 @@
(unless on? (unless on?
(set! dialog-level 0)) (set! dialog-level 0))
(unless on? (unless on?
(atomically
(when close-sema (when close-sema
(semaphore-post close-sema) (semaphore-post close-sema)
(set! close-sema #f)))) (set! close-sema #f)))
(super direct-show on?)) (super direct-show on?))
(define/override (show on?) (define/override (show on?)