From d1622207ba501b93bd83b88d61a5631d3d0da0cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Tue, 10 May 2011 12:09:40 +0200 Subject: Prevent crash in QWidgetWindow::handleMouseEvent(). Don't use mapFrom() between widgets not in the same hierarchy. --- src/widgets/kernel/qwidgetwindow_qpa.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp index d1ef77d48c..e8b1a6d096 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa.cpp +++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp @@ -112,10 +112,19 @@ void QWidgetWindow::handleEnterLeaveEvent(QEvent *event) void QWidgetWindow::handleMouseEvent(QMouseEvent *event) { // which child should have it? - QWidget *widget = m_implicit_mouse_grabber ? m_implicit_mouse_grabber.data() : m_widget->childAt(event->pos()); + QPoint mapped = event->pos(); + QWidget *widget = 0; + + if (m_implicit_mouse_grabber) { + widget = m_implicit_mouse_grabber.data(); + mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->pos())); + } else if ((widget = m_widget->childAt(event->pos()))) { + mapped = widget->mapFrom(m_widget, event->pos()); + } if (qApp->d_func()->inPopupMode()) { widget = qApp->activePopupWidget(); + mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->pos())); m_implicit_mouse_grabber.clear(); } @@ -128,8 +137,6 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event) if (event->buttons() == Qt::NoButton) m_implicit_mouse_grabber.clear(); - QPoint mapped = widget->mapFrom(m_widget, event->pos()); - if (widget != qt_last_mouse_receiver) { QApplicationPrivate::dispatchEnterLeave(widget, qt_last_mouse_receiver); qt_last_mouse_receiver = widget; -- cgit v1.2.3