diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2012-11-07 16:23:32 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-11-10 20:08:28 +0100 |
commit | 2d07d3b4e3036179667a822aa40285d071b76b9e (patch) | |
tree | 715e5c6a92426f1ac1cd4cd585e02cf8cab05002 /src/widgets | |
parent | 1fe0c2c25dc96e9af6f442cf059ad627d45f10fa (diff) |
Add a QEnterEvent containing the mouse position.
Enter handling requires knowledge of the mouse
position. Extend the enter handling of
QWindowSystemInterface to receive the position
(implemented for Windows, XCB and Mac), passing it
on to QEnterEvent. Dispatch QEnterEvent from
widgets code.
Change-Id: I49c07d2b1f46310c877017dd55d4cd7d636bdbce
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/graphicsview/qgraphicsproxywidget.cpp | 8 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 40 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication_p.h | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication_qpa.cpp | 3 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 6 |
6 files changed, 36 insertions, 25 deletions
diff --git a/src/widgets/graphicsview/qgraphicsproxywidget.cpp b/src/widgets/graphicsview/qgraphicsproxywidget.cpp index 762f93f55b..289f9919ef 100644 --- a/src/widgets/graphicsview/qgraphicsproxywidget.cpp +++ b/src/widgets/graphicsview/qgraphicsproxywidget.cpp @@ -267,7 +267,7 @@ void QGraphicsProxyWidgetPrivate::sendWidgetMouseEvent(QGraphicsSceneMouseEvent } if (!lastWidgetUnderMouse) { - QApplicationPrivate::dispatchEnterLeave(embeddedMouseGrabber ? embeddedMouseGrabber : receiver, 0); + QApplicationPrivate::dispatchEnterLeave(embeddedMouseGrabber ? embeddedMouseGrabber : receiver, 0, event->screenPos()); lastWidgetUnderMouse = receiver; } @@ -293,7 +293,7 @@ void QGraphicsProxyWidgetPrivate::sendWidgetMouseEvent(QGraphicsSceneMouseEvent else // released on the frame our outside the item, or doesn't accept hover events. lastWidgetUnderMouse = 0; - QApplicationPrivate::dispatchEnterLeave(lastWidgetUnderMouse, embeddedMouseGrabber); + QApplicationPrivate::dispatchEnterLeave(lastWidgetUnderMouse, embeddedMouseGrabber, event->screenPos()); embeddedMouseGrabber = 0; #ifndef QT_NO_CURSOR @@ -1142,7 +1142,7 @@ void QGraphicsProxyWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) Q_D(QGraphicsProxyWidget); // If hoverMove was compressed away, make sure we update properly here. if (d->lastWidgetUnderMouse) { - QApplicationPrivate::dispatchEnterLeave(0, d->lastWidgetUnderMouse); + QApplicationPrivate::dispatchEnterLeave(0, d->lastWidgetUnderMouse, event->screenPos()); d->lastWidgetUnderMouse = 0; } } @@ -1159,7 +1159,7 @@ void QGraphicsProxyWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event) // Ignore events on the window frame. if (!d->widget || !rect().contains(event->pos())) { if (d->lastWidgetUnderMouse) { - QApplicationPrivate::dispatchEnterLeave(0, d->lastWidgetUnderMouse); + QApplicationPrivate::dispatchEnterLeave(0, d->lastWidgetUnderMouse, event->screenPos()); d->lastWidgetUnderMouse = 0; } return; diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index aeceba1886..d62b8ef146 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -2114,20 +2114,23 @@ QWidget *QApplicationPrivate::focusNextPrevChild_helper(QWidget *toplevel, bool } /*! - \fn void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave) + \fn void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave, const QPointF &globalPosF) \internal Creates the proper Enter/Leave event when widget \a enter is entered and widget \a leave is left. */ -void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave) { +void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave, const QPointF &globalPosF) +{ + const QPoint globalPos = globalPosF.toPoint(); #if 0 if (leave) { QEvent e(QEvent::Leave); QApplication::sendEvent(leave, & e); } if (enter) { - QEvent e(QEvent::Enter); + const QPoint windowPos = enter->window()->mapFromGlobal(globalPos); + QEnterEvent e(enter->mapFromGlobal(globalPos), windowPos, globalPos); QApplication::sendEvent(enter, & e); } return; @@ -2205,17 +2208,20 @@ void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave) { } } } - QPoint posEnter = QCursor::pos(); - QEvent enterEvent(QEvent::Enter); - for (int i = 0; i < enterList.size(); ++i) { - w = enterList.at(i); - if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w, 0)) { - QApplication::sendEvent(w, &enterEvent); - if (w->testAttribute(Qt::WA_Hover) && - (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) { - QHoverEvent he(QEvent::HoverEnter, w->mapFromGlobal(posEnter), QPoint(-1, -1), - QApplication::keyboardModifiers()); - qApp->d_func()->notify_helper(w, &he); + if (!enterList.isEmpty()) { + const QPoint windowPos = enterList.front()->window()->mapFromGlobal(globalPos); + for (int i = 0; i < enterList.size(); ++i) { + w = enterList.at(i); + if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w, 0)) { + const QPointF localPos = w->mapFromGlobal(globalPos); + QEnterEvent enterEvent(localPos, windowPos, globalPosF); + QApplication::sendEvent(w, &enterEvent); + if (w->testAttribute(Qt::WA_Hover) && + (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) { + QHoverEvent he(QEvent::HoverEnter, localPos, QPoint(-1, -1), + QApplication::keyboardModifiers()); + qApp->d_func()->notify_helper(w, &he); + } } } } @@ -2506,9 +2512,9 @@ bool QApplicationPrivate::sendMouseEvent(QWidget *receiver, QMouseEvent *event, || (isAlien(lastMouseReceiver) && !alienWidget)) { if (activePopupWidget) { if (!QWidget::mouseGrabber()) - dispatchEnterLeave(alienWidget ? alienWidget : nativeWidget, lastMouseReceiver); + dispatchEnterLeave(alienWidget ? alienWidget : nativeWidget, lastMouseReceiver, event->screenPos()); } else { - dispatchEnterLeave(receiver, lastMouseReceiver); + dispatchEnterLeave(receiver, lastMouseReceiver, event->screenPos()); } } @@ -2540,7 +2546,7 @@ bool QApplicationPrivate::sendMouseEvent(QWidget *receiver, QMouseEvent *event, enter = alienGuard ? alienWidget : nativeWidget; else // The receiver is typically deleted on mouse release with drag'n'drop. enter = QApplication::widgetAt(event->globalPos()); - dispatchEnterLeave(enter, leaveAfterRelease); + dispatchEnterLeave(enter, leaveAfterRelease, event->screenPos()); leaveAfterRelease = 0; lastMouseReceiver = enter; } else if (!wasLeaveAfterRelease) { diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h index 5682d794cf..5b3493f478 100644 --- a/src/widgets/kernel/qapplication_p.h +++ b/src/widgets/kernel/qapplication_p.h @@ -135,7 +135,7 @@ public: void createEventDispatcher(); - static void dispatchEnterLeave(QWidget *enter, QWidget *leave); + static void dispatchEnterLeave(QWidget *enter, QWidget *leave, const QPointF &globalPosF); //modality bool isWindowBlocked(QWindow *window, QWindow **blockingWindow = 0) const Q_DECL_OVERRIDE; diff --git a/src/widgets/kernel/qapplication_qpa.cpp b/src/widgets/kernel/qapplication_qpa.cpp index 5dc68e47e0..e8db364473 100644 --- a/src/widgets/kernel/qapplication_qpa.cpp +++ b/src/widgets/kernel/qapplication_qpa.cpp @@ -253,7 +253,8 @@ void QApplicationPrivate::openPopup(QWidget *popup) // Dispatch leave for last mouse receiver to update undermouse states if (qt_last_mouse_receiver && !QWidget::mouseGrabber()) { - QApplicationPrivate::dispatchEnterLeave(0, qt_last_mouse_receiver.data()); + QApplicationPrivate::dispatchEnterLeave(0, qt_last_mouse_receiver.data(), + QGuiApplicationPrivate::lastCursorPosition); qt_last_mouse_receiver = 0; } } diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 2feb797985..be2a5f36cd 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -8563,6 +8563,8 @@ void QWidget::enterEvent(QEvent *) { } +// ### Qt 6: void QWidget::enterEvent(QEnterEvent *). + /*! \fn void QWidget::leaveEvent(QEvent *event) diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 1cabb095ec..c11e36312f 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -230,6 +230,7 @@ void QWidgetWindow::handleEnterLeaveEvent(QEvent *event) QWindowSystemInterfacePrivate::EnterEvent *systemEvent = static_cast<QWindowSystemInterfacePrivate::EnterEvent *> (QWindowSystemInterfacePrivate::peekWindowSystemEvent(QWindowSystemInterfacePrivate::Enter)); + const QPointF globalPosF = systemEvent ? systemEvent->globalPos : QGuiApplicationPrivate::lastCursorPosition; if (systemEvent) { if (QWidgetWindow *enterWindow = qobject_cast<QWidgetWindow *>(systemEvent->enter)) { @@ -255,11 +256,12 @@ void QWidgetWindow::handleEnterLeaveEvent(QEvent *event) QWidget *leave = m_widget; if (qt_last_mouse_receiver && !qt_last_mouse_receiver->internalWinId()) leave = qt_last_mouse_receiver.data(); - QApplicationPrivate::dispatchEnterLeave(enter, leave); + QApplicationPrivate::dispatchEnterLeave(enter, leave, globalPosF); qt_last_mouse_receiver = enter; } } else { - QApplicationPrivate::dispatchEnterLeave(m_widget, 0); + const QEnterEvent *ee = static_cast<QEnterEvent *>(event); + QApplicationPrivate::dispatchEnterLeave(m_widget, 0, ee->screenPos()); qt_last_mouse_receiver = m_widget; } } |