: QWindowSurface(window)
, mBuffer(0)
, mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display())
- , mWaitingForFrameSync(false)
{
}
void QWaylandShmWindowSurface::beginPaint(const QRegion &)
{
- while (mWaitingForFrameSync) {
+ QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow());
+ Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
+ while (waylandWindow->waitingForFrameSync()) {
mDisplay->iterate();
}
}
-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);
Q_UNUSED(offset);
QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow());
Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
-
- QVector<QRect> rects = region.rects();
- for (int i = 0; i < rects.size(); i++) {
- waylandWindow->damage(rects.at(i));
- }
- mWaitingForFrameSync = true;
- mDisplay->frameCallback(QWaylandShmWindowSurface::frameCallback, this);
+ waylandWindow->damage(region);
}
void QWaylandShmWindowSurface::resize(const QSize &size)
QWaylandShmWindow::QWaylandShmWindow(QWidget *widget)
: QWaylandWindow(widget)
, mBuffer(0)
+ , mWaitingForFrameSync(false)
{
newSurfaceCreated();
}
}
-void QWaylandShmWindow::damage(const QRect &rect)
+void QWaylandShmWindow::damage(const QRegion ®ion)
{
- wl_surface_damage(mSurface,
- rect.x(), rect.y(), rect.width(), rect.height());
+ QVector<QRect> rects = region.rects();
+ for (int i = 0; i < rects.size(); i++) {
+ const QRect rect = rects.at(i);
+ wl_surface_damage(mSurface,
+ rect.x(), rect.y(), rect.width(), rect.height());
+ }
+ mWaitingForFrameSync = true;
+ mDisplay->frameCallback(QWaylandShmWindow::frameCallback, this);
}
void QWaylandShmWindow::newSurfaceCreated()
wl_surface_attach(mSurface,mBuffer->buffer(),0,0);
}
}
+
+void QWaylandShmWindow::frameCallback(void *data, uint32_t time)
+{
+ QWaylandShmWindow *self = static_cast<QWaylandShmWindow*>(data);
+ self->mWaitingForFrameSync = false;
+}
WindowType windowType() const;
QPlatformGLContext *glContext() const;
void attach(QWaylandBuffer *buffer);
- void damage(const QRect &rect);
+ void damage(const QRegion ®ion);
+ bool waitingForFrameSync() const { return mWaitingForFrameSync; }
protected:
void newSurfaceCreated();
private:
+ static void frameCallback(void *data, uint32_t time);
QWaylandBuffer *mBuffer;
+ bool mWaitingForFrameSync;
};
#endif // QWAYLANDSHMWINDOW_H