diff options
Diffstat (limited to 'src/plugins/platforms/cocoa/qcocoawindow.mm')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoawindow.mm | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 91ce91004f..7fb695630b 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -78,6 +78,14 @@ static bool isMouseEvent(NSEvent *ev) } } +static void qt_closePopups() +{ + while (QCocoaWindow *popup = QCocoaIntegration::instance()->popPopupWindow()) { + QWindowSystemInterface::handleCloseEvent(popup->window()); + QWindowSystemInterface::flushWindowSystemEvents(); + } +} + @implementation QNSWindowHelper @synthesize window = _window; @@ -505,7 +513,7 @@ QRect QCocoaWindow::geometry() const NSRect screenRect = [[m_contentView window] convertRectToScreen:NSMakeRect(windowPoint.x, windowPoint.y, 1, 1)]; NSPoint screenPoint = screenRect.origin; QPoint position = qt_mac_flipPoint(screenPoint).toPoint(); - QSize size = qt_mac_toQRect([m_contentView bounds]).size(); + QSize size = QRectF::fromCGRect([m_contentView bounds]).toRect().size(); return QRect(position, size); } @@ -652,7 +660,7 @@ void QCocoaWindow::setVisible(bool visible) if (visible) { // We need to recreate if the modality has changed as the style mask will need updating - if (m_windowModality != window()->modality()) + if (m_windowModality != window()->modality() || isNativeWindowTypeInconsistent()) recreateWindow(parent()); // Register popup windows. The Cocoa platform plugin will forward mouse events @@ -1023,9 +1031,7 @@ void QCocoaWindow::raise() } static bool raiseProcess = qt_mac_resolveOption(true, "QT_MAC_SET_RAISE_PROCESS"); if (raiseProcess) { - ProcessSerialNumber psn; - GetCurrentProcess(&psn); - SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); + [NSApp activateIgnoringOtherApps:YES]; } } } @@ -1107,11 +1113,10 @@ void QCocoaWindow::propagateSizeHints() // sizeIncrement is observed to take values of (-1, -1) and (0, 0) for windows that should be // resizable and that have no specific size increment set. Cocoa expects (1.0, 1.0) in this case. - const QSize sizeIncrement = windowSizeIncrement(); - if (!sizeIncrement.isEmpty()) - [m_nsWindow setResizeIncrements : qt_mac_toNSSize(sizeIncrement)]; - else - [m_nsWindow setResizeIncrements : NSMakeSize(1.0, 1.0)]; + QSize sizeIncrement = windowSizeIncrement(); + if (sizeIncrement.isEmpty()) + sizeIncrement = QSize(1, 1); + [m_nsWindow setResizeIncrements:sizeIncrement.toCGSize()]; QRect rect = geometry(); QSize baseSize = windowBaseSize(); @@ -1223,10 +1228,7 @@ void QCocoaWindow::setEmbeddedInForeignView(bool embedded) void QCocoaWindow::windowWillMove() { // Close any open popups on window move - while (QCocoaWindow *popup = QCocoaIntegration::instance()->popPopupWindow()) { - QWindowSystemInterface::handleCloseEvent(popup->window()); - QWindowSystemInterface::flushWindowSystemEvents(); - } + qt_closePopups(); } void QCocoaWindow::windowDidMove() @@ -1270,6 +1272,13 @@ bool QCocoaWindow::windowShouldClose() return accepted; } +void QCocoaWindow::windowWillClose() +{ + // Close any open popups on window closing. + if (window() && !windowIsPopupType(window()->type())) + qt_closePopups(); +} + void QCocoaWindow::setSynchedWindowStateFromWindow() { if (QWindow *w = window()) @@ -1532,6 +1541,17 @@ void QCocoaWindow::removeChildWindow(QCocoaWindow *child) [m_nsWindow removeChildWindow:child->m_nsWindow]; } +bool QCocoaWindow::isNativeWindowTypeInconsistent() +{ + if (!m_nsWindow) + return false; + + const bool isPanel = [m_nsWindow isKindOfClass:[QNSPanel class]]; + const bool usePanel = shouldUseNSPanel(); + + return isPanel != usePanel; +} + void QCocoaWindow::removeMonitor() { if (!monitor) |