{
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;
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
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:
* 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)
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.
void syncSceneGraph();
void renderSceneGraph(const QSize &size);
+ bool isRenderable() const;
+
bool renderWithoutShowing;
void setRenderWithoutShowing(bool enabled);
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) {
if (!masterWindow)
return;
+ Q_ASSERT(QQuickWindowPrivate::get(masterWindow)->isRenderable());
+
if (!gl) {
gl = new QOpenGLContext();
gl->setFormat(masterWindow->requestedFormat());