diff options
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoawindow.mm | 20 | ||||
-rw-r--r-- | src/plugins/platforms/offscreen/qoffscreenwindow.cpp | 16 |
2 files changed, 36 insertions, 0 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 16e33ee014..5b23bb3174 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -1225,12 +1225,32 @@ void QCocoaWindow::windowDidResignKey() void QCocoaWindow::windowDidOrderOnScreen() { + // The current mouse window needs to get a leave event when a popup window opens. + // For modal dialogs, QGuiApplicationPrivate::showModalWindow takes care of this. + if (QWindowPrivate::get(window())->isPopup()) { + QWindowSystemInterface::handleLeaveEvent<QWindowSystemInterface::SynchronousDelivery> + (QGuiApplicationPrivate::currentMouseWindow); + } + [m_view setNeedsDisplay:YES]; } void QCocoaWindow::windowDidOrderOffScreen() { handleExposeEvent(QRegion()); + // We are closing a window, so the window that is now under the mouse + // might need to get an Enter event if it isn't already the mouse window. + if (window()->type() & Qt::Window) { + const QPointF screenPoint = QCocoaScreen::mapFromNative([NSEvent mouseLocation]); + if (QWindow *windowUnderMouse = QGuiApplication::topLevelAt(screenPoint.toPoint())) { + if (windowUnderMouse != QGuiApplicationPrivate::instance()->currentMouseWindow) { + const auto windowPoint = windowUnderMouse->mapFromGlobal(screenPoint); + // asynchronous delivery on purpose + QWindowSystemInterface::handleEnterEvent<QWindowSystemInterface::AsynchronousDelivery> + (windowUnderMouse, windowPoint, screenPoint); + } + } + } } void QCocoaWindow::windowDidChangeOcclusionState() diff --git a/src/plugins/platforms/offscreen/qoffscreenwindow.cpp b/src/plugins/platforms/offscreen/qoffscreenwindow.cpp index a46258a401..20aae06650 100644 --- a/src/plugins/platforms/offscreen/qoffscreenwindow.cpp +++ b/src/plugins/platforms/offscreen/qoffscreenwindow.cpp @@ -44,6 +44,7 @@ #include <qpa/qwindowsysteminterface.h> #include <private/qwindow_p.h> +#include <private/qguiapplication_p.h> QT_BEGIN_NAMESPACE @@ -129,11 +130,26 @@ void QOffscreenWindow::setVisible(bool visible) } } + const QPoint cursorPos = QCursor::pos(); if (visible) { QRect rect(QPoint(), geometry().size()); QWindowSystemInterface::handleExposeEvent(window(), rect); + if (QWindowPrivate::get(window())->isPopup() && QGuiApplicationPrivate::currentMouseWindow) { + QWindowSystemInterface::handleLeaveEvent<QWindowSystemInterface::SynchronousDelivery> + (QGuiApplicationPrivate::currentMouseWindow); + } + if (geometry().contains(cursorPos)) + QWindowSystemInterface::handleEnterEvent(window(), + window()->mapFromGlobal(cursorPos), cursorPos); } else { QWindowSystemInterface::handleExposeEvent(window(), QRegion()); + if (window()->type() & Qt::Window) { + if (QWindow *windowUnderMouse = QGuiApplication::topLevelAt(cursorPos)) { + QWindowSystemInterface::handleEnterEvent(windowUnderMouse, + windowUnderMouse->mapFromGlobal(cursorPos), + cursorPos); + } + } } m_visible = visible; |