aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/items/qquickwindow.cpp')
-rw-r--r--src/quick/items/qquickwindow.cpp60
1 files changed, 40 insertions, 20 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index c95a28dac5..4af76aa299 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -80,46 +80,66 @@ void QQuickWindowPrivate::updateFocusItemTransform()
qApp->inputMethod()->setInputItemTransform(QQuickItemPrivate::get(focus)->itemToWindowTransform());
}
+
class QQuickWindowIncubationController : public QObject, public QQmlIncubationController
{
+ Q_OBJECT
+
public:
- QQuickWindowIncubationController(QQuickWindowPrivate *window)
- : m_window(window), m_eventSent(false) {}
+ QQuickWindowIncubationController(const QQuickWindow *window)
+ : m_window(QQuickWindowPrivate::get(const_cast<QQuickWindow *>(window)))
+ {
+ // Allow incubation for 1/3 of a frame.
+ m_incubation_time = qMax(1, int(1000 / QGuiApplication::primaryScreen()->refreshRate()) / 3);
+
+ m_animation_driver = m_window->windowManager->animationDriver();
+ if (m_animation_driver) {
+ connect(m_animation_driver, SIGNAL(stopped()), this, SLOT(animationStopped()));
+ connect(window, SIGNAL(frameSwapped()), this, SLOT(incubate()));
+ }
+ }
protected:
virtual bool event(QEvent *e)
{
if (e->type() == QEvent::User) {
- Q_ASSERT(m_eventSent);
- volatile bool *amtp = m_window->windowManager->allowMainThreadProcessing();
- while (incubatingObjectCount()) {
- if (amtp)
- incubateWhile(amtp, 2);
- else
- incubateFor(5);
- QCoreApplication::processEvents();
- }
-
- m_eventSent = false;
+ incubate();
+ return true;
}
return QObject::event(e);
}
+public slots:
+ void incubate() {
+ if (incubatingObjectCount()) {
+ if (m_animation_driver && m_animation_driver->isRunning()) {
+ incubateFor(m_incubation_time);
+ } else {
+ incubateFor(m_incubation_time * 2);
+ if (incubatingObjectCount())
+ QCoreApplication::postEvent(this, new QEvent(QEvent::User));
+ }
+ }
+ }
+
+ void animationStopped() { incubate(); }
+
+protected:
virtual void incubatingObjectCountChanged(int count)
{
- if (count && !m_eventSent) {
- m_eventSent = true;
+ if (count && (!m_animation_driver || !m_animation_driver->isRunning()))
QCoreApplication::postEvent(this, new QEvent(QEvent::User));
- }
- // If no animations are running, the renderer may be waiting
- m_window->windowManager->wakeup();
}
private:
QQuickWindowPrivate *m_window;
- bool m_eventSent;
+ int m_incubation_time;
+ QAnimationDriver *m_animation_driver;
};
+#include "qquickwindow.moc"
+
+
#ifndef QT_NO_ACCESSIBILITY
QAccessibleInterface *QQuickWindow::accessibleRoot() const
{
@@ -2507,7 +2527,7 @@ QQmlIncubationController *QQuickWindow::incubationController() const
Q_D(const QQuickWindow);
if (!d->incubationController)
- d->incubationController = new QQuickWindowIncubationController(const_cast<QQuickWindowPrivate *>(d));
+ d->incubationController = new QQuickWindowIncubationController(this);
return d->incubationController;
}