diff --git a/src/server/surface_interface.h b/src/server/surface_interface.h --- a/src/server/surface_interface.h +++ b/src/server/surface_interface.h @@ -112,6 +112,14 @@ * @since 5.3 **/ QSize size() const; + /** + * Returns the rectangle that bounds this surface and all of its sub-surfaces. + * + * QPoint(0, 0) corresponds to the upper left corner of this surface. + * + * @since 5.69 + */ + QRect boundingRect() const; /** * @returns The SubSurface for this Surface in case there is one. diff --git a/src/server/surface_interface.cpp b/src/server/surface_interface.cpp --- a/src/server/surface_interface.cpp +++ b/src/server/surface_interface.cpp @@ -772,6 +772,19 @@ return QSize(); } +QRect SurfaceInterface::boundingRect() const +{ + QRect rect(QPoint(0, 0), size()); + + const QList> subSurfaces = childSubSurfaces(); + for (const SubSurfaceInterface *subSurface : subSurfaces) { + const SurfaceInterface *childSurface = subSurface->surface(); + rect |= childSurface->boundingRect().translated(subSurface->position()); + } + + return rect; +} + QPointer< ShadowInterface > SurfaceInterface::shadow() const { Q_D();