eventspace shutdown
This commit is contained in:
parent
f716ae049a
commit
72b671b665
|
@ -98,6 +98,7 @@
|
||||||
(init [is-dialog? #f])
|
(init [is-dialog? #f])
|
||||||
|
|
||||||
(inherit get-cocoa get-parent
|
(inherit get-cocoa get-parent
|
||||||
|
get-eventspace
|
||||||
pre-on-char pre-on-event)
|
pre-on-char pre-on-event)
|
||||||
|
|
||||||
(super-new [parent parent]
|
(super-new [parent parent]
|
||||||
|
@ -232,8 +233,17 @@
|
||||||
(register-frame-shown this on?))))
|
(register-frame-shown this on?))))
|
||||||
|
|
||||||
(define/override (show on?)
|
(define/override (show on?)
|
||||||
|
(when on?
|
||||||
|
(when (eventspace-shutdown? (get-eventspace))
|
||||||
|
(error (string->symbol
|
||||||
|
(format "show method in ~a" (if is-a-dialog? 'dialog% 'frame%)))
|
||||||
|
"the eventspace hash been shutdown")))
|
||||||
(direct-show on?))
|
(direct-show on?))
|
||||||
|
|
||||||
|
(define/public (destroy)
|
||||||
|
(when child-sheet (send child-sheet destroy))
|
||||||
|
(direct-show #f))
|
||||||
|
|
||||||
(define/override (is-shown?)
|
(define/override (is-shown?)
|
||||||
(tell #:type _bool cocoa isVisible))
|
(tell #:type _bool cocoa isVisible))
|
||||||
|
|
||||||
|
|
|
@ -169,6 +169,9 @@
|
||||||
(send parent get-eventspace)
|
(send parent get-eventspace)
|
||||||
(current-eventspace)))
|
(current-eventspace)))
|
||||||
|
|
||||||
|
(when (eventspace-shutdown? eventspace)
|
||||||
|
(error '|GUI object initialization| "the eventspace has been shutdown"))
|
||||||
|
|
||||||
(set-ivar! cocoa wx this)
|
(set-ivar! cocoa wx this)
|
||||||
|
|
||||||
(unless no-show?
|
(unless no-show?
|
||||||
|
|
|
@ -114,7 +114,7 @@
|
||||||
;; ------------------------------------------------------------
|
;; ------------------------------------------------------------
|
||||||
;; Eventspaces
|
;; Eventspaces
|
||||||
|
|
||||||
(define-struct eventspace (handler-thread queue-proc frames-hash done-evt)
|
(define-struct eventspace (handler-thread queue-proc frames-hash done-evt [shutdown? #:mutable] done-sema)
|
||||||
#:property prop:evt (lambda (v)
|
#:property prop:evt (lambda (v)
|
||||||
(wrap-evt (eventspace-done-evt v)
|
(wrap-evt (eventspace-done-evt v)
|
||||||
(lambda (_) v))))
|
(lambda (_) v))))
|
||||||
|
@ -138,9 +138,25 @@
|
||||||
[(< am bm) -1]
|
[(< am bm) -1]
|
||||||
[else 1]))))
|
[else 1]))))
|
||||||
|
|
||||||
|
|
||||||
|
(define-mz scheme_add_managed (_fun _racket ; custodian
|
||||||
|
_racket ; object
|
||||||
|
(_fun #:atomic? #t _racket _pointer -> _void)
|
||||||
|
_pointer ; data
|
||||||
|
_int ; strong?
|
||||||
|
-> _pointer))
|
||||||
|
|
||||||
|
(define (shutdown-eventspace! e ignored-data)
|
||||||
|
(unless (eventspace-shutdown? e)
|
||||||
|
(set-eventspace-shutdown?! e #t)
|
||||||
|
(semaphore-post (eventspace-done-sema e))
|
||||||
|
(for ([f (in-list (get-top-level-windows e))])
|
||||||
|
(send f destroy))))
|
||||||
|
|
||||||
(define (make-eventspace* th)
|
(define (make-eventspace* th)
|
||||||
(let ([done-sema (make-semaphore 1)]
|
(let ([done-sema (make-semaphore 1)]
|
||||||
[frames (make-hasheq)])
|
[frames (make-hasheq)])
|
||||||
|
(let ([e
|
||||||
(make-eventspace th
|
(make-eventspace th
|
||||||
(let ([count 0])
|
(let ([count 0])
|
||||||
(let ([lo (mcons #f #f)]
|
(let ([lo (mcons #f #f)]
|
||||||
|
@ -248,7 +264,15 @@
|
||||||
(end-atomic)
|
(end-atomic)
|
||||||
e))]))))
|
e))]))))
|
||||||
frames
|
frames
|
||||||
(semaphore-peek-evt done-sema))))
|
(semaphore-peek-evt done-sema)
|
||||||
|
#f
|
||||||
|
done-sema)])
|
||||||
|
(scheme_add_managed (current-custodian)
|
||||||
|
e
|
||||||
|
shutdown-eventspace!
|
||||||
|
#f
|
||||||
|
1)
|
||||||
|
e)))
|
||||||
|
|
||||||
(define main-eventspace (make-eventspace* (current-thread)))
|
(define main-eventspace (make-eventspace* (current-thread)))
|
||||||
(define current-eventspace (make-parameter main-eventspace))
|
(define current-eventspace (make-parameter main-eventspace))
|
||||||
|
@ -308,7 +332,6 @@
|
||||||
(sync e)]))]))
|
(sync e)]))]))
|
||||||
|
|
||||||
(define event-dispatch-handler (make-parameter void))
|
(define event-dispatch-handler (make-parameter void))
|
||||||
(define (eventspace-shutdown? e) #f)
|
|
||||||
(define (main-eventspace? e)
|
(define (main-eventspace? e)
|
||||||
(eq? e main-eventspace))
|
(eq? e main-eventspace))
|
||||||
|
|
||||||
|
@ -331,9 +354,9 @@
|
||||||
'frame-add
|
'frame-add
|
||||||
'frame-remove)))
|
'frame-remove)))
|
||||||
|
|
||||||
(define (get-top-level-windows)
|
(define (get-top-level-windows [e (current-eventspace)])
|
||||||
;; called in event-pump thread
|
;; called in event-pump thread
|
||||||
(hash-map (eventspace-frames-hash (current-eventspace))
|
(hash-map (eventspace-frames-hash e)
|
||||||
(lambda (k v) k)))
|
(lambda (k v) k)))
|
||||||
|
|
||||||
(define (other-modal? win)
|
(define (other-modal? win)
|
||||||
|
|
|
@ -97,7 +97,7 @@
|
||||||
(inherit get-gtk set-size on-size
|
(inherit get-gtk set-size on-size
|
||||||
pre-on-char pre-on-event
|
pre-on-char pre-on-event
|
||||||
get-client-delta get-size
|
get-client-delta get-size
|
||||||
get-parent)
|
get-parent get-eventspace)
|
||||||
|
|
||||||
(define gtk (gtk_window_new GTK_WINDOW_TOPLEVEL))
|
(define gtk (gtk_window_new GTK_WINDOW_TOPLEVEL))
|
||||||
(when (memq 'no-caption style)
|
(when (memq 'no-caption style)
|
||||||
|
@ -207,10 +207,24 @@
|
||||||
(set-top-position x y)
|
(set-top-position x y)
|
||||||
(gtk_window_resize gtk (max 1 w) (max 1 h)))
|
(gtk_window_resize gtk (max 1 w) (max 1 h)))
|
||||||
|
|
||||||
|
(define/override (show on?)
|
||||||
|
(when (and on?
|
||||||
|
(eventspace-shutdown? (get-eventspace)))
|
||||||
|
(error (string->symbol
|
||||||
|
(format "show method in ~a"
|
||||||
|
(if (frame-relative-dialog-status this)
|
||||||
|
'dialog%
|
||||||
|
'frame%)))
|
||||||
|
"eventspace has been shutdown"))
|
||||||
|
(super show on?))
|
||||||
|
|
||||||
(define/override (direct-show on?)
|
(define/override (direct-show on?)
|
||||||
(super direct-show on?)
|
(super direct-show on?)
|
||||||
(register-frame-shown this on?))
|
(register-frame-shown this on?))
|
||||||
|
|
||||||
|
(define/public (destroy)
|
||||||
|
(direct-show #f))
|
||||||
|
|
||||||
(define/override (on-client-size w h)
|
(define/override (on-client-size w h)
|
||||||
(on-size w h))
|
(on-size w h))
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,8 @@
|
||||||
(other-modal? wx))))
|
(other-modal? wx))))
|
||||||
|
|
||||||
(defclass menu-bar% widget%
|
(defclass menu-bar% widget%
|
||||||
|
(inherit install-widget-parent)
|
||||||
|
|
||||||
(define menus null)
|
(define menus null)
|
||||||
|
|
||||||
(define gtk (gtk_menu_bar_new))
|
(define gtk (gtk_menu_bar_new))
|
||||||
|
@ -75,7 +77,8 @@
|
||||||
|
|
||||||
(define top-wx #f)
|
(define top-wx #f)
|
||||||
(define/public (set-top-window top)
|
(define/public (set-top-window top)
|
||||||
(set! top-wx top))
|
(set! top-wx top)
|
||||||
|
(install-widget-parent top))
|
||||||
(define/public (get-top-window)
|
(define/public (get-top-window)
|
||||||
top-wx)
|
top-wx)
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,8 @@
|
||||||
callback
|
callback
|
||||||
font)
|
font)
|
||||||
|
|
||||||
|
(inherit install-widget-parent)
|
||||||
|
|
||||||
(define cb callback)
|
(define cb callback)
|
||||||
|
|
||||||
(define gtk (gtk_menu_new))
|
(define gtk (gtk_menu_new))
|
||||||
|
@ -88,7 +90,8 @@
|
||||||
|
|
||||||
(define parent #f)
|
(define parent #f)
|
||||||
(define/public (set-parent p)
|
(define/public (set-parent p)
|
||||||
(set! parent p))
|
(set! parent p)
|
||||||
|
(install-widget-parent p))
|
||||||
(define/public (get-top-parent)
|
(define/public (get-top-parent)
|
||||||
;; Maybe be called in Gtk event-handler thread
|
;; Maybe be called in Gtk event-handler thread
|
||||||
(and parent
|
(and parent
|
||||||
|
@ -187,7 +190,8 @@
|
||||||
(let ([item (new menu-item-handler%
|
(let ([item (new menu-item-handler%
|
||||||
[gtk item-gtk]
|
[gtk item-gtk]
|
||||||
[menu this]
|
[menu this]
|
||||||
[menu-item i])])
|
[menu-item i]
|
||||||
|
[parent this])])
|
||||||
(set! items (append items (list (list item item-gtk label chckable?))))
|
(set! items (append items (list (list item item-gtk label chckable?))))
|
||||||
(adjust-shortcut item-gtk label)))
|
(adjust-shortcut item-gtk label)))
|
||||||
(gtk_menu_shell_append gtk item-gtk)
|
(gtk_menu_shell_append gtk item-gtk)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
(require scheme/foreign
|
(require scheme/foreign
|
||||||
scheme/class
|
scheme/class
|
||||||
"../../syntax.rkt"
|
"../../syntax.rkt"
|
||||||
|
"../common/queue.rkt"
|
||||||
"queue.rkt"
|
"queue.rkt"
|
||||||
"utils.rkt"
|
"utils.rkt"
|
||||||
"types.rkt")
|
"types.rkt")
|
||||||
|
@ -30,12 +31,21 @@
|
||||||
(define widget%
|
(define widget%
|
||||||
(class object%
|
(class object%
|
||||||
(init gtk
|
(init gtk
|
||||||
[extra-gtks null])
|
[extra-gtks null]
|
||||||
(init-field [eventspace (current-eventspace)])
|
[parent #f])
|
||||||
|
(init-field [eventspace (if parent
|
||||||
|
(send parent get-eventspace)
|
||||||
|
(current-eventspace))])
|
||||||
|
|
||||||
|
(when (eventspace-shutdown? eventspace)
|
||||||
|
(error '|GUI object initialization| "the eventspace has been shutdown"))
|
||||||
|
|
||||||
(define/public (get-eventspace) eventspace)
|
(define/public (get-eventspace) eventspace)
|
||||||
(define/public (direct-update?) #t)
|
(define/public (direct-update?) #t)
|
||||||
|
|
||||||
|
(define/public (install-widget-parent p)
|
||||||
|
(set! eventspace (send p get-eventspace)))
|
||||||
|
|
||||||
(super-new)
|
(super-new)
|
||||||
|
|
||||||
(let ([cell (malloc-immobile-cell this)])
|
(let ([cell (malloc-immobile-cell this)])
|
||||||
|
|
|
@ -248,7 +248,8 @@
|
||||||
[add-to-parent? #t])
|
[add-to-parent? #t])
|
||||||
|
|
||||||
(super-new [gtk gtk]
|
(super-new [gtk gtk]
|
||||||
[extra-gtks extra-gtks])
|
[extra-gtks extra-gtks]
|
||||||
|
[parent parent])
|
||||||
|
|
||||||
(define save-x 0)
|
(define save-x 0)
|
||||||
(define save-y 0)
|
(define save-y 0)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user