From 5b49793d8048b51e3f671eb7c390a08999323876 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 24 Jul 2012 09:40:20 +0200 Subject: Implement synchronous WS events by flushing. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously synchronous window system events were implemented by bypassing the queue and processing the event immediately. This is not ideal since the event order is not preserved - there might be "happened before" events waiting in the queue. Add QWindowSystemInterface::flushWindowSystemEvents and change all handleSynchronous* to 1) queue the event 2) call flushWindowSystemEvents. flushWindowSystemEvents is almost identical to the already existing sendWindowSystemEvents with the exception that it does not call QApp::sendPostedEvents. Move the common implementation to a new private function. Task-number: QTBUG-20778 Change-Id: Ie98a83875bc0a14e335e36bed0dd9e0ed4a1dea0 Reviewed-by: Samuel Rødal Reviewed-by: Friedemann Kleint --- src/gui/kernel/qwindowsysteminterface.cpp | 27 ++++++++++++++--------- src/gui/kernel/qwindowsysteminterface.h | 4 ++++ src/plugins/platforms/windows/qwindowswindow.cpp | 6 ++--- tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | 6 ++--- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp index a18f6d8f17..87aa0c60b9 100644 --- a/src/gui/kernel/qwindowsysteminterface.cpp +++ b/src/gui/kernel/qwindowsysteminterface.cpp @@ -110,8 +110,8 @@ void QWindowSystemInterface::handleGeometryChange(QWindow *tlw, const QRect &new void QWindowSystemInterface::handleSynchronousGeometryChange(QWindow *tlw, const QRect &newRect) { - QWindowSystemInterfacePrivate::GeometryChangeEvent e(tlw,newRect); - QGuiApplicationPrivate::processWindowSystemEvent(&e); // send event immediately. + handleGeometryChange(tlw, newRect); + QWindowSystemInterface::flushWindowSystemEvents(); } void QWindowSystemInterface::handleCloseEvent(QWindow *tlw) @@ -126,8 +126,8 @@ void QWindowSystemInterface::handleCloseEvent(QWindow *tlw) void QWindowSystemInterface::handleSynchronousCloseEvent(QWindow *tlw) { if (tlw) { - QWindowSystemInterfacePrivate::CloseEvent e(tlw); - QGuiApplicationPrivate::processWindowSystemEvent(&e); + handleCloseEvent(tlw); + QWindowSystemInterface::flushWindowSystemEvents(); } } @@ -495,16 +495,24 @@ void QWindowSystemInterface::handleExposeEvent(QWindow *tlw, const QRegion ®i void QWindowSystemInterface::handleSynchronousExposeEvent(QWindow *tlw, const QRegion ®ion) { - QWindowSystemInterfacePrivate::ExposeEvent e(tlw, region); - QGuiApplicationPrivate::processWindowSystemEvent(&e); // send event immediately. + QWindowSystemInterface::handleExposeEvent(tlw, region); + QWindowSystemInterface::flushWindowSystemEvents(); +} + +void QWindowSystemInterface::flushWindowSystemEvents() +{ + sendWindowSystemEventsImplementation(QEventLoop::AllEvents); } bool QWindowSystemInterface::sendWindowSystemEvents(QEventLoop::ProcessEventsFlags flags) { - int nevents = 0; + QCoreApplication::sendPostedEvents(); // handle gui and posted events + return sendWindowSystemEventsImplementation(flags); +} - // handle gui and posted events - QCoreApplication::sendPostedEvents(); +bool QWindowSystemInterface::sendWindowSystemEventsImplementation(QEventLoop::ProcessEventsFlags flags) +{ + int nevents = 0; while (true) { QWindowSystemInterfacePrivate::WindowSystemEvent *event; @@ -609,5 +617,4 @@ void QWindowSystemInterface::handleTabletLeaveProximityEvent(int device, int poi handleTabletLeaveProximityEvent(time, device, pointerType, uid); } - QT_END_NAMESPACE diff --git a/src/gui/kernel/qwindowsysteminterface.h b/src/gui/kernel/qwindowsysteminterface.h index fb1717b628..3be863bf78 100644 --- a/src/gui/kernel/qwindowsysteminterface.h +++ b/src/gui/kernel/qwindowsysteminterface.h @@ -179,7 +179,11 @@ public: // For event dispatcher implementations static bool sendWindowSystemEvents(QEventLoop::ProcessEventsFlags flags); + static void flushWindowSystemEvents(); static int windowSystemEventsQueued(); + +private: + static bool sendWindowSystemEventsImplementation(QEventLoop::ProcessEventsFlags flags); }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 9d15240350..cdf1c2bf0f 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -795,11 +795,11 @@ void QWindowsWindow::setVisible(bool visible) if (m_data.hwnd) { if (visible) { show_sys(); - QWindowSystemInterface::handleSynchronousExposeEvent(window(), - QRect(QPoint(), geometry().size())); + QWindowSystemInterface::handleExposeEvent(window(), + QRect(QPoint(), geometry().size())); } else { hide_sys(); - QWindowSystemInterface::handleSynchronousExposeEvent(window(), QRegion()); + QWindowSystemInterface::handleExposeEvent(window(), QRegion()); } } } diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index a62f792b86..f5e5102844 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -1984,6 +1984,8 @@ void tst_QWidget::showFullScreen() QVERIFY(layouted.isFullScreen()); layouted.showFullScreen(); + if (m_platform == QStringLiteral("windows")) + QEXPECT_FAIL("", "QTBUG-26424", Continue); QVERIFY(!layouted.isMinimized()); QVERIFY(layouted.isFullScreen()); QVERIFY(layouted.isVisible()); @@ -3987,8 +3989,6 @@ void tst_QWidget::update() #ifdef Q_OS_MAC QEXPECT_FAIL(0, "Cocoa compositor says to paint this twice.", Continue); #endif - if (m_platform == QStringLiteral("windows")) - QEXPECT_FAIL("", "QTBUG-26424", Continue); QTRY_COMPARE(w.numPaintEvents, 1); QCOMPARE(w.visibleRegion(), QRegion(w.rect())); @@ -7594,8 +7594,6 @@ void tst_QWidget::doubleRepaint() widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); QTest::qWait(10); - if (m_platform == QStringLiteral("windows")) - QEXPECT_FAIL("", "QTBUG-26424", Continue); QTRY_COMPARE(widget.numPaintEvents, expectedRepaints); widget.numPaintEvents = 0; -- cgit v1.2.3