From 1e3b79de1798ea4f8a84b72792e66bb7e1aa5d79 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Sat, 13 Jun 2009 14:50:38 -0700 Subject: [PATCH] Fix for superview's not remaining mouseEntered when mouse moves over subviews. Closes #126. Reviewed by me. --- AppKit/CPWindow/CPWindow.j | 63 +++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index 103fc2890..4044620d8 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -253,7 +253,7 @@ var CPWindowSaveImage = nil, CPView _contentView; CPView _toolbarView; - CPView _mouseOverView; + CPArray _mouseEnteredStack; CPView _leftMouseDownView; CPView _rightMouseDownView; @@ -1212,23 +1212,56 @@ CPTexturedBackgroundWindowMask case CPMouseMoved: if (!_acceptsMouseMovedEvents) return; - + + if (!_mouseEnteredStack) + _mouseEnteredStack = []; + var hitTestView = [_windowView hitTest:point]; - - if (hitTestView != _mouseOverView) + + if ([_mouseEnteredStack count] && [_mouseEnteredStack lastObject] === hitTestView) + return [hitTestView mouseMoved:anEvent]; + + var view = hitTestView, + mouseEnteredStack = []; + + while (view) { - if (_mouseOverView) - [_mouseOverView mouseExited:[CPEvent mouseEventWithType:CPMouseExited location:point - modifierFlags:[anEvent modifierFlags] timestamp:[anEvent timestamp] windowNumber:_windowNumber context:nil eventNumber:-1 clickCount:1 pressure:0]]; - - if (hitTestView) - [hitTestView mouseEntered:[CPEvent mouseEventWithType:CPMouseEntered location:point - modifierFlags:[anEvent modifierFlags] timestamp:[anEvent timestamp] windowNumber:_windowNumber context:nil eventNumber:-1 clickCount:1 pressure:0]]; - - _mouseOverView = hitTestView; + mouseEnteredStack.unshift(view); + + view = [view superview]; } - - [_mouseOverView mouseMoved:anEvent]; + + var deviation = MIN(_mouseEnteredStack.length, mouseEnteredStack.length); + + while (deviation--) + if (_mouseEnteredStack[deviation] !== mouseEnteredStack[deviation]) + break; + + var index = deviation, + count = _mouseEnteredStack.length; + + if (index < count) + { + var event = [CPEvent mouseEventWithType:CPMouseExited location:point modifierFlags:[anEvent modifierFlags] timestamp:[anEvent timestamp] windowNumber:_windowNumber context:nil eventNumber:-1 clickCount:1 pressure:0]; + + for (; index < count; ++index) + [_mouseEnteredStack[index] mouseExited:event]; + } + + index = deviation; + count = mouseEnteredStack.length; + + if (index < count) + { + var event = [CPEvent mouseEventWithType:CPMouseEntered location:point modifierFlags:[anEvent modifierFlags] timestamp:[anEvent timestamp] windowNumber:_windowNumber context:nil eventNumber:-1 clickCount:1 pressure:0]; + + for (; index < count; ++index) + [mouseEnteredStack[index] mouseEntered:event]; + } + + _mouseEnteredStack = mouseEnteredStack; + + [hitTestView mouseMoved:anEvent]; } }