try to throttle cocoa event dequeue for key & mouse events

This commit is contained in:
Matthew Flatt 2010-09-17 21:53:43 -06:00
parent 57c963c045
commit 0f2ff1ff5d
2 changed files with 78 additions and 4 deletions

View File

@ -18,6 +18,62 @@
(define NSAnyEventMask #xffffffff) (define NSAnyEventMask #xffffffff)
(define NSLeftMouseDown 1)
(define NSLeftMouseUp 2)
(define NSRightMouseDown 3)
(define NSRightMouseUp 4)
(define NSMouseMoved 5)
(define NSLeftMouseDragged 6)
(define NSRightMouseDragged 7)
(define NSMouseEntered 8)
(define NSMouseExited 9)
(define NSKeyDown 10)
(define NSKeyUp 11)
(define NSFlagsChanged 12)
(define NSAppKitDefined 13)
(define NSSystemDefined 14)
(define NSApplicationDefined 15)
(define NSPeriodic 16)
(define NSCursorUpdate 17)
(define NSScrollWheel 22)
(define NSTabletPoint 23)
(define NSTabletProximity 24)
(define NSOtherMouseDown 25)
(define NSOtherMouseUp 26)
(define NSOtherMouseDragged 27)
(define NSEventTypeGesture 29)
(define NSEventTypeMagnify 30)
(define NSEventTypeSwipe 31)
(define NSEventTypeRotate 18)
(define NSEventTypeBeginGesture 19)
(define NSEventTypeEndGesture 20)
(define MouseAndKeyEventMask
(bitwise-ior
(1 . << . NSLeftMouseDown)
(1 . << . NSLeftMouseUp)
(1 . << . NSRightMouseDown)
(1 . << . NSRightMouseUp)
(1 . << . NSMouseMoved)
(1 . << . NSLeftMouseDragged)
(1 . << . NSRightMouseDragged)
(1 . << . NSMouseEntered)
(1 . << . NSMouseExited)
(1 . << . NSKeyDown)
(1 . << . NSKeyUp)
(1 . << . NSScrollWheel)
(1 . << . NSTabletPoint)
(1 . << . NSTabletProximity)
(1 . << . NSOtherMouseDown)
(1 . << . NSOtherMouseUp)
(1 . << . NSOtherMouseDragged)
(1 . << . NSEventTypeGesture)
(1 . << . NSEventTypeMagnify)
(1 . << . NSEventTypeSwipe)
(1 . << . NSEventTypeRotate)
(1 . << . NSEventTypeBeginGesture)
(1 . << . NSEventTypeEndGesture)))
(define NSAlphaShiftKeyMask (1 . << . 16)) (define NSAlphaShiftKeyMask (1 . << . 16))
(define NSShiftKeyMask (1 . << . 17)) (define NSShiftKeyMask (1 . << . 17))
(define NSControlKeyMask (1 . << . 18)) (define NSControlKeyMask (1 . << . 18))

View File

@ -70,7 +70,6 @@
;; ready to wake up ;; ready to wake up
(import-class NSEvent) (import-class NSEvent)
(define NSApplicationDefined 15)
(define wake-evt (define wake-evt
(tell NSEvent (tell NSEvent
otherEventWithType: #:type _int NSApplicationDefined otherEventWithType: #:type _int NSApplicationDefined
@ -181,6 +180,8 @@
(define events-suspended? #f) (define events-suspended? #f)
(define was-menu-bar #f) (define was-menu-bar #f)
(define avoid-mouse-key-until #f)
(define (check-menu-bar-click evt) (define (check-menu-bar-click evt)
(if (and evt (if (and evt
(= 14 (tell #:type _NSUInteger evt type)) (= 14 (tell #:type _NSUInteger evt type))
@ -217,10 +218,17 @@
(when (and events-suspended? wait?) (when (and events-suspended? wait?)
(set! was-menu-bar #f) (set! was-menu-bar #f)
(set! events-suspended? #f)) (set! events-suspended? #f))
(when (and avoid-mouse-key-until
((current-inexact-milliseconds) . > . avoid-mouse-key-until))
(set! avoid-mouse-key-until #f))
(begin0 (begin0
(let ([evt (if events-suspended? (let ([evt (if events-suspended?
#f #f
(tell app nextEventMatchingMask: #:type _NSUInteger NSAnyEventMask (tell app nextEventMatchingMask: #:type _NSUInteger (if (and (not wait?)
avoid-mouse-key-until)
(- NSAnyEventMask
MouseAndKeyEventMask)
NSAnyEventMask)
untilDate: (if wait? distantFuture #f) untilDate: (if wait? distantFuture #f)
inMode: NSDefaultRunLoopMode inMode: NSDefaultRunLoopMode
dequeue: #:type _BOOL dequeue?))]) dequeue: #:type _BOOL dequeue?))])
@ -229,7 +237,15 @@
(or (not dequeue?) (or (not dequeue?)
(let ([e (eventspace-hook (tell evt window))]) (let ([e (eventspace-hook (tell evt window))])
(if e (if e
(begin (let ([mouse-or-key?
(bitwise-bit-set? MouseAndKeyEventMask
(tell #:type _NSInteger evt type))])
;; If it's a mouse or key event, delay further
;; dequeue of mouse and key events until this
;; one can be handled.
(when mouse-or-key?
(set! avoid-mouse-key-until
(+ (current-inexact-milliseconds) 200.0)))
(retain evt) (retain evt)
(queue-event e (lambda () (queue-event e (lambda ()
(call-as-nonatomic-retry-point (call-as-nonatomic-retry-point
@ -237,7 +253,9 @@
;; in atomic mode ;; in atomic mode
(with-autorelease (with-autorelease
(tellv app sendEvent: evt) (tellv app sendEvent: evt)
(release evt))))))) (release evt))))
(when mouse-or-key?
(set! avoid-mouse-key-until #f)))))
(tellv app sendEvent: evt))) (tellv app sendEvent: evt)))
#t))) #t)))
(tellv pool release)))) (tellv pool release))))