XCB: send leave event on grab

When a popup is opened it grabs the input, but the leave event to the other
windows needs to be sent.

Remove the popupEnterLeave test as it did not test any code. The Popup
never gets any enter or leave events so it will succeed always succeed

Task-number: QTBUG-36862
Change-Id: I625c616eeb74b5168af7b751485e2a9a53b76cd3
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
bb10
Jørgen Lind 2014-11-13 11:32:21 +01:00 committed by Shawn Rutledge
parent b9ae25fa71
commit ddc7323999
2 changed files with 17 additions and 62 deletions

View File

@ -2022,6 +2022,19 @@ void QXcbWindow::handleMouseEvent(xcb_timestamp_t time, const QPoint &local, con
QWindowSystemInterface::handleMouseEvent(window(), time, local, global, connection()->buttons(), modifiers);
}
static bool ignoreLeaveEvent(const xcb_leave_notify_event_t *event)
{
return event->detail == XCB_NOTIFY_DETAIL_VIRTUAL
|| event->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL;
}
static bool ignoreEnterEvent(const xcb_enter_notify_event_t *event)
{
return ((event->mode != XCB_NOTIFY_MODE_NORMAL && event->mode != XCB_NOTIFY_MODE_UNGRAB)
|| event->detail == XCB_NOTIFY_DETAIL_VIRTUAL
|| event->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL);
}
class EnterEventChecker
{
public:
@ -2033,13 +2046,8 @@ public:
return false;
xcb_enter_notify_event_t *enter = (xcb_enter_notify_event_t *)event;
if ((enter->mode != XCB_NOTIFY_MODE_NORMAL && enter->mode != XCB_NOTIFY_MODE_UNGRAB)
|| enter->detail == XCB_NOTIFY_DETAIL_VIRTUAL
|| enter->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL)
{
if (ignoreEnterEvent(enter))
return false;
}
return true;
}
@ -2052,12 +2060,9 @@ void QXcbWindow::handleEnterNotifyEvent(const xcb_enter_notify_event_t *event)
connection()->handleEnterEvent(event);
#endif
if ((event->mode != XCB_NOTIFY_MODE_NORMAL && event->mode != XCB_NOTIFY_MODE_UNGRAB)
|| event->detail == XCB_NOTIFY_DETAIL_VIRTUAL
|| event->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL)
{
if (ignoreEnterEvent(event))
return;
}
const int dpr = int(devicePixelRatio());
const QPoint local(event->event_x/dpr, event->event_y/dpr);
const QPoint global(event->root_x/dpr, event->root_y/dpr);
@ -2068,12 +2073,8 @@ void QXcbWindow::handleLeaveNotifyEvent(const xcb_leave_notify_event_t *event)
{
connection()->setTime(event->time);
if ((event->mode != XCB_NOTIFY_MODE_NORMAL && event->mode != XCB_NOTIFY_MODE_UNGRAB)
|| event->detail == XCB_NOTIFY_DETAIL_VIRTUAL
|| event->detail == XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL)
{
if (ignoreLeaveEvent(event))
return;
}
EnterEventChecker checker;
xcb_enter_notify_event_t *enter = (xcb_enter_notify_event_t *)connection()->checkEvent(checker);

View File

@ -206,7 +206,6 @@ private slots:
void enabledPropagation();
void ignoreKeyEventsWhenDisabled_QTBUG27417();
void properTabHandlingWhenDisabled_QTBUG27417();
void popupEnterLeave();
#ifndef QT_NO_DRAGANDDROP
void acceptDropsPropagation();
#endif
@ -5001,51 +5000,6 @@ bool verifyColor(QWidget &child, const QRegion &region, const QColor &color, uns
return true;
}
void tst_QWidget::popupEnterLeave()
{
QWidget parent;
parent.setWindowFlags(Qt::FramelessWindowHint);
parent.setGeometry(10, 10, 200, 100);
ColorWidget alien(&parent, Qt::Widget, Qt::black);
alien.setGeometry(0, 0, 10, 10);
alien.show();
parent.show();
QVERIFY(QTest::qWaitForWindowExposed(&parent));
QWindowSystemInterface::handleMouseEvent(parent.windowHandle(), QPointF(5, 5), QPointF(), Qt::LeftButton, Qt::NoModifier);
QTest::qWait(100);
QWindowSystemInterface::handleMouseEvent(parent.windowHandle(), QPointF(5, 5), QPointF(), Qt::NoButton, Qt::NoModifier);
QTest::qWait(100);
QStringList wordList;
wordList << "alpha" << "omega" << "omicron" << "zeta";
QLineEdit popup(&parent);
QCompleter completer(wordList);
completer.setCaseSensitivity(Qt::CaseInsensitive);
popup.setCompleter(&completer);
popup.setWindowFlags(Qt::Popup);
popup.setGeometry(20, 20, 80, 20);
popup.show();
QVERIFY(QTest::qWaitForWindowExposed(&popup));
QTest::qWait(100);
QWindowSystemInterface::handleMouseEvent(popup.windowHandle(), QPointF(-5, -5), QPointF(), Qt::LeftButton, Qt::NoModifier);
QTest::qWait(100);
QWindowSystemInterface::handleMouseEvent(popup.windowHandle(), QPointF(-5, -5), QPointF(), Qt::NoButton, Qt::NoModifier);
QTest::qWait(100);
QTest::qWait(1000);
QVERIFY(!popup.underMouse());
}
void tst_QWidget::moveChild_data()
{
QTest::addColumn<QPoint>("offset");