Fix broken qWaitForWindowShown() behavior
authorCharles Yin <charles.yin@nokia.com>
Fri, 16 Mar 2012 05:09:18 +0000 (15:09 +1000)
committerQt by Nokia <qt-info@nokia.com>
Fri, 16 Mar 2012 09:24:22 +0000 (10:24 +0100)
qWaitForWindowShown() should check window->isActive() instead of
window->isExposed() and return false if timeout.

Add two new qWaitForWindowActive() and qWaitForWindowExposed()
functions.
Change-Id: Idd9601805c2e84b0d36ddd5471031b627d289953
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
src/testlib/qtestcase.cpp
src/testlib/qtestsystem.h

index 001a14a..a26fa71 100644 (file)
@@ -862,7 +862,7 @@ QT_BEGIN_NAMESPACE
 /*! \fn bool QTest::qWaitForWindowShown(QWidget *window)
     \since 4.6
 
-    Waits until the \a window is shown in the screen. This is mainly useful for
+    Waits until the \a window is shown on the screen. This is mainly useful for
     asynchronous systems like X11, where a window will be mapped to screen some
     time after being asked to show itself on the screen. Returns true.
 
@@ -870,6 +870,37 @@ QT_BEGIN_NAMESPACE
     \snippet doc/src/snippets/code/src_qtestlib_qtestcase.cpp 24
 */
 
+/*! \fn bool QTest::qWaitForWindowShown(QWindow *window, int timeout)
+    \since 5.0
+
+    Waits for \a timeout milliseconds or until the \a window is shown on the screen.
+    This is mainly useful for asynchronous systems like X11, where a window will be mapped to screen some
+    time after being asked to show itself on the screen.
+
+    Returns true if \c window is show in \a timout milliseconds, otherwise returns false.
+
+    \sa QTest::qWaitForWindowActive(), QTest::qWaitForWindowExposed()
+*/
+
+/*! \fn bool QTest::qWaitForWindowActive(QWindow *window, int timeout)
+    \since 5.0
+
+    Waits for \a timeout milliseconds or until the \a window is active.
+
+    Returns true if \c window is active in \a timout milliseconds, otherwise returns false.
+
+    \sa QTest::qWaitForWindowActive(), QTest::qWaitForWindowShown(), QWindow::isActive()
+*/
+
+/*! \fn bool QTest::qWaitForWindowExposed(QWindow *window, int timeout)
+    \since 5.0
+
+    Waits for \a timeout milliseconds or until the \a window is exposed.
+    Returns true if \c window is exposed in \a timout milliseconds, otherwise returns false.
+
+    \sa QTest::qWaitForWindowShown(), QTest::qWaitForWindowExposed(), QWindow::isExposed()
+*/
+
 /*!
     \class QTest::QTouchEventSequence
     \inmodule QtTest
index ade5f4c..095f791 100644 (file)
@@ -76,19 +76,39 @@ namespace QTest
         return true;
     }
 
-    inline static bool qWaitForWindowShown(QWindow *window)
+    inline static bool qWaitForWindowActive(QWindow *window, int timeout = 1000)
+    {
+        QElapsedTimer timer;
+        timer.start();
+        while (!window->isActive()) {
+            int remaining = timeout - int(timer.elapsed());
+            if (remaining <= 0)
+                break;
+            QCoreApplication::processEvents(QEventLoop::AllEvents, remaining);
+            QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+            QTest::qSleep(10);
+        }
+        return window->isActive();
+    }
+
+    inline static bool qWaitForWindowExposed(QWindow *window, int timeout = 1000)
     {
         QElapsedTimer timer;
         timer.start();
         while (!window->isExposed()) {
-            int remaining = int(timer.elapsed()) - 1000;
+            int remaining = timeout - int(timer.elapsed());
             if (remaining <= 0)
                 break;
             QCoreApplication::processEvents(QEventLoop::AllEvents, remaining);
             QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
             QTest::qSleep(10);
         }
-        return true;
+        return window->isExposed();
+    }
+
+    inline static bool qWaitForWindowShown(QWindow *window, int timeout = 1000)
+    {
+        return qWaitForWindowActive(window, timeout);
     }
 }