diff options
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoawindow.h | 2 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoawindow.mm | 86 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qnsview.h | 3 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qnsview.mm | 49 |
4 files changed, 98 insertions, 42 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 68cf72b0fb..0d7b8aa954 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -95,6 +95,7 @@ public: void setCocoaGeometry(const QRect &rect); void setVisible(bool visible); Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags); + Qt::WindowState setWindowState(Qt::WindowState state); void setWindowTitle(const QString &title); void raise(); void lower(); @@ -129,6 +130,7 @@ protected: QRect windowGeometry() const; QCocoaWindow *parentCocoaWindow() const; + void syncWindowState(Qt::WindowState newState); // private: public: // for QNSView diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index f3458c2540..5c8ea055b5 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -165,15 +165,23 @@ void QCocoaWindow::setVisible(bool visible) QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRect(QPoint(), geometry().size())); if (m_nsWindow) { - if ([m_nsWindow canBecomeKeyWindow]) - [m_nsWindow makeKeyAndOrderFront:nil]; - else - [m_nsWindow orderFront: nil]; + // setWindowState might have been called while the window was hidden and + // will not change the NSWindow state in that case. Sync up here: + syncWindowState(window()->windowState()); + + if (window()->windowState() != Qt::WindowMinimized) { + if ([m_nsWindow canBecomeKeyWindow]) + [m_nsWindow makeKeyAndOrderFront:nil]; + else + [m_nsWindow orderFront: nil]; + } } } else { // qDebug() << "close" << this; if (m_nsWindow) [m_nsWindow orderOut:m_nsWindow]; + if (!QCoreApplication::closingDown()) + QWindowSystemInterface::handleExposeEvent(window(), QRegion()); } } @@ -183,6 +191,14 @@ Qt::WindowFlags QCocoaWindow::setWindowFlags(Qt::WindowFlags flags) return m_windowFlags; } +Qt::WindowState QCocoaWindow::setWindowState(Qt::WindowState state) +{ + if ([m_nsWindow isVisible]) + syncWindowState(state); // Window state set for hidden windows take effect when show() is called. + + return state; +} + void QCocoaWindow::setWindowTitle(const QString &title) { QCocoaAutoReleasePool pool; @@ -446,27 +462,12 @@ void QCocoaWindow::setNSWindow(NSWindow *window) // QCocoaWindow is deleted by Qt. [window setReleasedWhenClosed : NO]; - [[NSNotificationCenter defaultCenter] addObserver:m_contentView - selector:@selector(windowDidBecomeKey) - name:NSWindowDidBecomeKeyNotification - object:m_nsWindow]; - - [[NSNotificationCenter defaultCenter] addObserver:m_contentView - selector:@selector(windowDidResignKey) - name:NSWindowDidResignKeyNotification - object:m_nsWindow]; - - [[NSNotificationCenter defaultCenter] addObserver:m_contentView - selector:@selector(windowDidBecomeMain) - name:NSWindowDidBecomeMainNotification - object:m_nsWindow]; [[NSNotificationCenter defaultCenter] addObserver:m_contentView - selector:@selector(windowDidResignMain) - name:NSWindowDidResignMainNotification + selector:@selector(windowNotification:) + name:nil // Get all notifications object:m_nsWindow]; - // ### Accept touch events by default. // Beware that enabling touch events has a negative impact on the overall performance. // We probably need a QWindowSystemInterface API to enable/disable touch events. @@ -503,6 +504,49 @@ QCocoaWindow *QCocoaWindow::parentCocoaWindow() const return 0; } +// Syncs the NSWindow minimize/maximize/fullscreen state with the current QWindow state +void QCocoaWindow::syncWindowState(Qt::WindowState newState) +{ + if (!m_nsWindow) + return; + + switch (newState) { + case Qt::WindowMinimized: + [m_nsWindow performMiniaturize : m_nsWindow]; + break; + case Qt::WindowMaximized: + [m_nsWindow performZoom : m_nsWindow]; + break; + case Qt::WindowFullScreen: +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7) { + [m_nsWindow toggleFullScreen : m_nsWindow]; + } else { + qWarning("Not implemented: setWindowState WindowFullScreen"); + } +#endif + break; + + default: + // Undo current states + if ([m_nsWindow isMiniaturized]) + [m_nsWindow deminiaturize : m_nsWindow]; + + if ([m_nsWindow isZoomed]) + [m_nsWindow performZoom : m_nsWindow]; // toggles + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7) { + if (window()->windowState() & Qt::WindowFullScreen) + [m_nsWindow toggleFullScreen : m_nsWindow]; + } else { + qWarning("Not implemented: setWindowState WindowFullScreen"); + } +#endif + break; + } +} + bool QCocoaWindow::setWindowModified(bool modified) { if (!m_nsWindow) diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h index aba9a2dc65..16775621bf 100644 --- a/src/plugins/platforms/cocoa/qnsview.h +++ b/src/plugins/platforms/cocoa/qnsview.h @@ -70,8 +70,7 @@ QT_END_NAMESPACE - (void)setImage:(QImage *)image; - (void)drawRect:(NSRect)dirtyRect; - (void)updateGeometry; -- (void)windowDidBecomeKey; -- (void)windowDidResignKey; +- (void)windowNotification : (NSNotification *) windowNotification; - (BOOL)isFlipped; - (BOOL)acceptsFirstResponder; diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index 66f5d125f7..a8372f754f 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -144,29 +144,40 @@ static QTouchDevice *touchDevice = 0; QWindowSystemInterface::handleSynchronousGeometryChange(m_window, geo); } -- (void)windowDidBecomeKey -{ - if (!m_platformWindow->windowIsPopupType()) - QWindowSystemInterface::handleWindowActivated(m_window); -} - -- (void)windowDidResignKey -{ - if (!m_platformWindow->windowIsPopupType()) - QWindowSystemInterface::handleWindowActivated(0); -} +- (void)windowNotification : (NSNotification *) windowNotification +{ + //qDebug() << "windowNotification" << QCFString::toQString([windowNotification name]); + + NSString *notificationName = [windowNotification name]; + if (notificationName == NSWindowDidBecomeKeyNotification) { + if (!m_platformWindow->windowIsPopupType()) + QWindowSystemInterface::handleWindowActivated(m_window); + } else if (notificationName == NSWindowDidResignKeyNotification) { + if (!m_platformWindow->windowIsPopupType()) + QWindowSystemInterface::handleWindowActivated(0); + } else if (notificationName == NSWindowDidMiniaturizeNotification) { + QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowMinimized); + } else if (notificationName == NSWindowDidDeminiaturizeNotification) { + QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowNoState); + // Qt expects an expose event after restore/deminiaturize. This also needs + // to be a non-synchronous event to make sure it gets processed after + // the state change event sent above. + QWindowSystemInterface::handleExposeEvent(m_window, QRegion(m_window->geometry())); + } else { -- (void)windowDidBecomeMain -{ -// qDebug() << "window did become main" << m_window; -} +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7) { + if (notificationName == NSWindowDidEnterFullScreenNotification) { + QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowFullScreen); + } else if (notificationName == NSWindowDidExitFullScreenNotification) { + QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowNoState); + } + } +#endif -- (void)windowDidResignMain -{ -// qDebug() << "window did resign main" << m_window; + } } - - (void) setImage:(QImage *)image { CGImageRelease(m_cgImage); |