diff options
Diffstat (limited to 'src/plugins/platforms/cocoa/qnsview.mm')
-rw-r--r-- | src/plugins/platforms/cocoa/qnsview.mm | 264 |
1 files changed, 120 insertions, 144 deletions
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index ba86b39e5b..a63bc4d570 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -39,8 +39,6 @@ #include <QtCore/qglobal.h> -#include <dlfcn.h> - #include "qnsview.h" #include "qcocoawindow.h" #include "qcocoahelpers.h" @@ -54,6 +52,7 @@ #include <QtCore/QDebug> #include <QtCore/qsysinfo.h> #include <private/qguiapplication_p.h> +#include <private/qcoregraphics_p.h> #include "qcocoabackingstore.h" #ifndef QT_NO_OPENGL #include "qcocoaglcontext.h" @@ -72,9 +71,6 @@ Q_LOGGING_CATEGORY(lcQpaTablet, "qt.qpa.input.tablet") static QTouchDevice *touchDevice = 0; -// ### HACK Remove once 10.8 is unsupported -static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; - static bool _q_dontOverrideCtrlLMB = false; @interface NSEvent (Qt_Compile_Leopard_DeviceDelta) @@ -130,14 +126,15 @@ static bool _q_dontOverrideCtrlLMB = false; @end +// Private interface +@interface QT_MANGLE_NAMESPACE(QNSView) () +- (BOOL)isTransparentForUserInput; +@end + @implementation QT_MANGLE_NAMESPACE(QNSView) + (void)initialize { - NSString **notificationNameVar = (NSString **)dlsym(RTLD_NEXT, "NSWindowDidChangeOcclusionStateNotification"); - if (notificationNameVar) - _q_NSWindowDidChangeOcclusionStateNotification = *notificationNameVar; - _q_dontOverrideCtrlLMB = qt_mac_resolveOption(false, "QT_MAC_DONT_OVERRIDE_CTRL_LMB"); } @@ -148,7 +145,6 @@ static bool _q_dontOverrideCtrlLMB = false; m_backingStore = 0; m_maskImage = 0; m_shouldInvalidateWindowShadow = false; - m_window = 0; m_buttons = Qt::NoButton; m_acceptedMouseDowns = Qt::NoButton; m_frameStrutButtons = Qt::NoButton; @@ -185,7 +181,6 @@ static bool _q_dontOverrideCtrlLMB = false; CGImageRelease(m_maskImage); [m_trackingArea release]; m_maskImage = 0; - m_window = 0; m_subscribesForGlobalFrameNotifications = false; [m_inputSource release]; [[NSNotificationCenter defaultCenter] removeObserver:self]; @@ -196,13 +191,12 @@ static bool _q_dontOverrideCtrlLMB = false; [super dealloc]; } -- (id)initWithQWindow:(QWindow *)window platformWindow:(QCocoaWindow *) platformWindow +- (id)initWithCocoaWindow:(QCocoaWindow *)platformWindow { self = [self init]; if (!self) return 0; - m_window = window; m_platformWindow = platformWindow; m_sendKeyEvent = false; m_trackingArea = nil; @@ -237,12 +231,6 @@ static bool _q_dontOverrideCtrlLMB = false; return self; } -- (void) clearQWindowPointers -{ - m_window = 0; - m_platformWindow = 0; -} - #ifndef QT_NO_OPENGL - (void) setQCocoaGLContext:(QCocoaGLContext *)context { @@ -275,40 +263,28 @@ static bool _q_dontOverrideCtrlLMB = false; - (void)viewDidMoveToSuperview { - if (!(m_platformWindow->m_contentViewIsToBeEmbedded)) + if (!(m_platformWindow->m_viewIsToBeEmbedded)) return; if ([self superview]) { - m_platformWindow->m_contentViewIsEmbedded = true; - QWindowSystemInterface::handleGeometryChange(m_window, m_platformWindow->geometry()); + m_platformWindow->m_viewIsEmbedded = true; + QWindowSystemInterface::handleGeometryChange(m_platformWindow->window(), m_platformWindow->geometry()); m_platformWindow->updateExposedGeometry(); QWindowSystemInterface::flushWindowSystemEvents(); } else { - m_platformWindow->m_contentViewIsEmbedded = false; + m_platformWindow->m_viewIsEmbedded = false; } } - (void)viewDidMoveToWindow { m_backingStore = Q_NULLPTR; - m_isMenuView = [self.window.className isEqualToString:@"NSCarbonMenuWindow"]; - if (self.window) { - // This is the case of QWidgetAction's generated QWidget inserted in an NSMenu. - // 10.9 and newer get the NSWindowDidChangeOcclusionStateNotification - if (!_q_NSWindowDidChangeOcclusionStateNotification && m_isMenuView) { - m_exposedOnMoveToWindow = true; - m_platformWindow->exposeWindow(); - } - } else if (m_exposedOnMoveToWindow) { - m_exposedOnMoveToWindow = false; - m_platformWindow->obscureWindow(); - } } - (void)viewWillMoveToWindow:(NSWindow *)newWindow { // ### Merge "normal" window code path with this one for 5.1. - if (!(m_window->type() & Qt::SubWindow)) + if (!(m_platformWindow->window()->type() & Qt::SubWindow)) return; if (newWindow) { @@ -323,11 +299,11 @@ static bool _q_dontOverrideCtrlLMB = false; - (QWindow *)topLevelWindow { - QWindow *focusWindow = m_window; + QWindow *focusWindow = m_platformWindow->window(); // For widgets we need to do a bit of trickery as the window // to activate is the window of the top-level widget. - if (qstrcmp(m_window->metaObject()->className(), "QWidgetWindow") == 0) { + if (qstrcmp(focusWindow->metaObject()->className(), "QWidgetWindow") == 0) { while (focusWindow->parent()) { focusWindow = focusWindow->parent(); } @@ -343,9 +319,9 @@ static bool _q_dontOverrideCtrlLMB = false; if (m_platformWindow->m_isNSWindowChild) { return; #if 0 - //geometry = qt_mac_toQRect([self frame]); + //geometry = QRectF::fromCGRect([self frame]).toRect(); qDebug() << "nsview updateGeometry" << m_platformWindow->window(); - QRect screenRect = qt_mac_toQRect([m_platformWindow->m_nsWindow convertRectToScreen:[self frame]]); + QRect screenRect = QRectF::fromCGRect([m_platformWindow->m_nsWindow convertRectToScreen:[self frame]]).toRect(); qDebug() << "screenRect" << screenRect; screenRect.moveTop(qt_mac_flipYCoordinate(screenRect.y() + screenRect.height())); @@ -358,12 +334,12 @@ static bool _q_dontOverrideCtrlLMB = false; NSRect rect = [self frame]; NSRect windowRect = [[self window] frame]; geometry = QRect(windowRect.origin.x, qt_mac_flipYCoordinate(windowRect.origin.y + rect.size.height), rect.size.width, rect.size.height); - } else if (m_platformWindow->m_contentViewIsToBeEmbedded) { + } else if (m_platformWindow->m_viewIsToBeEmbedded) { // embedded child window, use the frame rect ### merge with case below - geometry = qt_mac_toQRect([self bounds]); + geometry = QRectF::fromCGRect([self bounds]).toRect(); } else { // child window, use the frame rect - geometry = qt_mac_toQRect([self frame]); + geometry = QRectF::fromCGRect([self frame]).toRect(); } if (m_platformWindow->m_nsWindow && geometry == m_platformWindow->geometry()) @@ -377,7 +353,7 @@ static bool _q_dontOverrideCtrlLMB = false; if (m_platformWindow->m_inSetStyleMask && !self.window) return; - qCDebug(lcQpaCocoaWindow) << "[QNSView udpateGeometry:]" << m_window + qCDebug(lcQpaCocoaWindow) << "[QNSView udpateGeometry:]" << m_platformWindow->window() << "current" << m_platformWindow->geometry() << "new" << geometry; // Call setGeometry on QPlatformWindow. (not on QCocoaWindow, @@ -388,12 +364,12 @@ static bool _q_dontOverrideCtrlLMB = false; // Don't send the geometry change if the QWindow is designated to be // embedded in a foreign view hiearchy but has not actually been // embedded yet - it's too early. - if (m_platformWindow->m_contentViewIsToBeEmbedded && !m_platformWindow->m_contentViewIsEmbedded) + if (m_platformWindow->m_viewIsToBeEmbedded && !m_platformWindow->m_viewIsEmbedded) return; // Send a geometry change event to Qt, if it's ready to handle events if (!m_platformWindow->m_inConstructor) { - QWindowSystemInterface::handleGeometryChange(m_window, geometry); + QWindowSystemInterface::handleGeometryChange(m_platformWindow->window(), geometry); m_platformWindow->updateExposedGeometry(); // Guard against processing window system events during QWindow::setGeometry // calles, which Qt and Qt applications do not excpect. @@ -412,7 +388,7 @@ static bool _q_dontOverrideCtrlLMB = false; // So we should say that it is maximized because it actually is. if (newState == Qt::WindowNoState && m_platformWindow->m_effectivelyMaximized) newState = Qt::WindowMaximized; - QWindowSystemInterface::handleWindowStateChanged(m_window, newState); + QWindowSystemInterface::handleWindowStateChanged(m_platformWindow->window(), newState); // We want to read the window state back from the window, // but the event we just sent may be asynchronous. QWindowSystemInterface::flushWindowSystemEvents(); @@ -421,18 +397,18 @@ static bool _q_dontOverrideCtrlLMB = false; - (void)windowNotification : (NSNotification *) windowNotification { - //qDebug() << "windowNotification" << QCFString::toQString([windowNotification name]); + //qDebug() << "windowNotification" << QString::fromNSString([windowNotification name]); NSString *notificationName = [windowNotification name]; if (notificationName == NSWindowDidBecomeKeyNotification) { if (!m_platformWindow->windowIsPopupType() && !m_isMenuView) - QWindowSystemInterface::handleWindowActivated(m_window); + QWindowSystemInterface::handleWindowActivated(m_platformWindow->window()); } else if (notificationName == NSWindowDidResignKeyNotification) { // key window will be non-nil if another window became key... do not // set the active window to zero here, the new key window's // NSWindowDidBecomeKeyNotification hander will change the active window NSWindow *keyWindow = [NSApp keyWindow]; - if (!keyWindow) { + if (!keyWindow || keyWindow == windowNotification.object) { // no new key window, go ahead and set the active window to zero if (!m_platformWindow->windowIsPopupType() && !m_isMenuView) QWindowSystemInterface::handleWindowActivated(0); @@ -446,14 +422,7 @@ static bool _q_dontOverrideCtrlLMB = false; m_platformWindow->obscureWindow(); } else if ([notificationName isEqualToString: @"NSWindowDidOrderOnScreenAndFinishAnimatingNotification"]) { m_platformWindow->exposeWindow(); - } else if (_q_NSWindowDidChangeOcclusionStateNotification - && [notificationName isEqualToString:_q_NSWindowDidChangeOcclusionStateNotification]) { -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_9 -// ### HACK Remove the enum declaration, the warning disabling and the cast further down once 10.8 is unsupported -QT_WARNING_PUSH -QT_WARNING_DISABLE_CLANG("-Wobjc-method-access") - enum { NSWindowOcclusionStateVisible = 1UL << 1 }; -#endif + } else if ([notificationName isEqualToString:NSWindowDidChangeOcclusionStateNotification]) { // Several unit tests expect paint and/or expose events for windows that are // sometimes (unpredictably) occluded and some unit tests depend on QWindow::isExposed - // don't send Expose/Obscure events when running under QTestLib. @@ -466,16 +435,13 @@ QT_WARNING_DISABLE_CLANG("-Wobjc-method-access") m_platformWindow->obscureWindow(); } } -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_9 -QT_WARNING_POP -#endif } else if (notificationName == NSWindowDidChangeScreenNotification) { - if (m_window) { + if (m_platformWindow->window()) { NSUInteger screenIndex = [[NSScreen screens] indexOfObject:self.window.screen]; if (screenIndex != NSNotFound) { QCocoaScreen *cocoaScreen = QCocoaIntegration::instance()->screenAtIndex(screenIndex); if (cocoaScreen) - QWindowSystemInterface::handleWindowScreenChanged(m_window, cocoaScreen->screen()); + QWindowSystemInterface::handleWindowScreenChanged(m_platformWindow->window(), cocoaScreen->screen()); m_platformWindow->updateExposedGeometry(); } } @@ -522,11 +488,11 @@ QT_WARNING_POP - (void) flushBackingStore:(QCocoaBackingStore *)backingStore region:(const QRegion &)region offset:(QPoint)offset { - qCDebug(lcQpaCocoaWindow) << "[QNSView flushBackingStore:]" << m_window << region.rectCount() << region.boundingRect() << offset; + qCDebug(lcQpaCocoaWindow) << "[QNSView flushBackingStore:]" << m_platformWindow->window() << region.rectCount() << region.boundingRect() << offset; m_backingStore = backingStore; - m_backingStoreOffset = offset * m_backingStore->getBackingStoreDevicePixelRatio(); - foreach (QRect rect, region.rects()) + m_backingStoreOffset = offset * m_backingStore->paintDevice()->devicePixelRatio(); + for (const QRect &rect : region) [self setNeedsDisplayInRect:NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height())]; } @@ -587,7 +553,7 @@ QT_WARNING_POP - (void) drawRect:(NSRect)dirtyRect { - qCDebug(lcQpaCocoaWindow) << "[QNSView drawRect:]" << m_window << qt_mac_toQRect(dirtyRect); + qCDebug(lcQpaCocoaWindow) << "[QNSView drawRect:]" << m_platformWindow->window() << QRectF::fromCGRect(dirtyRect); #ifndef QT_NO_OPENGL if (m_glContext && m_shouldSetGLContextinDrawRect) { @@ -599,6 +565,18 @@ QT_WARNING_POP if (m_platformWindow->m_drawContentBorderGradient) NSDrawWindowBackground(dirtyRect); + if (m_backingStore) + [self drawBackingStoreUsingCoreGraphics:dirtyRect]; + + [self invalidateWindowShadowIfNeeded]; +} + +// Draws the backing store content to the QNSView using Core Graphics. +// This function assumes that the QNSView is in a configuration that +// supports Core Graphics, such as "classic" mode or layer mode with +// the default layer. +- (void)drawBackingStoreUsingCoreGraphics:(NSRect)dirtyRect +{ if (!m_backingStore) return; @@ -607,7 +585,7 @@ QT_WARNING_POP // The backing store source rect will be larger on retina displays. // Scale dirtyRect by the device pixel ratio: - const qreal devicePixelRatio = m_backingStore->getBackingStoreDevicePixelRatio(); + const qreal devicePixelRatio = m_backingStore->paintDevice()->devicePixelRatio(); CGRect dirtyBackingRect = CGRectMake(dirtyRect.origin.x * devicePixelRatio, dirtyRect.origin.y * devicePixelRatio, dirtyRect.size.width * devicePixelRatio, @@ -653,8 +631,6 @@ QT_WARNING_POP CGImageRelease(cleanImg); CGImageRelease(subMask); CGImageRelease(bsCGImage); - - [self invalidateWindowShadowIfNeeded]; } - (BOOL) isFlipped @@ -662,11 +638,17 @@ QT_WARNING_POP return YES; } +- (BOOL)isTransparentForUserInput +{ + return m_platformWindow->window() && + m_platformWindow->window()->flags() & Qt::WindowTransparentForInput; +} + - (BOOL)becomeFirstResponder { - if (!m_window || !m_platformWindow) + if (!m_platformWindow) return NO; - if (m_window->flags() & Qt::WindowTransparentForInput) + if ([self isTransparentForUserInput]) return NO; if (!m_platformWindow->windowIsPopupType() && !m_isMenuView) QWindowSystemInterface::handleWindowActivated([self topLevelWindow]); @@ -675,15 +657,15 @@ QT_WARNING_POP - (BOOL)acceptsFirstResponder { - if (!m_window || !m_platformWindow) + if (!m_platformWindow) return NO; if (m_isMenuView) return NO; if (m_platformWindow->shouldRefuseKeyWindowAndFirstResponder()) return NO; - if (m_window->flags() & Qt::WindowTransparentForInput) + if ([self isTransparentForUserInput]) return NO; - if ((m_window->flags() & Qt::ToolTip) == Qt::ToolTip) + if ((m_platformWindow->window()->flags() & Qt::ToolTip) == Qt::ToolTip) return NO; return YES; } @@ -691,9 +673,9 @@ QT_WARNING_POP - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent { Q_UNUSED(theEvent) - if (!m_window || !m_platformWindow) + if (!m_platformWindow) return NO; - if (m_window->flags() & Qt::WindowTransparentForInput) + if ([self isTransparentForUserInput]) return NO; return YES; } @@ -702,7 +684,7 @@ QT_WARNING_POP { NSView *candidate = [super hitTest:aPoint]; if (candidate == self) { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput)) + if ([self isTransparentForUserInput]) return nil; } return candidate; @@ -769,7 +751,7 @@ QT_WARNING_POP QNSView *targetView = self; if (m_platformWindow && m_platformWindow->m_forwardWindow) { if (theEvent.type == NSLeftMouseDragged || theEvent.type == NSLeftMouseUp) - targetView = m_platformWindow->m_forwardWindow->m_qtView; + targetView = qnsview_cast(m_platformWindow->m_forwardWindow->view()); else m_platformWindow->m_forwardWindow.clear(); } @@ -779,7 +761,7 @@ QT_WARNING_POP // Tooltips must be transparent for mouse events // The bug reference is QTBUG-46379 if (!popup->m_windowFlags.testFlag(Qt::ToolTip)) { - if (QNSView *popupView = popup->qtView()) + if (QNSView *popupView = qnsview_cast(popup->view())) targetView = popupView; } } @@ -791,7 +773,7 @@ QT_WARNING_POP nativeDrag->setLastMouseEvent(theEvent, self); Qt::KeyboardModifiers keyboardModifiers = [QNSView convertKeyModifiers:[theEvent modifierFlags]]; - QWindowSystemInterface::handleMouseEvent(targetView->m_window, timestamp, qtWindowPoint, qtScreenPoint, + QWindowSystemInterface::handleMouseEvent(targetView->m_platformWindow->window(), timestamp, qtWindowPoint, qtScreenPoint, m_buttons, keyboardModifiers, Qt::MouseEventNotSynthesized); } @@ -845,12 +827,12 @@ QT_WARNING_POP QPoint qtScreenPoint = QPoint(screenPoint.x, qt_mac_flipYCoordinate(screenPoint.y)); ulong timestamp = [theEvent timestamp] * 1000; - QWindowSystemInterface::handleFrameStrutMouseEvent(m_window, timestamp, qtWindowPoint, qtScreenPoint, m_frameStrutButtons); + QWindowSystemInterface::handleFrameStrutMouseEvent(m_platformWindow->window(), timestamp, qtWindowPoint, qtScreenPoint, m_frameStrutButtons); } - (bool)handleMouseDownEvent:(NSEvent *)theEvent { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput)) + if ([self isTransparentForUserInput]) return false; Qt::MouseButton button = cocoaButton2QtButton([theEvent buttonNumber]); @@ -882,7 +864,7 @@ QT_WARNING_POP - (bool)handleMouseDraggedEvent:(NSEvent *)theEvent { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput)) + if ([self isTransparentForUserInput]) return false; Qt::MouseButton button = cocoaButton2QtButton([theEvent buttonNumber]); @@ -898,7 +880,7 @@ QT_WARNING_POP - (bool)handleMouseUpEvent:(NSEvent *)theEvent { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput)) + if ([self isTransparentForUserInput]) return false; Qt::MouseButton button = cocoaButton2QtButton([theEvent buttonNumber]); @@ -921,7 +903,7 @@ QT_WARNING_POP - (void)mouseDown:(NSEvent *)theEvent { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) + if ([self isTransparentForUserInput]) return [super mouseDown:theEvent]; m_sendUpAsRightButton = false; @@ -1079,7 +1061,7 @@ QT_WARNING_POP - (void)mouseMovedImpl:(NSEvent *)theEvent { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) + if ([self isTransparentForUserInput]) return; QPointF windowPoint; @@ -1101,7 +1083,7 @@ QT_WARNING_POP // Cocoa keeps firing mouse move events for obscured parent views. Qt should not // send those events so filter them out here. - if (childWindow != m_window) + if (childWindow != m_platformWindow->window()) return; [self handleMouseEvent: theEvent]; @@ -1112,7 +1094,7 @@ QT_WARNING_POP Q_UNUSED(theEvent) m_platformWindow->m_windowUnderMouse = true; - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) + if ([self isTransparentForUserInput]) return; // Top-level windows generate enter events for sub-windows. @@ -1131,7 +1113,7 @@ QT_WARNING_POP Q_UNUSED(theEvent); m_platformWindow->m_windowUnderMouse = false; - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) + if ([self isTransparentForUserInput]) return; // Top-level windows generate leave events for sub-windows. @@ -1207,16 +1189,16 @@ Q_GLOBAL_STATIC(QCocoaTabletDeviceDataHash, tabletDeviceDataHash) windowPoint.x(), windowPoint.y(), screenPoint.x(), screenPoint.y(), static_cast<uint>(buttons), pressure, xTilt, yTilt, rotation); - QWindowSystemInterface::handleTabletEvent(m_window, timestamp, windowPoint, screenPoint, + QWindowSystemInterface::handleTabletEvent(m_platformWindow->window(), timestamp, windowPoint, screenPoint, deviceData.device, deviceData.pointerType, buttons, pressure, xTilt, yTilt, tangentialPressure, rotation, z, deviceData.uid, keyboardModifiers); return true; } -- (void)tabletPoint: (NSEvent *)theEvent +- (void)tabletPoint:(NSEvent *)theEvent { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) + if ([self isTransparentForUserInput]) return [super tabletPoint:theEvent]; [self handleTabletEvent: theEvent]; @@ -1262,9 +1244,9 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) return device; } -- (void)tabletProximity: (NSEvent *)theEvent +- (void)tabletProximity:(NSEvent *)theEvent { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) + if ([self isTransparentForUserInput]) return [super tabletProximity:theEvent]; ulong timestamp = [theEvent timestamp] * 1000; @@ -1311,11 +1293,11 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) } } -- (bool) shouldSendSingleTouch +- (bool)shouldSendSingleTouch { // QtWidgets expects single-point touch events, QtDeclarative does not. // Until there is an API we solve this by looking at the window class type. - return m_window->inherits("QWidgetWindow"); + return m_platformWindow->window()->inherits("QWidgetWindow"); } - (void)touchesBeganWithEvent:(NSEvent *)event @@ -1323,7 +1305,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) const NSTimeInterval timestamp = [event timestamp]; const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]); qCDebug(lcQpaTouch) << "touchesBeganWithEvent" << points; - QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points); + QWindowSystemInterface::handleTouchEvent(m_platformWindow->window(), timestamp * 1000, touchDevice, points); } - (void)touchesMovedWithEvent:(NSEvent *)event @@ -1331,7 +1313,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) const NSTimeInterval timestamp = [event timestamp]; const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]); qCDebug(lcQpaTouch) << "touchesMovedWithEvent" << points; - QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points); + QWindowSystemInterface::handleTouchEvent(m_platformWindow->window(), timestamp * 1000, touchDevice, points); } - (void)touchesEndedWithEvent:(NSEvent *)event @@ -1339,7 +1321,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) const NSTimeInterval timestamp = [event timestamp]; const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]); qCDebug(lcQpaTouch) << "touchesEndedWithEvent" << points; - QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points); + QWindowSystemInterface::handleTouchEvent(m_platformWindow->window(), timestamp * 1000, touchDevice, points); } - (void)touchesCancelledWithEvent:(NSEvent *)event @@ -1347,7 +1329,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) const NSTimeInterval timestamp = [event timestamp]; const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]); qCDebug(lcQpaTouch) << "touchesCancelledWithEvent" << points; - QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points); + QWindowSystemInterface::handleTouchEvent(m_platformWindow->window(), timestamp * 1000, touchDevice, points); } #ifndef QT_NO_GESTURES @@ -1379,11 +1361,10 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) QPointF windowPoint; QPointF screenPoint; [self convertFromScreen:[self screenMousePoint:event] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - QWindowSystemInterface::handleGestureEventWithRealValue(m_window, timestamp, Qt::ZoomNativeGesture, + QWindowSystemInterface::handleGestureEventWithRealValue(m_platformWindow->window(), timestamp, Qt::ZoomNativeGesture, [event magnification], windowPoint, screenPoint); } -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 - (void)smartMagnifyWithEvent:(NSEvent *)event { static bool zoomIn = true; @@ -1392,11 +1373,10 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) QPointF windowPoint; QPointF screenPoint; [self convertFromScreen:[self screenMousePoint:event] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - QWindowSystemInterface::handleGestureEventWithRealValue(m_window, timestamp, Qt::SmartZoomNativeGesture, + QWindowSystemInterface::handleGestureEventWithRealValue(m_platformWindow->window(), timestamp, Qt::SmartZoomNativeGesture, zoomIn ? 1.0f : 0.0f, windowPoint, screenPoint); zoomIn = !zoomIn; } -#endif - (void)rotateWithEvent:(NSEvent *)event { @@ -1407,7 +1387,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) QPointF windowPoint; QPointF screenPoint; [self convertFromScreen:[self screenMousePoint:event] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - QWindowSystemInterface::handleGestureEventWithRealValue(m_window, timestamp, Qt::RotateNativeGesture, + QWindowSystemInterface::handleGestureEventWithRealValue(m_platformWindow->window(), timestamp, Qt::RotateNativeGesture, -[event rotation], windowPoint, screenPoint); } @@ -1429,7 +1409,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) else if ([event deltaY] == -1) angle = 270.0f; - QWindowSystemInterface::handleGestureEventWithRealValue(m_window, timestamp, Qt::SwipeNativeGesture, + QWindowSystemInterface::handleGestureEventWithRealValue(m_platformWindow->window(), timestamp, Qt::SwipeNativeGesture, angle, windowPoint, screenPoint); } @@ -1440,7 +1420,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) QPointF screenPoint; [self convertFromScreen:[self screenMousePoint:event] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; qCDebug(lcQpaGestures) << "beginGestureWithEvent @" << windowPoint; - QWindowSystemInterface::handleGestureEvent(m_window, timestamp, Qt::BeginNativeGesture, + QWindowSystemInterface::handleGestureEvent(m_platformWindow->window(), timestamp, Qt::BeginNativeGesture, windowPoint, screenPoint); } @@ -1451,7 +1431,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) QPointF windowPoint; QPointF screenPoint; [self convertFromScreen:[self screenMousePoint:event] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - QWindowSystemInterface::handleGestureEvent(m_window, timestamp, Qt::EndNativeGesture, + QWindowSystemInterface::handleGestureEvent(m_platformWindow->window(), timestamp, Qt::EndNativeGesture, windowPoint, screenPoint); } #endif // QT_NO_GESTURES @@ -1459,7 +1439,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) #ifndef QT_NO_WHEELEVENT - (void)scrollWheel:(NSEvent *)theEvent { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) + if ([self isTransparentForUserInput]) return [super scrollWheel:theEvent]; QPoint angleDelta; @@ -1512,16 +1492,12 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) NSEventPhase phase = [theEvent phase]; Qt::ScrollPhase ph = Qt::ScrollUpdate; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 - if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) { - // On 10.8 and above, MayBegin is likely to happen. We treat it the same as an actual begin. - if (phase == NSEventPhaseMayBegin) { - m_scrolling = true; - ph = Qt::ScrollBegin; - } - } -#endif - if (phase == NSEventPhaseBegan) { + + // MayBegin is likely to happen. We treat it the same as an actual begin. + if (phase == NSEventPhaseMayBegin) { + m_scrolling = true; + ph = Qt::ScrollBegin; + } else if (phase == NSEventPhaseBegan) { // If MayBegin did not happen, Began is the actual beginning. if (!m_scrolling) ph = Qt::ScrollBegin; @@ -1536,7 +1512,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) // "isInverted": natural OS X scrolling, inverted from the Qt/other platform/Jens perspective. bool isInverted = [theEvent isDirectionInvertedFromDevice]; - QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_screenPoint, pixelDelta, angleDelta, currentWheelModifiers, ph, source, isInverted); + QWindowSystemInterface::handleWheelEvent(m_platformWindow->window(), qt_timestamp, qt_windowPoint, qt_screenPoint, pixelDelta, angleDelta, currentWheelModifiers, ph, source, isInverted); } #endif //QT_NO_WHEELEVENT @@ -1595,7 +1571,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) // ignore text for the U+F700-U+F8FF range. This is used by Cocoa when // delivering function keys (e.g. arrow keys, backspace, F1-F35, etc.) if (!(modifiers & (Qt::ControlModifier | Qt::MetaModifier)) && (ch.unicode() < 0xf700 || ch.unicode() > 0xf8ff)) - text = QCFString::toQString(characters); + text = QString::fromNSString(characters); QWindow *window = [self topLevelWindow]; @@ -1644,7 +1620,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) - (void)keyDown:(NSEvent *)nsevent { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) + if ([self isTransparentForUserInput]) return [super keyDown:nsevent]; const bool accepted = [self handleKeyEvent:nsevent eventType:int(QEvent::KeyPress)]; @@ -1666,7 +1642,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) - (void)keyUp:(NSEvent *)nsevent { - if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) + if ([self isTransparentForUserInput]) return [super keyUp:nsevent]; const bool keyUpAccepted = [self handleKeyEvent:nsevent eventType:int(QEvent::KeyRelease)]; @@ -1727,7 +1703,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) if ((delta & mac_mask) == 0u) continue; - QWindowSystemInterface::handleKeyEvent(m_window, + QWindowSystemInterface::handleKeyEvent(m_platformWindow->window(), timestamp, (lastKnownModifiers & mac_mask) ? QEvent::KeyRelease : QEvent::KeyPress, modifier_key_symbols[i].qt_code, @@ -1758,9 +1734,9 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) QString commitString; if ([aString length]) { if ([aString isKindOfClass:[NSAttributedString class]]) { - commitString = QCFString::toQString(reinterpret_cast<CFStringRef>([aString string])); + commitString = QString::fromCFString(reinterpret_cast<CFStringRef>([aString string])); } else { - commitString = QCFString::toQString(reinterpret_cast<CFStringRef>(aString)); + commitString = QString::fromCFString(reinterpret_cast<CFStringRef>(aString)); }; } QObject *fo = QGuiApplication::focusObject(); @@ -1790,7 +1766,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) if ([aString isKindOfClass:[NSAttributedString class]]) { // Preedit string has attribution - preeditString = QCFString::toQString(reinterpret_cast<CFStringRef>([aString string])); + preeditString = QString::fromCFString(reinterpret_cast<CFStringRef>([aString string])); int composingLength = preeditString.length(); int index = 0; // Create attributes for individual sections of preedit text @@ -1819,7 +1795,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) } } else { // No attributes specified, take only the preedit text. - preeditString = QCFString::toQString(reinterpret_cast<CFStringRef>(aString)); + preeditString = QString::fromCFString(reinterpret_cast<CFStringRef>(aString)); } if (attrs.isEmpty()) { @@ -1938,12 +1914,12 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) if (!queryEvent.value(Qt::ImEnabled).toBool()) return NSZeroRect; - if (!m_window) + if (!m_platformWindow->window()) return NSZeroRect; // The returned rect is always based on the internal cursor. QRect mr = qApp->inputMethod()->cursorRectangle().toRect(); - QPoint mp = m_window->mapToGlobal(mr.bottomLeft()); + QPoint mp = m_platformWindow->window()->mapToGlobal(mr.bottomLeft()); NSRect rect; rect.origin.x = mp.x(); @@ -1960,9 +1936,9 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) return NSNotFound; } -- (NSArray*) validAttributesForMarkedText +- (NSArray*)validAttributesForMarkedText { - if (m_window != QGuiApplication::focusWindow()) + if (m_platformWindow->window() != QGuiApplication::focusWindow()) return nil; QObject *fo = QGuiApplication::focusObject(); @@ -2000,7 +1976,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) NSMultipleTextSelectionPboardType, mimeTypeGeneric, nil]; // Add custom types supported by the application. for (int i = 0; i < customTypes.size(); i++) { - [supportedTypes addObject:QCFString::toNSString(customTypes[i])]; + [supportedTypes addObject:customTypes[i].toNSString()]; } [self registerForDraggedTypes:supportedTypes]; } @@ -2137,7 +2113,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin QPoint qt_windowPoint(windowPoint.x, windowPoint.y); Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations([sender draggingSourceOperationMask]); - QWindow *target = findEventTargetWindow(m_window); + QWindow *target = findEventTargetWindow(m_platformWindow->window()); if (!target) return NSDragOperationNone; @@ -2148,11 +2124,11 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); if (nativeDrag->currentDrag()) { // The drag was started from within the application - response = QWindowSystemInterface::handleDrag(target, nativeDrag->platformDropData(), mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed); + response = QWindowSystemInterface::handleDrag(target, nativeDrag->platformDropData(), mapWindowCoordinates(m_platformWindow->window(), target, qt_windowPoint), qtAllowed); [self updateCursorFromDragResponse:response drag:nativeDrag]; } else { QCocoaDropData mimeData([sender draggingPasteboard]); - response = QWindowSystemInterface::handleDrag(target, &mimeData, mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed); + response = QWindowSystemInterface::handleDrag(target, &mimeData, mapWindowCoordinates(m_platformWindow->window(), target, qt_windowPoint), qtAllowed); } return qt_mac_mapDropAction(response.acceptedAction()); @@ -2160,7 +2136,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin - (void)draggingExited:(id <NSDraggingInfo>)sender { - QWindow *target = findEventTargetWindow(m_window); + QWindow *target = findEventTargetWindow(m_platformWindow->window()); if (!target) return; @@ -2168,13 +2144,13 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin QPoint qt_windowPoint(windowPoint.x, windowPoint.y); // Send 0 mime data to indicate drag exit - QWindowSystemInterface::handleDrag(target, 0, mapWindowCoordinates(m_window, target, qt_windowPoint), Qt::IgnoreAction); + QWindowSystemInterface::handleDrag(target, 0, mapWindowCoordinates(m_platformWindow->window(), target, qt_windowPoint), Qt::IgnoreAction); } // called on drop, send the drop to Qt and return if it was accepted. - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender { - QWindow *target = findEventTargetWindow(m_window); + QWindow *target = findEventTargetWindow(m_platformWindow->window()); if (!target) return false; @@ -2186,10 +2162,10 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); if (nativeDrag->currentDrag()) { // The drag was started from within the application - response = QWindowSystemInterface::handleDrop(target, nativeDrag->platformDropData(), mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed); + response = QWindowSystemInterface::handleDrop(target, nativeDrag->platformDropData(), mapWindowCoordinates(m_platformWindow->window(), target, qt_windowPoint), qtAllowed); } else { QCocoaDropData mimeData([sender draggingPasteboard]); - response = QWindowSystemInterface::handleDrop(target, &mimeData, mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed); + response = QWindowSystemInterface::handleDrop(target, &mimeData, mapWindowCoordinates(m_platformWindow->window(), target, qt_windowPoint), qtAllowed); } if (response.isAccepted()) { QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); @@ -2204,7 +2180,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin { Q_UNUSED(session); Q_UNUSED(operation); - QWindow *target = findEventTargetWindow(m_window); + QWindow *target = findEventTargetWindow(m_platformWindow->window()); if (!target) return; @@ -2221,7 +2197,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin QPoint qtScreenPoint = QPoint(screenPoint.x, qt_mac_flipYCoordinate(screenPoint.y)); - QWindowSystemInterface::handleMouseEvent(target, mapWindowCoordinates(m_window, target, qtWindowPoint), qtScreenPoint, m_buttons); + QWindowSystemInterface::handleMouseEvent(target, mapWindowCoordinates(m_platformWindow->window(), target, qtWindowPoint), qtScreenPoint, m_buttons); } @end |