more consistent mouse events

original commit: 54bee6314efb966d5f3d863021f52fff5f1a9b69
This commit is contained in:
Matthew Flatt 2010-07-22 20:21:20 -05:00
parent 771d383be6
commit a9d6a3cb64
6 changed files with 71 additions and 14 deletions

View File

@ -129,12 +129,23 @@
(define/override (set-size x y w h) (define/override (set-size x y w h)
(do-set-size x y w h)) (do-set-size x y w h))
(define tr 0)
(define/private (do-set-size x y w h) (define/private (do-set-size x y w h)
(super set-size x y w h) (super set-size x y w h)
(when tr
(tellv content-cocoa removeTrackingRect: #:type _NSInteger tr)
(set! tr #f))
(let ([sz (make-NSSize (- w (if vscroll? scroll-width 0)) (let ([sz (make-NSSize (- w (if vscroll? scroll-width 0))
(- h (if hscroll? scroll-width 0)))] (- h (if hscroll? scroll-width 0)))]
[pos (make-NSPoint 0 (if hscroll? scroll-width 0))]) [pos (make-NSPoint 0 (if hscroll? scroll-width 0))])
(tellv content-cocoa setFrame: #:type _NSRect (make-NSRect pos sz))) (tellv content-cocoa setFrame: #:type _NSRect (make-NSRect pos sz))
(set! tr (tell #:type _NSInteger
content-cocoa
addTrackingRect: #:type _NSRect (make-NSRect (make-NSPoint 0 0) sz)
owner: content-cocoa
userData: #f
assumeInside: #:type _BOOL #f)))
(when v-scroller (when v-scroller
(tellv (scroller-cocoa v-scroller) setFrame: #:type _NSRect (tellv (scroller-cocoa v-scroller) setFrame: #:type _NSRect
(make-NSRect (make-NSRect

View File

@ -110,6 +110,8 @@
(define cocoa (get-cocoa)) (define cocoa (get-cocoa))
(tellv cocoa setDelegate: cocoa) (tellv cocoa setDelegate: cocoa)
(tellv cocoa setAcceptsMouseMovedEvents: #:type _BOOL #t)
(define/override (get-cocoa-content) (define/override (get-cocoa-content)
(tell cocoa contentView)) (tell cocoa contentView))
(define/override (get-cocoa-window) cocoa) (define/override (get-cocoa-window) cocoa)

View File

@ -64,7 +64,7 @@
(eq? et 'enter)) (eq? et 'enter))
(def/public (leaving?) (def/public (leaving?)
(eq? et 'leaving)) (eq? et 'leave))
(def/public (moving?) (def/public (moving?)
(and (eq? et 'motion) (and (eq? et 'motion)

View File

@ -153,7 +153,9 @@
GDK_BUTTON_PRESS_MASK GDK_BUTTON_PRESS_MASK
GDK_BUTTON_RELEASE_MASK GDK_BUTTON_RELEASE_MASK
GDK_POINTER_MOTION_MASK GDK_POINTER_MOTION_MASK
GDK_FOCUS_CHANGE_MASK)) GDK_FOCUS_CHANGE_MASK
GDK_ENTER_NOTIFY_MASK
GDK_LEAVE_NOTIFY_MASK))
(set-gtk-object-flags! client-gtk (bitwise-ior (get-gtk-object-flags client-gtk) (set-gtk-object-flags! client-gtk (bitwise-ior (get-gtk-object-flags client-gtk)
GTK_CAN_FOCUS)) GTK_CAN_FOCUS))

View File

@ -16,7 +16,9 @@
_GdkEventKey _GdkEventKey-pointer _GdkEventKey _GdkEventKey-pointer
(struct-out GdkEventKey) (struct-out GdkEventKey)
_GdkEventMotion _GdkEventMotion-pointer _GdkEventMotion _GdkEventMotion-pointer
(struct-out GdkEventMotion)) (struct-out GdkEventMotion)
_GdkEventCrossing _GdkEventCrossing-pointer
(struct-out GdkEventCrossing))
(define _GdkWindow (_cpointer/null 'GdkWindow)) (define _GdkWindow (_cpointer/null 'GdkWindow))
@ -71,3 +73,16 @@
[device _GdkDevice] [device _GdkDevice]
[x_root _double] [x_root _double]
[y_root _double])) [y_root _double]))
(define-cstruct _GdkEventCrossing ([type _GdkEventType]
[window _GdkWindow]
[send_event _byte]
[time _uint32]
[x _double]
[y _double]
[x_root _double]
[y_root _double]
[mode _int]
[detail _int]
[focus _gboolean]
[state _uint]))

View File

@ -105,39 +105,59 @@
(define-signal-handler connect-button-press "button-press-event" (define-signal-handler connect-button-press "button-press-event"
(_fun _GtkWidget _GdkEventButton-pointer -> _gboolean) (_fun _GtkWidget _GdkEventButton-pointer -> _gboolean)
(lambda (gtk event) (lambda (gtk event)
(do-button-event gtk event #f))) (do-button-event gtk event #f #f)))
(define-signal-handler connect-button-release "button-release-event" (define-signal-handler connect-button-release "button-release-event"
(_fun _GtkWidget _GdkEventButton-pointer -> _gboolean) (_fun _GtkWidget _GdkEventButton-pointer -> _gboolean)
(lambda (gtk event) (lambda (gtk event)
(do-button-event gtk event #f))) (do-button-event gtk event #f #f)))
(define-signal-handler connect-pointer-motion "motion-notify-event" (define-signal-handler connect-pointer-motion "motion-notify-event"
(_fun _GtkWidget _GdkEventMotion-pointer -> _gboolean) (_fun _GtkWidget _GdkEventMotion-pointer -> _gboolean)
(lambda (gtk event) (lambda (gtk event)
(do-button-event gtk event #t))) (do-button-event gtk event #t #f)))
(define-signal-handler connect-enter "enter-notify-event"
(_fun _GtkWidget _GdkEventCrossing-pointer -> _gboolean)
(lambda (gtk event)
(do-button-event gtk event #f #t)))
(define-signal-handler connect-leave "leave-notify-event"
(_fun _GtkWidget _GdkEventCrossing-pointer -> _gboolean)
(lambda (gtk event)
(do-button-event gtk event #f #t)))
(define (connect-key-and-mouse gtk) (define (connect-key-and-mouse gtk)
(connect-key-press gtk) (connect-key-press gtk)
(connect-button-press gtk) (connect-button-press gtk)
(connect-button-release gtk) (connect-button-release gtk)
(connect-pointer-motion gtk)) (connect-pointer-motion gtk)
(connect-enter gtk)
(connect-leave gtk))
(define (do-button-event gtk event motion?) (define (do-button-event gtk event motion? crossing?)
(let ([type (if motion? (let ([type (if motion?
GDK_MOTION_NOTIFY GDK_MOTION_NOTIFY
(GdkEventButton-type event))]) (if crossing?
(GdkEventCrossing-type event)
(GdkEventButton-type event)))])
(unless (or (= type GDK_2BUTTON_PRESS) (unless (or (= type GDK_2BUTTON_PRESS)
(= type GDK_3BUTTON_PRESS)) (= type GDK_3BUTTON_PRESS))
(let* ([wx (gtk->wx gtk)] (let* ([wx (gtk->wx gtk)]
[modifiers (if motion? [modifiers (if motion?
(GdkEventMotion-state event) (GdkEventMotion-state event)
(GdkEventButton-state event))] (if crossing?
(GdkEventCrossing-state event)
(GdkEventButton-state event)))]
[bit? (lambda (m v) (positive? (bitwise-and m v)))] [bit? (lambda (m v) (positive? (bitwise-and m v)))]
[m (new mouse-event% [m (new mouse-event%
[event-type (cond [event-type (cond
[(= type GDK_MOTION_NOTIFY) [(= type GDK_MOTION_NOTIFY)
'motion] 'motion]
[(= type GDK_ENTER_NOTIFY)
'enter]
[(= type GDK_LEAVE_NOTIFY)
'leave]
[(= type GDK_BUTTON_PRESS) [(= type GDK_BUTTON_PRESS)
(case (GdkEventButton-button event) (case (GdkEventButton-button event)
[(1) 'left-down] [(1) 'left-down]
@ -151,13 +171,20 @@
[left-down (bit? modifiers GDK_BUTTON1_MASK)] [left-down (bit? modifiers GDK_BUTTON1_MASK)]
[middle-down (bit? modifiers GDK_BUTTON2_MASK)] [middle-down (bit? modifiers GDK_BUTTON2_MASK)]
[right-down (bit? modifiers GDK_BUTTON2_MASK)] [right-down (bit? modifiers GDK_BUTTON2_MASK)]
[x (->long ((if motion? GdkEventMotion-x GdkEventButton-x) event))] [x (->long ((if motion?
[y (->long ((if motion? GdkEventMotion-y GdkEventButton-y) event))] GdkEventMotion-x
(if crossing? GdkEventCrossing-x GdkEventButton-x))
event))]
[y (->long ((if motion? GdkEventMotion-y
(if crossing? GdkEventCrossing-y GdkEventButton-y))
event))]
[shift-down (bit? modifiers GDK_SHIFT_MASK)] [shift-down (bit? modifiers GDK_SHIFT_MASK)]
[control-down (bit? modifiers GDK_CONTROL_MASK)] [control-down (bit? modifiers GDK_CONTROL_MASK)]
[meta-down (bit? modifiers GDK_META_MASK)] [meta-down (bit? modifiers GDK_META_MASK)]
[alt-down (bit? modifiers GDK_MOD1_MASK)] [alt-down (bit? modifiers GDK_MOD1_MASK)]
[time-stamp ((if motion? GdkEventMotion-time GdkEventButton-time) event)] [time-stamp ((if motion? GdkEventMotion-time
(if crossing? GdkEventCrossing-time GdkEventButton-time))
event)]
[caps-down (bit? modifiers GDK_LOCK_MASK)])]) [caps-down (bit? modifiers GDK_LOCK_MASK)])])
(if (send wx handles-events?) (if (send wx handles-events?)
(begin (begin