15static const int s_version = 1;
18 : QtWaylandServer::wl_subcompositor(*display, s_version)
25 wl_resource_destroy(resource->handle);
30 ::wl_resource *surface_resource,
31 ::wl_resource *parent_resource)
37 wl_resource_post_error(resource->handle, error_bad_surface,
"no surface");
41 wl_resource_post_error(resource->handle, error_bad_surface,
"no parent");
47 wl_resource_post_error(resource->handle, error_bad_surface,
"the surface already has a role assigned %s", role->name().constData());
54 if (surface == parent) {
55 wl_resource_post_error(resource->handle, error_bad_surface,
"wl_surface@%d cannot be its own parent", wl_resource_get_id(surface_resource));
59 wl_resource_post_error(resource->handle, error_bad_surface,
"wl_surface@%d is an ancestor of parent", wl_resource_get_id(surface_resource));
63 wl_resource *subsurfaceResource = wl_resource_create(resource->client(), &wl_subsurface_interface, resource->version(),
id);
64 if (!subsurfaceResource) {
65 wl_resource_post_no_memory(resource->handle);
85 return subsurface->d.get();
89 : QtWaylandServer::wl_subsurface(resource)
103 wl_resource_destroy(resource->handle);
109 wl_resource_post_error(resource->handle, error_bad_surface,
"no parent");
115 parentPrivate->
pending->subsurface.position[
q] = QPoint(x, y);
116 parentPrivate->
pending->subsurfacePositionChanged =
true;
123 wl_resource_post_error(resource->handle, error_bad_surface,
"no sibling");
127 wl_resource_post_error(resource->handle, error_bad_surface,
"no parent");
133 wl_resource_post_error(resource->handle, error_bad_surface,
"incorrect sibling");
141 wl_resource_post_error(resource->handle, error_bad_surface,
"no sibling");
145 wl_resource_post_error(resource->handle, error_bad_surface,
"no parent");
151 wl_resource_post_error(resource->handle, error_bad_surface,
"incorrect sibling");
171 q->parentDesynchronized();
184 connect(
surface, &SurfaceInterface::destroyed,
this, [
this]() {
237 if (d->parent->subSurface()) {
239 return d->parent->subSurface()->isSynchronized();
257void SubSurfaceInterface::parentDesynchronized()
269 const auto below = d->surface->below();
270 for (SubSurfaceInterface *child : below) {
271 child->parentDesynchronized();
274 const auto above = d->surface->above();
275 for (SubSurfaceInterface *child : above) {
276 child->parentDesynchronized();
280void SubSurfaceInterface::parentApplyState(quint32 serial)
283 if (parentPrivate->
current->subsurfacePositionChanged) {
284 const QPoint &pos = parentPrivate->
current->subsurface.position[
this];
285 if (d->position != pos) {
294#include "moc_subcompositor.cpp"
Class holding the Wayland server display loop.
void subSurfaceCreated(KWin::SubSurfaceInterface *subsurface)
~SubCompositorInterface() override
SubCompositorInterface(Display *display, QObject *parent=nullptr)
void subcompositor_get_subsurface(Resource *resource, uint32_t id, struct ::wl_resource *surface_resource, struct ::wl_resource *parent_resource) override
SubCompositorInterfacePrivate(Display *display, SubCompositorInterface *q)
void subcompositor_destroy(Resource *resource) override
SubCompositorInterface * q
bool isSynchronized() const
static SurfaceRole * role()
SurfaceInterface * parentSurface() const
SurfaceInterface * surface() const
~SubSurfaceInterface() override
void positionChanged(const QPoint &position)
void modeChanged(KWin::SubSurfaceInterface::Mode mode)
SurfaceInterface * mainSurface() const
QPointer< SurfaceInterface > parent
static SubSurfaceInterfacePrivate * get(SubSurfaceInterface *subsurface)
void subsurface_set_desync(Resource *resource) override
SubSurfaceInterfacePrivate(SubSurfaceInterface *q, SurfaceInterface *surface, SurfaceInterface *parent, ::wl_resource *resource)
void subsurface_place_above(Resource *resource, struct ::wl_resource *sibling_resource) override
void subsurface_set_sync(Resource *resource) override
void subsurface_destroy(Resource *resource) override
void subsurface_destroy_resource(Resource *resource) override
void subsurface_set_position(Resource *resource, int32_t x, int32_t y) override
QPointer< SurfaceInterface > surface
SubSurfaceInterface::Mode mode
void subsurface_place_below(Resource *resource, struct ::wl_resource *sibling_resource) override
Resource representing a wl_surface.
static SurfaceInterface * get(wl_resource *native)
SurfaceRole * role() const
SubSurfaceInterface * subSurface() const
void setRole(SurfaceRole *role)
bool raiseChild(SubSurfaceInterface *subsurface, SurfaceInterface *anchor)
std::unique_ptr< Transaction > transaction
std::unique_ptr< SurfaceState > current
void removeChild(SubSurfaceInterface *subsurface)
std::unique_ptr< SurfaceState > pending
static SurfaceInterfacePrivate * get(SurfaceInterface *surface)
void addChild(SubSurfaceInterface *subsurface)
SubSurfaceInterface * handle
struct KWin::SurfaceInterfacePrivate::@30 subsurface
bool lowerChild(SubSurfaceInterface *subsurface, SurfaceInterface *anchor)