diff --git a/collects/mred/private/wx/cocoa/canvas.rkt b/collects/mred/private/wx/cocoa/canvas.rkt index 2cc2f000..0d93034c 100644 --- a/collects/mred/private/wx/cocoa/canvas.rkt +++ b/collects/mred/private/wx/cocoa/canvas.rkt @@ -129,12 +129,23 @@ (define/override (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) (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)) (- h (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 (tellv (scroller-cocoa v-scroller) setFrame: #:type _NSRect (make-NSRect diff --git a/collects/mred/private/wx/cocoa/frame.rkt b/collects/mred/private/wx/cocoa/frame.rkt index 3901d82d..f5834e10 100644 --- a/collects/mred/private/wx/cocoa/frame.rkt +++ b/collects/mred/private/wx/cocoa/frame.rkt @@ -110,6 +110,8 @@ (define cocoa (get-cocoa)) (tellv cocoa setDelegate: cocoa) + (tellv cocoa setAcceptsMouseMovedEvents: #:type _BOOL #t) + (define/override (get-cocoa-content) (tell cocoa contentView)) (define/override (get-cocoa-window) cocoa) diff --git a/collects/mred/private/wx/common/event.rkt b/collects/mred/private/wx/common/event.rkt index dd5c0f61..793c18de 100644 --- a/collects/mred/private/wx/common/event.rkt +++ b/collects/mred/private/wx/common/event.rkt @@ -64,7 +64,7 @@ (eq? et 'enter)) (def/public (leaving?) - (eq? et 'leaving)) + (eq? et 'leave)) (def/public (moving?) (and (eq? et 'motion) diff --git a/collects/mred/private/wx/gtk/canvas.rkt b/collects/mred/private/wx/gtk/canvas.rkt index b32b2dbe..0fbec660 100644 --- a/collects/mred/private/wx/gtk/canvas.rkt +++ b/collects/mred/private/wx/gtk/canvas.rkt @@ -153,7 +153,9 @@ GDK_BUTTON_PRESS_MASK GDK_BUTTON_RELEASE_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) GTK_CAN_FOCUS)) diff --git a/collects/mred/private/wx/gtk/types.rkt b/collects/mred/private/wx/gtk/types.rkt index 62cb6be1..49305bcf 100644 --- a/collects/mred/private/wx/gtk/types.rkt +++ b/collects/mred/private/wx/gtk/types.rkt @@ -16,7 +16,9 @@ _GdkEventKey _GdkEventKey-pointer (struct-out GdkEventKey) _GdkEventMotion _GdkEventMotion-pointer - (struct-out GdkEventMotion)) + (struct-out GdkEventMotion) + _GdkEventCrossing _GdkEventCrossing-pointer + (struct-out GdkEventCrossing)) (define _GdkWindow (_cpointer/null 'GdkWindow)) @@ -71,3 +73,16 @@ [device _GdkDevice] [x_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])) diff --git a/collects/mred/private/wx/gtk/window.rkt b/collects/mred/private/wx/gtk/window.rkt index f8d33dbb..e8e522a8 100644 --- a/collects/mred/private/wx/gtk/window.rkt +++ b/collects/mred/private/wx/gtk/window.rkt @@ -105,39 +105,59 @@ (define-signal-handler connect-button-press "button-press-event" (_fun _GtkWidget _GdkEventButton-pointer -> _gboolean) (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" (_fun _GtkWidget _GdkEventButton-pointer -> _gboolean) (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" (_fun _GtkWidget _GdkEventMotion-pointer -> _gboolean) (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) (connect-key-press gtk) (connect-button-press 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? GDK_MOTION_NOTIFY - (GdkEventButton-type event))]) + (if crossing? + (GdkEventCrossing-type event) + (GdkEventButton-type event)))]) (unless (or (= type GDK_2BUTTON_PRESS) (= type GDK_3BUTTON_PRESS)) (let* ([wx (gtk->wx gtk)] [modifiers (if motion? (GdkEventMotion-state event) - (GdkEventButton-state event))] + (if crossing? + (GdkEventCrossing-state event) + (GdkEventButton-state event)))] [bit? (lambda (m v) (positive? (bitwise-and m v)))] [m (new mouse-event% [event-type (cond [(= type GDK_MOTION_NOTIFY) 'motion] + [(= type GDK_ENTER_NOTIFY) + 'enter] + [(= type GDK_LEAVE_NOTIFY) + 'leave] [(= type GDK_BUTTON_PRESS) (case (GdkEventButton-button event) [(1) 'left-down] @@ -151,13 +171,20 @@ [left-down (bit? modifiers GDK_BUTTON1_MASK)] [middle-down (bit? modifiers GDK_BUTTON2_MASK)] [right-down (bit? modifiers GDK_BUTTON2_MASK)] - [x (->long ((if motion? GdkEventMotion-x GdkEventButton-x) event))] - [y (->long ((if motion? GdkEventMotion-y GdkEventButton-y) event))] + [x (->long ((if motion? + 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)] [control-down (bit? modifiers GDK_CONTROL_MASK)] [meta-down (bit? modifiers GDK_META_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)])]) (if (send wx handles-events?) (begin