6 #include "compositor_interface.h"
10 #include <wayland-server.h>
16 class CompositorInterface::Private :
public Global::Private
19 Private(CompositorInterface *q, Display *d);
22 void bind(wl_client *client, uint32_t version, uint32_t
id)
override;
23 void createSurface(wl_client *client, wl_resource *resource, uint32_t
id);
24 void createRegion(wl_client *client, wl_resource *resource, uint32_t
id);
26 static void unbind(wl_resource *resource);
27 static void createSurfaceCallback(wl_client *client, wl_resource *resource, uint32_t
id);
28 static void createRegionCallback(wl_client *client, wl_resource *resource, uint32_t
id);
29 static Private *cast(wl_resource *r)
31 return reinterpret_cast<Private *
>(wl_resource_get_user_data(r));
34 CompositorInterface *q;
35 static const struct wl_compositor_interface s_interface;
36 static const quint32 s_version;
39 const quint32 CompositorInterface::Private::s_version = 4;
41 CompositorInterface::Private::Private(CompositorInterface *q, Display *d)
42 : Global::Private(d, &wl_compositor_interface, s_version)
48 const struct wl_compositor_interface CompositorInterface::Private::s_interface = {createSurfaceCallback, createRegionCallback};
51 CompositorInterface::CompositorInterface(Display *display,
QObject *parent)
52 : Global(new Private(this, display), parent)
56 CompositorInterface::~CompositorInterface() =
default;
58 void CompositorInterface::Private::bind(wl_client *client, uint32_t version, uint32_t
id)
60 auto c = display->getConnection(client);
61 wl_resource *resource = c->createResource(&wl_compositor_interface, qMin(version, s_version),
id);
63 wl_client_post_no_memory(client);
66 wl_resource_set_implementation(resource, &s_interface,
this, unbind);
70 void CompositorInterface::Private::unbind(wl_resource *resource)
76 void CompositorInterface::Private::createSurfaceCallback(wl_client *client, wl_resource *resource, uint32_t
id)
78 cast(resource)->createSurface(client, resource,
id);
81 void CompositorInterface::Private::createSurface(wl_client *client, wl_resource *resource, uint32_t
id)
83 SurfaceInterface *surface =
new SurfaceInterface(q, resource);
84 surface->create(display->getConnection(client), wl_resource_get_version(resource),
id);
85 if (!surface->resource()) {
86 wl_resource_post_no_memory(resource);
90 Q_EMIT q->surfaceCreated(surface);
93 void CompositorInterface::Private::createRegionCallback(wl_client *client, wl_resource *resource, uint32_t
id)
95 cast(resource)->createRegion(client, resource,
id);
98 void CompositorInterface::Private::createRegion(wl_client *client, wl_resource *resource, uint32_t
id)
100 RegionInterface *region =
new RegionInterface(q, resource);
101 region->create(display->getConnection(client), wl_resource_get_version(resource),
id);
102 if (!region->resource()) {
103 wl_resource_post_no_memory(resource);
107 Q_EMIT q->regionCreated(region);