6 #include "subcompositor_interface.h"
9 #include "subsurface_interface_p.h"
10 #include "surface_interface_p.h"
12 #include <wayland-server.h>
18 class SubCompositorInterface::Private :
public Global::Private
21 Private(SubCompositorInterface *q, Display *d);
24 void bind(wl_client *client, uint32_t version, uint32_t
id)
override;
25 void subsurface(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *surface, wl_resource *
parent);
27 static void unbind(wl_resource *resource);
28 static void destroyCallback(wl_client *client, wl_resource *resource);
29 static void subsurfaceCallback(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *surface, wl_resource *
parent);
31 static Private *cast(wl_resource *r)
33 return reinterpret_cast<Private *
>(wl_resource_get_user_data(r));
36 SubCompositorInterface *q;
37 static const struct wl_subcompositor_interface s_interface;
38 static const quint32 s_version;
41 const quint32 SubCompositorInterface::Private::s_version = 1;
44 const struct wl_subcompositor_interface SubCompositorInterface::Private::s_interface = {destroyCallback, subsurfaceCallback};
47 SubCompositorInterface::Private::Private(SubCompositorInterface *q, Display *d)
48 : Global::Private(d, &wl_subcompositor_interface, s_version)
53 void SubCompositorInterface::Private::bind(wl_client *client, uint32_t version, uint32_t
id)
55 auto c = display->getConnection(client);
56 wl_resource *resource = c->createResource(&wl_subcompositor_interface, qMin(version, s_version),
id);
58 wl_client_post_no_memory(client);
61 wl_resource_set_implementation(resource, &s_interface,
this, unbind);
64 void SubCompositorInterface::Private::unbind(wl_resource *resource)
69 void SubCompositorInterface::Private::destroyCallback(wl_client *client, wl_resource *resource)
73 wl_resource_destroy(resource);
76 void SubCompositorInterface::Private::subsurfaceCallback(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *surface, wl_resource *sparent)
78 cast(resource)->subsurface(client, resource,
id, surface, sparent);
81 void SubCompositorInterface::Private::subsurface(wl_client *client,
82 wl_resource *resource,
84 wl_resource *nativeSurface,
85 wl_resource *nativeParentSurface)
90 if (!surface || !parentSurface) {
91 wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
"Surface or parent surface not found");
94 if (surface == parentSurface) {
95 wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
"Cannot become sub composite to same surface");
100 SubSurfaceInterface *s =
new SubSurfaceInterface(q, resource);
101 s->d_func()->create(display->getConnection(client), wl_resource_get_version(resource),
id, surface, parentSurface);
102 if (!s->resource()) {
103 wl_resource_post_no_memory(resource);
107 Q_EMIT q->subSurfaceCreated(s);
110 SubCompositorInterface::SubCompositorInterface(Display *display,
QObject *parent)
111 : Global(new Private(this, display), parent)
115 SubCompositorInterface::~SubCompositorInterface() =
default;
118 const struct wl_subsurface_interface SubSurfaceInterface::Private::s_interface =
119 {resourceDestroyedCallback, setPositionCallback, placeAboveCallback, placeBelowCallback, setSyncCallback, setDeSyncCallback};
122 SubSurfaceInterface::Private::Private(SubSurfaceInterface *q, SubCompositorInterface *compositor, wl_resource *parentResource)
123 :
Resource::Private(q, compositor, parentResource, &wl_subsurface_interface, &s_interface)
127 SubSurfaceInterface::Private::~Private()
131 Q_Q(SubSurfaceInterface);
136 void SubSurfaceInterface::Private::create(ClientConnection *client, quint32 version, quint32
id, SurfaceInterface *s, SurfaceInterface *p)
138 create(client, version,
id);
144 Q_Q(SubSurfaceInterface);
148 surface->d_func()->subSurfacePending = surface->d_func()->current;
149 surface->d_func()->subSurfacePending.blurIsSet =
false;
150 surface->d_func()->subSurfacePending.bufferIsSet =
false;
151 surface->d_func()->subSurfacePending.childrenChanged =
false;
152 surface->d_func()->subSurfacePending.contrastIsSet =
false;
153 surface->d_func()->subSurfacePending.callbacks.clear();
154 surface->d_func()->subSurfacePending.inputIsSet =
false;
155 surface->d_func()->subSurfacePending.inputIsInfinite =
true;
156 surface->d_func()->subSurfacePending.opaqueIsSet =
false;
157 surface->d_func()->subSurfacePending.shadowIsSet =
false;
158 surface->d_func()->subSurfacePending.slideIsSet =
false;
166 Q_Q(SubSurfaceInterface);
167 reinterpret_cast<SurfaceInterface::Private *>(parent->d.data())->removeChild(QPointer<SubSurfaceInterface>(q));
172 void SubSurfaceInterface::Private::commit()
174 if (scheduledPosChange) {
175 scheduledPosChange =
false;
178 Q_Q(SubSurfaceInterface);
179 Q_EMIT q->positionChanged(pos);
182 surface->d_func()->commitSubSurface();
186 void SubSurfaceInterface::Private::setPositionCallback(wl_client *client, wl_resource *resource, int32_t x, int32_t y)
190 cast<Private>(resource)->setPosition(
QPoint(x, y));
193 void SubSurfaceInterface::Private::setPosition(
const QPoint &p)
195 Q_Q(SubSurfaceInterface);
196 if (!q->isSynchronized()) {
200 Q_EMIT q->positionChanged(pos);
203 if (scheduledPos == p) {
207 scheduledPosChange =
true;
210 void SubSurfaceInterface::Private::placeAboveCallback(wl_client *client, wl_resource *resource, wl_resource *sibling)
216 void SubSurfaceInterface::Private::placeAbove(SurfaceInterface *sibling)
218 if (parent.isNull()) {
222 Q_Q(SubSurfaceInterface);
224 wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
"Incorrect sibling");
228 void SubSurfaceInterface::Private::placeBelowCallback(wl_client *client, wl_resource *resource, wl_resource *sibling)
234 void SubSurfaceInterface::Private::placeBelow(SurfaceInterface *sibling)
236 if (parent.isNull()) {
240 Q_Q(SubSurfaceInterface);
242 wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
"Incorrect sibling");
246 void SubSurfaceInterface::Private::setSyncCallback(wl_client *client, wl_resource *resource)
249 cast<Private>(resource)->setMode(Mode::Synchronized);
252 void SubSurfaceInterface::Private::setDeSyncCallback(wl_client *client, wl_resource *resource)
255 cast<Private>(resource)->setMode(Mode::Desynchronized);
258 void SubSurfaceInterface::Private::setMode(Mode m)
263 if (m == Mode::Desynchronized && (!parent->subSurface() || !parent->subSurface()->isSynchronized())) {
266 surface->d_func()->commit();
267 surface->d_func()->commitSubSurface();
271 Q_Q(SubSurfaceInterface);
272 Q_EMIT q->modeChanged(m);
275 SubSurfaceInterface::SubSurfaceInterface(SubCompositorInterface *parent, wl_resource *parentResource)
276 :
Resource(new Private(this, parent, parentResource))
281 SubSurfaceInterface::~SubSurfaceInterface() =
default;
283 QPoint SubSurfaceInterface::position()
const
315 SubSurfaceInterface::Mode SubSurfaceInterface::mode()
const
321 bool SubSurfaceInterface::isSynchronized()
const
324 if (d->mode == Mode::Synchronized) {
327 if (d->parent.isNull()) {
331 if (!d->parent->subSurface().isNull()) {
333 return d->parent->subSurface()->isSynchronized();
345 if (d->parent->d_func()->subSurface) {
346 return d->parent->d_func()->subSurface->mainSurface();
351 SubSurfaceInterface::Private *SubSurfaceInterface::d_func()
const
353 return reinterpret_cast<SubSurfaceInterface::Private *
>(d.data());