diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h index 7e146c5f58..37a0c1feb1 100644 --- a/src/plugins/platforms/cocoa/qnsview.h +++ b/src/plugins/platforms/cocoa/qnsview.h @@ -54,6 +54,8 @@ class QCocoaBackingStore; class QCocoaGLContext; QT_END_NAMESPACE +Q_FORWARD_DECLARE_OBJC_CLASS(QNSViewMouseMoveHelper); + @interface QNSView : NSView { QCocoaBackingStore* m_backingStore; QPoint m_backingStoreOffset; @@ -72,6 +74,7 @@ QT_END_NAMESPACE QCocoaGLContext *m_glContext; bool m_shouldSetGLContextinDrawRect; NSString *m_inputSource; + QNSViewMouseMoveHelper *m_mouseMoveHelper; } - (id)init; @@ -102,9 +105,10 @@ QT_END_NAMESPACE - (void)mouseDown:(NSEvent *)theEvent; - (void)mouseDragged:(NSEvent *)theEvent; - (void)mouseUp:(NSEvent *)theEvent; -- (void)mouseMoved:(NSEvent *)theEvent; -- (void)mouseEntered:(NSEvent *)theEvent; -- (void)mouseExited:(NSEvent *)theEvent; +- (void)mouseMovedImpl:(NSEvent *)theEvent; +- (void)mouseEnteredImpl:(NSEvent *)theEvent; +- (void)mouseExitedImpl:(NSEvent *)theEvent; +- (void)cursorUpdateImpl:(NSEvent *)theEvent; - (void)rightMouseDown:(NSEvent *)theEvent; - (void)rightMouseDragged:(NSEvent *)theEvent; - (void)rightMouseUp:(NSEvent *)theEvent; diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index a2047bf550..4a744245f0 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -75,6 +75,53 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; - (CGFloat)deviceDeltaZ; @end +@interface QNSViewMouseMoveHelper : NSObject +{ + QNSView *view; +} + +- (id)initWithView:(QNSView *)theView; + +- (void)mouseMoved:(NSEvent *)theEvent; +- (void)mouseEntered:(NSEvent *)theEvent; +- (void)mouseExited:(NSEvent *)theEvent; +- (void)cursorUpdate:(NSEvent *)theEvent; + +@end + +@implementation QNSViewMouseMoveHelper + +- (id)initWithView:(QNSView *)theView +{ + self = [super init]; + if (self) { + view = theView; + } + return self; +} + +- (void)mouseMoved:(NSEvent *)theEvent +{ + [view mouseMovedImpl:theEvent]; +} + +- (void)mouseEntered:(NSEvent *)theEvent +{ + [view mouseEnteredImpl:theEvent]; +} + +- (void)mouseExited:(NSEvent *)theEvent +{ + [view mouseExitedImpl:theEvent]; +} + +- (void)cursorUpdate:(NSEvent *)theEvent +{ + [view cursorUpdateImpl:theEvent]; +} + +@end + @implementation QNSView + (void)initialize @@ -100,6 +147,7 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; currentCustomDragTypes = 0; m_sendUpAsRightButton = false; m_inputSource = 0; + m_mouseMoveHelper = [[QNSViewMouseMoveHelper alloc] initWithView:self]; if (!touchDevice) { touchDevice = new QTouchDevice; @@ -119,6 +167,7 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; m_subscribesForGlobalFrameNotifications = false; [m_inputSource release]; [[NSNotificationCenter defaultCenter] removeObserver:self]; + [m_mouseMoveHelper release]; delete currentCustomDragTypes; @@ -753,13 +802,13 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; | NSTrackingInVisibleRect | NSTrackingMouseMoved | NSTrackingCursorUpdate; NSTrackingArea *ta = [[[NSTrackingArea alloc] initWithRect:[self frame] options:trackingOptions - owner:self + owner:m_mouseMoveHelper userInfo:nil] autorelease]; [self addTrackingArea:ta]; } --(void)cursorUpdate:(NSEvent *)theEvent +-(void)cursorUpdateImpl:(NSEvent *)theEvent { Q_UNUSED(theEvent) // Set the cursor manually if there is no NSWindow. @@ -776,10 +825,10 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; [self addCursorRect:[self visibleRect] cursor:m_platformWindow->m_windowCursor]; } -- (void)mouseMoved:(NSEvent *)theEvent +- (void)mouseMovedImpl:(NSEvent *)theEvent { if (m_window->flags() & Qt::WindowTransparentForInput) - return [super mouseMoved:theEvent]; + return; QPointF windowPoint; QPointF screenPoint; @@ -806,12 +855,13 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; [self handleMouseEvent: theEvent]; } -- (void)mouseEntered:(NSEvent *)theEvent +- (void)mouseEnteredImpl:(NSEvent *)theEvent { + Q_UNUSED(theEvent) m_platformWindow->m_windowUnderMouse = true; if (m_window->flags() & Qt::WindowTransparentForInput) - return [super mouseEntered:theEvent]; + return; // Top-level windows generate enter events for sub-windows. if (!m_platformWindow->m_nsWindow) @@ -824,13 +874,13 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; QWindowSystemInterface::handleEnterEvent(m_platformWindow->m_enterLeaveTargetWindow, windowPoint, screenPoint); } -- (void)mouseExited:(NSEvent *)theEvent +- (void)mouseExitedImpl:(NSEvent *)theEvent { + Q_UNUSED(theEvent); m_platformWindow->m_windowUnderMouse = false; if (m_window->flags() & Qt::WindowTransparentForInput) - return [super mouseExited:theEvent]; - Q_UNUSED(theEvent); + return; // Top-level windows generate leave events for sub-windows. if (!m_platformWindow->m_nsWindow)