6 #include "subcompositor_interface.h" 7 #include "subsurface_interface_p.h" 10 #include "surface_interface_p.h" 12 #include <wayland-server.h> 19 class SubCompositorInterface::Private :
public Global::Private
22 Private(SubCompositorInterface *q, Display *d);
25 void bind(wl_client *client, uint32_t version, uint32_t
id)
override;
26 void subsurface(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *surface, wl_resource *
parent);
28 static void unbind(wl_resource *resource);
29 static void destroyCallback(wl_client *client, wl_resource *resource);
30 static void subsurfaceCallback(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *surface, wl_resource *
parent);
32 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 = {
50 SubCompositorInterface::Private::Private(SubCompositorInterface *q, Display *d)
51 : Global::Private(d, &wl_subcompositor_interface, s_version)
56 void SubCompositorInterface::Private::bind(wl_client *client, uint32_t version, uint32_t
id)
58 auto c = display->getConnection(client);
59 wl_resource *resource = c->createResource(&wl_subcompositor_interface, qMin(version, s_version),
id);
61 wl_client_post_no_memory(client);
64 wl_resource_set_implementation(resource, &s_interface,
this, unbind);
67 void SubCompositorInterface::Private::unbind(wl_resource *resource)
72 void SubCompositorInterface::Private::destroyCallback(wl_client *client, wl_resource *resource)
76 wl_resource_destroy(resource);
79 void SubCompositorInterface::Private::subsurfaceCallback(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *surface, wl_resource *sparent)
81 cast(resource)->subsurface(client, resource,
id, surface, sparent);
84 void SubCompositorInterface::Private::subsurface(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *nativeSurface, wl_resource *nativeParentSurface)
87 SurfaceInterface *surface = SurfaceInterface::get(nativeSurface);
88 SurfaceInterface *parentSurface = SurfaceInterface::get(nativeParentSurface);
89 if (!surface || !parentSurface) {
90 wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
"Surface or parent surface not found");
93 if (surface == parentSurface) {
94 wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
"Cannot become sub composite to same surface");
99 SubSurfaceInterface *s =
new SubSurfaceInterface(q, resource);
100 s->d_func()->create(display->getConnection(client), wl_resource_get_version(resource), id, surface, parentSurface);
101 if (!s->resource()) {
102 wl_resource_post_no_memory(resource);
106 Q_EMIT q->subSurfaceCreated(s);
109 SubCompositorInterface::SubCompositorInterface(Display *display,
QObject *
parent)
110 : Global(new Private(this, display), parent)
114 SubCompositorInterface::~SubCompositorInterface() =
default;
117 const struct wl_subsurface_interface SubSurfaceInterface::Private::s_interface = {
118 resourceDestroyedCallback,
127 SubSurfaceInterface::Private::Private(SubSurfaceInterface *q, SubCompositorInterface *compositor, wl_resource *parentResource)
128 : Resource::Private(q, compositor, parentResource, &wl_subsurface_interface, &s_interface)
132 SubSurfaceInterface::Private::~Private()
136 Q_Q(SubSurfaceInterface);
141 void SubSurfaceInterface::Private::create(ClientConnection *client, quint32 version, quint32
id, SurfaceInterface *s, SurfaceInterface *p)
143 create(client, version,
id);
149 Q_Q(SubSurfaceInterface);
153 surface->d_func()->subSurfacePending = surface->d_func()->current;
154 surface->d_func()->subSurfacePending.blurIsSet =
false;
155 surface->d_func()->subSurfacePending.bufferIsSet =
false;
156 surface->d_func()->subSurfacePending.childrenChanged =
false;
157 surface->d_func()->subSurfacePending.contrastIsSet =
false;
158 surface->d_func()->subSurfacePending.callbacks.
clear();
159 surface->d_func()->subSurfacePending.inputIsSet =
false;
160 surface->d_func()->subSurfacePending.inputIsInfinite =
true;
161 surface->d_func()->subSurfacePending.opaqueIsSet =
false;
162 surface->d_func()->subSurfacePending.shadowIsSet =
false;
163 surface->d_func()->subSurfacePending.slideIsSet =
false;
172 Q_Q(SubSurfaceInterface);
179 void SubSurfaceInterface::Private::commit()
181 if (scheduledPosChange) {
182 scheduledPosChange =
false;
185 Q_Q(SubSurfaceInterface);
186 Q_EMIT q->positionChanged(pos);
189 surface->d_func()->commitSubSurface();
193 void SubSurfaceInterface::Private::setPositionCallback(wl_client *client, wl_resource *resource, int32_t x, int32_t y)
197 cast<Private>(resource)->setPosition(
QPoint(x, y));
200 void SubSurfaceInterface::Private::setPosition(const
QPoint &p)
202 Q_Q(SubSurfaceInterface);
203 if (!q->isSynchronized()) {
207 Q_EMIT q->positionChanged(pos);
210 if (scheduledPos == p) {
214 scheduledPosChange =
true;
217 void SubSurfaceInterface::Private::placeAboveCallback(wl_client *client, wl_resource *resource, wl_resource *sibling)
220 cast<Private>(resource)->placeAbove(SurfaceInterface::get(sibling));
223 void SubSurfaceInterface::Private::placeAbove(SurfaceInterface *sibling)
229 Q_Q(SubSurfaceInterface);
231 wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
"Incorrect sibling");
235 void SubSurfaceInterface::Private::placeBelowCallback(wl_client *client, wl_resource *resource, wl_resource *sibling)
238 cast<Private>(resource)->placeBelow(SurfaceInterface::get(sibling));
241 void SubSurfaceInterface::Private::placeBelow(SurfaceInterface *sibling)
247 Q_Q(SubSurfaceInterface);
249 wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
"Incorrect sibling");
253 void SubSurfaceInterface::Private::setSyncCallback(wl_client *client, wl_resource *resource)
256 cast<Private>(resource)->setMode(Mode::Synchronized);
259 void SubSurfaceInterface::Private::setDeSyncCallback(wl_client *client, wl_resource *resource)
262 cast<Private>(resource)->setMode(Mode::Desynchronized);
265 void SubSurfaceInterface::Private::setMode(Mode m)
270 if (m == Mode::Desynchronized && (!
parent->subSurface() || !
parent->subSurface()->isSynchronized())) {
273 surface->d_func()->commit();
274 surface->d_func()->commitSubSurface();
278 Q_Q(SubSurfaceInterface);
282 SubSurfaceInterface::SubSurfaceInterface(SubCompositorInterface *
parent, wl_resource *parentResource)
283 : Resource(new Private(this, parent, parentResource))
288 SubSurfaceInterface::~SubSurfaceInterface() =
default;
290 QPoint SubSurfaceInterface::position()
const 322 SubSurfaceInterface::Mode SubSurfaceInterface::mode()
const 328 bool SubSurfaceInterface::isSynchronized()
const 331 if (d->mode == Mode::Synchronized) {
338 if (!d->parent->subSurface().
isNull()) {
340 return d->parent->subSurface()->isSynchronized();
352 if (d->parent->d_func()->subSurface) {
353 return d->parent->d_func()->subSurface->mainSurface();
358 SubSurfaceInterface::Private *SubSurfaceInterface::d_func()
const 360 return reinterpret_cast<SubSurfaceInterface::Private*
>(d.
data());
QAction * create(StandardAction id, const QObject *recvr, Func slot, QObject *parent)
bool isNull() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const const
void destroyed(QObject *obj)