: QWindowSurface(window)
, mBuffer(0)
, mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
+ , mWaitingForFrameSync(false)
{
}
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 ®ion, const QPoint &offset)
{
Q_UNUSED(widget);
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)
QPaintDevice *paintDevice();
void flush(QWidget *widget, const QRegion ®ion, 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