209void QWaylandSurfacePrivate::surface_commit(Resource *)
211 Q_Q(QWaylandSurface);
214 QSize oldBufferSize = bufferSize;
215 QRectF oldSourceGeometry = sourceGeometry;
216 QSize oldDestinationSize = destinationSize;
217 bool oldHasContent = hasContent;
218 int oldBufferScale = bufferScale;
221 if (pending.buffer.hasBuffer() || pending.newlyAttached)
222 bufferRef = pending.buffer;
223 bufferScale = pending.bufferScale;
224 bufferSize = bufferRef.size();
225 QSize surfaceSize = bufferSize / bufferScale;
226 sourceGeometry = !pending.sourceGeometry.isValid() ? QRect(QPoint(), surfaceSize) : pending.sourceGeometry;
227 destinationSize = pending.destinationSize.isEmpty() ? sourceGeometry.size().toSize() : pending.destinationSize;
228 QRect destinationRect(QPoint(), destinationSize);
230 damage = pending.surfaceDamage.intersected(destinationRect);
231 if (!pending.bufferDamage.isNull()) {
232 if (bufferScale == 1) {
233 damage |= pending.bufferDamage.intersected(destinationRect);
237 auto xform = [](
const QRect &r,
int scale) -> QRect {
239 QPoint{ r.x() / scale, r.y() / scale },
240 QPoint{ (r.right() + scale - 1) / scale, (r.bottom() + scale - 1) / scale }
244 for (
const QRect &r : pending.bufferDamage)
245 damage |= xform(r, bufferScale).intersected(destinationRect);
248 hasContent = bufferRef.hasContent();
249 frameCallbacks << pendingFrameCallbacks;
250 inputRegion = pending.inputRegion.intersected(destinationRect);
251 opaqueRegion = pending.opaqueRegion.intersected(destinationRect);
252 bool becameOpaque = opaqueRegion.boundingRect().contains(destinationRect);
253 if (becameOpaque != isOpaque) {
254 isOpaque = becameOpaque;
255 emit q->isOpaqueChanged();
258 QPoint offsetForNextFrame = pending.offset;
261 viewport->checkCommittedState();
264 pending.buffer = QWaylandBufferRef();
265 pending.offset = QPoint();
266 pending.newlyAttached =
false;
267 pending.bufferDamage = QRegion();
268 pending.surfaceDamage = QRegion();
269 pendingFrameCallbacks.clear();
272 if (
auto *buffer = bufferRef.buffer())
273 buffer->setCommitted(damage);
274 for (
auto *view : std::as_const(views))
275 view->bufferCommitted(bufferRef, damage);
281 emit q->damaged(damage);
283 if (oldBufferSize != bufferSize)
284 emit q->bufferSizeChanged();
286 if (oldBufferScale != bufferScale)
287 emit q->bufferScaleChanged();
289 if (oldDestinationSize != destinationSize)
290 emit q->destinationSizeChanged();
292 if (oldSourceGeometry != sourceGeometry)
293 emit q->sourceGeometryChanged();
295 if (oldHasContent != hasContent)
296 emit q->hasContentChanged();
298 if (!offsetForNextFrame.isNull())
299 emit q->offsetForNextFrame(offsetForNextFrame);
304void QWaylandSurfacePrivate::surface_set_buffer_transform(Resource *resource, int32_t orientation)
307 Q_Q(QWaylandSurface);
308 QScreen *screen = QGuiApplication::primaryScreen();
309 bool isPortrait = screen->primaryOrientation() == Qt::PortraitOrientation;
310 Qt::ScreenOrientation oldOrientation = contentOrientation;
311 switch (orientation) {
312 case WL_OUTPUT_TRANSFORM_90:
313 contentOrientation = isPortrait ? Qt::InvertedLandscapeOrientation : Qt::PortraitOrientation;
315 case WL_OUTPUT_TRANSFORM_180:
316 contentOrientation = isPortrait ? Qt::InvertedPortraitOrientation : Qt::InvertedLandscapeOrientation;
318 case WL_OUTPUT_TRANSFORM_270:
319 contentOrientation = isPortrait ? Qt::LandscapeOrientation : Qt::InvertedPortraitOrientation;
322 contentOrientation = Qt::PrimaryOrientation;
324 if (contentOrientation != oldOrientation)
325 emit q->contentOrientationChanged();
974bool QWaylandSurface::setRole(QWaylandSurfaceRole *role, wl_resource *errorResource, uint32_t errorCode)
976 Q_D(QWaylandSurface);
978 if (d->role && d->role != role) {
979 wl_resource_post_error(errorResource, errorCode,
980 "Cannot assign role %s to wl_surface@%d, already has role %s\n",
981 role->name().constData(), wl_resource_get_id(resource()),
982 d->role->name().constData());
1031void QWaylandSurfacePrivate::initSubsurface(QWaylandSurface *parent, wl_client *client,
int id,
int version)
1033 Q_Q(QWaylandSurface);
1034 QWaylandSurface *oldParent =
nullptr;
1036 subsurface =
new Subsurface(
this);
1037 subsurface->init(client, id, version);
1038 subsurface->parentSurface = parent->d_func();
1039 emit q->parentChanged(parent, oldParent);
1040 emit parent->childAdded(q);