void QWaylandShmBackingStore::beginPaint(const QRegion &) { mPainting = true; ensureSize(); if (waylandWindow()->attached() && mBackBuffer == waylandWindow()->attached() && mFrameCallback) { QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->handle()); Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm); waylandWindow->waitForFrameSync(); } }
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++) { const QRect rect = rects.at(i); wl_buffer_damage(mBuffer->buffer(),rect.x(),rect.y(),rect.width(),rect.height()); waylandWindow->damage(rect); } }
void QWaylandShmBackingStore::done(void *data, wl_callback *callback, uint32_t time) { Q_UNUSED(time); QWaylandShmBackingStore *self = static_cast<QWaylandShmBackingStore *>(data); if (callback != self->mFrameCallback) // others, like QWaylandWindow, may trigger callbacks too return; QWaylandShmWindow *window = self->waylandWindow(); wl_callback_destroy(self->mFrameCallback); self->mFrameCallback = 0; if (self->mFrontBuffer != window->attached()) { delete window->attached(); } if (window->attached() != self->mFrontBuffer) window->attachOffset(self->mFrontBuffer); if (self->mFrontBufferIsDirty && !self->mPainting) { self->mFrontBufferIsDirty = false; self->mFrameCallback = wl_surface_frame(window->wl_surface()); wl_callback_add_listener(self->mFrameCallback,&self->frameCallbackListener,self); window->damage(QRect(QPoint(0,0),self->mFrontBuffer->size())); } }
void QWaylandShmWindowSurface::resize(const QSize &size) { QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow()); Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm); QWindowSurface::resize(size); QImage::Format format = QPlatformScreen::platformScreenForWidget(window())->format(); if (mBuffer != NULL && mBuffer->size() == size) return; if (mBuffer != NULL) delete mBuffer; mBuffer = new QWaylandShmBuffer(mDisplay, size, format); waylandWindow->attach(mBuffer); }
void QWaylandShmWindowSurface::beginPaint(const QRegion &) { QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow()); Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm); waylandWindow->waitForFrameSync(); }