aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBalazs Kelemen <kbalazs@webkit.org>2012-09-27 12:24:25 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-09-28 18:50:32 +0200
commit75445c228476e4905cef3fb89a849f93f33e768f (patch)
treef8a9cb3a9eca2e85e8893e57078d912870d3ad3a
parente03363dfd1aeddd085c4c86d9a1964da769d7980 (diff)
Allow grabbing windows rendered without showing for testing.
To make QQuickWindowPrivate::setRenderWithoutShowing more useful for autotesting we can allow grabbing such windows. This is safe if the platform window have been created and the window has a valid size. Change-Id: I8b9a2aaeb93935f662b75ef29651730b890441d5 Reviewed-by: Samuel Rødal <samuel.rodal@digia.com> Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
-rw-r--r--src/quick/items/qquickthreadedwindowmanager.cpp14
-rw-r--r--src/quick/items/qquickthreadedwindowmanager_p.h10
-rw-r--r--src/quick/items/qquickwindow.cpp12
-rw-r--r--src/quick/items/qquickwindow_p.h2
-rw-r--r--src/quick/items/qquickwindowmanager.cpp7
5 files changed, 24 insertions, 21 deletions
diff --git a/src/quick/items/qquickthreadedwindowmanager.cpp b/src/quick/items/qquickthreadedwindowmanager.cpp
index 624efa567a..50bd569496 100644
--- a/src/quick/items/qquickthreadedwindowmanager.cpp
+++ b/src/quick/items/qquickthreadedwindowmanager.cpp
@@ -126,7 +126,12 @@ void QQuickRenderThreadSingleContextWindowManager::initialize()
{
Q_ASSERT(m_rendered_windows.size());
- QQuickWindow *win = masterWindow();
+ QQuickWindow *win = 0;
+ for (QHash<QQuickWindow *, WindowData *>::const_iterator it = m_rendered_windows.constBegin();
+ it != m_rendered_windows.constEnd() && !win; ++it) {
+ if (QQuickWindowPrivate::get(it.key())->isRenderable())
+ win = it.key();
+ }
if (!win)
return;
@@ -391,12 +396,9 @@ void QQuickRenderThreadSingleContextWindowManager::run()
WindowData *windowData = it.value();
QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(window);
- Q_ASSERT(windowData->windowSize.width() > 0 && windowData->windowSize.height() > 0);
+ Q_ASSERT(windowPrivate->isRenderable());
- if (!windowData->isVisible)
- gl->makeCurrent(masterWindow());
- else
- gl->makeCurrent(window);
+ gl->makeCurrent(window);
if (windowData->viewportSize != windowData->windowSize) {
#ifdef THREAD_DEBUG
diff --git a/src/quick/items/qquickthreadedwindowmanager_p.h b/src/quick/items/qquickthreadedwindowmanager_p.h
index 48c9d10d2d..9e28d87eef 100644
--- a/src/quick/items/qquickthreadedwindowmanager_p.h
+++ b/src/quick/items/qquickthreadedwindowmanager_p.h
@@ -118,16 +118,6 @@ public:
void run();
- QQuickWindow *masterWindow() {
- QQuickWindow *win = 0;
- for (QHash<QQuickWindow *, WindowData *>::const_iterator it = m_rendered_windows.constBegin();
- it != m_rendered_windows.constEnd() && !win; ++it) {
- if (it.value()->isVisible)
- win = it.key();
- }
- return win;
- }
-
QAnimationDriver *animationDriver() const { return animDriver; }
public slots:
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index b0e3db2c87..b657094e29 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -259,9 +259,8 @@ void QQuickWindowPrivate::polishItems()
* This parameter enables that this window can be rendered without
* being shown on screen. This feature is very limited in what it supports.
*
- * There needs to be another window actually showing that we can make current
- * to get a surface to make current AND for this feature to be useful
- * one needs to hook into beforeRender() and set the render tareget.
+ * For this feature to be useful one needs to hook into beforeRender()
+ * and set the render tareget.
*
*/
void QQuickWindowPrivate::setRenderWithoutShowing(bool render)
@@ -1996,6 +1995,13 @@ bool QQuickWindowPrivate::dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent
return overThreshold;
}
+bool QQuickWindowPrivate::isRenderable() const
+{
+ if (geometry.width() <= 0 || geometry.height() <= 0)
+ return false;
+ return visible || (renderWithoutShowing && platformWindow);
+}
+
/*!
Propagates an event \a e to a QQuickItem \a item on the window.
diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h
index fc8da0bd31..530e547f3e 100644
--- a/src/quick/items/qquickwindow_p.h
+++ b/src/quick/items/qquickwindow_p.h
@@ -173,6 +173,8 @@ public:
void syncSceneGraph();
void renderSceneGraph(const QSize &size);
+ bool isRenderable() const;
+
bool renderWithoutShowing;
void setRenderWithoutShowing(bool enabled);
diff --git a/src/quick/items/qquickwindowmanager.cpp b/src/quick/items/qquickwindowmanager.cpp
index 43887662eb..6596343bc8 100644
--- a/src/quick/items/qquickwindowmanager.cpp
+++ b/src/quick/items/qquickwindowmanager.cpp
@@ -198,13 +198,14 @@ void QQuickTrivialWindowManager::windowDestroyed(QQuickWindow *window)
void QQuickTrivialWindowManager::renderWindow(QQuickWindow *window)
{
- if (!window->isExposed() || !m_windows.contains(window))
+ bool renderWithoutShowing = QQuickWindowPrivate::get(window)->renderWithoutShowing;
+ if ((!window->isExposed() && !renderWithoutShowing) || !m_windows.contains(window))
return;
WindowData &data = const_cast<WindowData &>(m_windows[window]);
QQuickWindow *masterWindow = 0;
- if (!window->isVisible()) {
+ if (!window->isVisible() && !renderWithoutShowing) {
// Find a "proper surface" to bind...
for (QHash<QQuickWindow *, WindowData>::const_iterator it = m_windows.constBegin();
it != m_windows.constEnd() && !masterWindow; ++it) {
@@ -218,6 +219,8 @@ void QQuickTrivialWindowManager::renderWindow(QQuickWindow *window)
if (!masterWindow)
return;
+ Q_ASSERT(QQuickWindowPrivate::get(masterWindow)->isRenderable());
+
if (!gl) {
gl = new QOpenGLContext();
gl->setFormat(masterWindow->requestedFormat());