Avoid flicker
authorPaul Olav Tvete <paul.tvete@nokia.com>
Fri, 25 Feb 2011 11:56:28 +0000 (12:56 +0100)
committerPaul Olav Tvete <paul.tvete@nokia.com>
Fri, 25 Feb 2011 11:56:28 +0000 (12:56 +0100)
Don't start a new paint until we get an ack from the compositor

Reviewed-by: Samuel
src/plugins/platforms/wayland/qwaylandshmsurface.cpp
src/plugins/platforms/wayland/qwaylandshmsurface.h

index 9bcae26..b1cba71 100644 (file)
@@ -95,6 +95,7 @@ QWaylandShmWindowSurface::QWaylandShmWindowSurface(QWidget *window)
     : QWindowSurface(window)
     , mBuffer(0)
     , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
+    , mWaitingForFrameSync(false)
 {
 }
 
@@ -107,6 +108,19 @@ QPaintDevice *QWaylandShmWindowSurface::paintDevice()
     return mBuffer->image();
 }
 
+void QWaylandShmWindowSurface::beginPaint(const QRegion &)
+{
+    while (mWaitingForFrameSync) {
+        mDisplay->eventDispatcher();
+    }
+}
+
+void QWaylandShmWindowSurface::frameCallback(void *data, uint32_t time)
+{
+    QWaylandShmWindowSurface *self = static_cast<QWaylandShmWindowSurface*>(data);
+    self->mWaitingForFrameSync = false;
+}
+
 void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
 {
     Q_UNUSED(widget);
@@ -118,6 +132,8 @@ void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion &region, con
     for (int i = 0; i < rects.size(); i++) {
         waylandWindow->damage(rects.at(i));
     }
+    mWaitingForFrameSync = true;
+    mDisplay->frameCallback(QWaylandShmWindowSurface::frameCallback, this);
 }
 
 void QWaylandShmWindowSurface::resize(const QSize &size)
index 266b290..615d944 100644 (file)
@@ -71,10 +71,14 @@ public:
     QPaintDevice *paintDevice();
     void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
     void resize(const QSize &size);
+    void beginPaint(const QRegion &);
 
 private:
+    static void frameCallback(void *data, uint32_t time);\
+
     QWaylandShmBuffer *mBuffer;
     QWaylandDisplay *mDisplay;
+    bool mWaitingForFrameSync;
 };
 
 QT_END_NAMESPACE