6 #include "xdgdecoration_interface.h"
10 #include "resource_p.h"
11 #include "xdgshell_interface.h"
12 #include "xdgshell_stable_interface_p.h"
14 #include "wayland-xdg-decoration-server-protocol.h"
23 class XdgDecorationManagerInterface::Private :
public Global::Private
26 Private(XdgDecorationManagerInterface *q, XdgShellInterface *shellInterface, Display *d);
29 KWayland::Server::XdgShellStableInterface *m_shellInterface;
32 void bind(wl_client *client, uint32_t version, uint32_t
id)
override;
34 static void unbind(wl_resource *resource);
35 static Private *cast(wl_resource *r)
37 return reinterpret_cast<Private *
>(wl_resource_get_user_data(r));
40 static void destroyCallback(wl_client *client, wl_resource *resource);
41 static void getToplevelDecorationCallback(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *toplevel);
43 XdgDecorationManagerInterface *q;
44 static const struct zxdg_decoration_manager_v1_interface s_interface;
45 static const quint32 s_version;
48 const quint32 XdgDecorationManagerInterface::Private::s_version = 1;
50 XdgDecorationManagerInterface::XdgDecorationManagerInterface(Display *display, XdgShellInterface *shellInterface,
QObject *parent)
51 : Global(new Private(this, shellInterface, display), parent)
55 XdgDecorationManagerInterface::~XdgDecorationManagerInterface()
60 const struct zxdg_decoration_manager_v1_interface XdgDecorationManagerInterface::Private::s_interface = {destroyCallback, getToplevelDecorationCallback};
63 void XdgDecorationManagerInterface::Private::destroyCallback(wl_client *client, wl_resource *resource)
66 wl_resource_destroy(resource);
69 void XdgDecorationManagerInterface::Private::getToplevelDecorationCallback(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *toplevel)
71 auto p =
reinterpret_cast<Private *
>(wl_resource_get_user_data(resource));
74 auto shell = p->m_shellInterface->getSurface(toplevel);
76 wl_resource_post_error(resource, ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ORPHANED,
"No XDGToplevel found object");
79 if (p->m_decorations.contains(shell)) {
80 wl_resource_post_error(resource, ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ALREADY_CONSTRUCTED,
"XDGDecoration already exists for this surface");
84 auto xdgDecoration =
new XdgDecorationInterface(p->q, shell, resource);
85 xdgDecoration->create(p->display->getConnection(client), wl_resource_get_version(resource),
id);
86 if (!xdgDecoration->resource()) {
87 wl_resource_post_no_memory(resource);
91 p->m_decorations[shell] = xdgDecoration;
93 p->m_decorations.remove(shell);
95 Q_EMIT p->q->xdgDecorationInterfaceCreated(xdgDecoration);
98 XdgDecorationManagerInterface::Private::Private(XdgDecorationManagerInterface *q, XdgShellInterface *shellInterface, Display *d)
99 : Global::Private(d, &zxdg_decoration_manager_v1_interface, s_version)
102 m_shellInterface = qobject_cast<XdgShellStableInterface *>(shellInterface);
103 Q_ASSERT(m_shellInterface);
106 void XdgDecorationManagerInterface::Private::bind(wl_client *client, uint32_t version, uint32_t
id)
108 auto c = display->getConnection(client);
109 wl_resource *resource = c->createResource(&zxdg_decoration_manager_v1_interface, qMin(version, s_version),
id);
111 wl_client_post_no_memory(client);
114 wl_resource_set_implementation(resource, &s_interface,
this, unbind);
117 void XdgDecorationManagerInterface::Private::unbind(wl_resource *resource)
122 class XdgDecorationInterface::Private :
public Resource::Private
125 Private(XdgDecorationInterface *q, XdgDecorationManagerInterface *c, XdgShellSurfaceInterface *s, wl_resource *parentResource);
127 Mode m_requestedMode = Mode::Undefined;
128 XdgShellSurfaceInterface *m_shell;
131 static void setModeCallback(wl_client *client, wl_resource *resource, uint32_t mode);
132 static void unsetModeCallback(wl_client *client, wl_resource *resource);
134 XdgDecorationInterface *q_func()
136 return reinterpret_cast<XdgDecorationInterface *
>(q);
139 static const struct zxdg_toplevel_decoration_v1_interface s_interface;
143 const struct zxdg_toplevel_decoration_v1_interface XdgDecorationInterface::Private::s_interface = {resourceDestroyedCallback,
148 void XdgDecorationInterface::Private::setModeCallback(wl_client *client, wl_resource *resource, uint32_t mode_raw)
151 auto p =
reinterpret_cast<Private *
>(wl_resource_get_user_data(resource));
154 Mode mode = Mode::Undefined;
156 case ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE:
157 mode = Mode::ClientSide;
159 case ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE:
160 mode = Mode::ServerSide;
166 p->m_requestedMode = mode;
167 Q_EMIT p->q_func()->modeRequested(p->m_requestedMode);
170 void XdgDecorationInterface::Private::unsetModeCallback(wl_client *client, wl_resource *resource)
173 auto p =
reinterpret_cast<Private *
>(wl_resource_get_user_data(resource));
176 p->m_requestedMode = Mode::Undefined;
177 Q_EMIT p->q_func()->modeRequested(p->m_requestedMode);
180 XdgDecorationInterface::Private::Private(XdgDecorationInterface *q,
181 XdgDecorationManagerInterface *c,
182 XdgShellSurfaceInterface *shell,
183 wl_resource *parentResource)
184 :
Resource::Private(q, c, parentResource, &zxdg_toplevel_decoration_v1_interface, &s_interface)
189 XdgDecorationInterface::Private::~Private()
192 wl_resource_destroy(resource);
197 XdgDecorationInterface::XdgDecorationInterface(XdgDecorationManagerInterface *parent, XdgShellSurfaceInterface *shell, wl_resource *parentResource)
198 :
Resource(new Private(this, parent, shell, parentResource))
202 XdgDecorationInterface::~XdgDecorationInterface()
206 void XdgDecorationInterface::configure(XdgDecorationInterface::Mode mode)
209 case Mode::ClientSide:
210 zxdg_toplevel_decoration_v1_send_configure(resource(), ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE);
212 case Mode::ServerSide:
213 zxdg_toplevel_decoration_v1_send_configure(resource(), ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
221 XdgDecorationInterface::Mode XdgDecorationInterface::requestedMode()
const
224 return d->m_requestedMode;
233 XdgDecorationInterface::Private *XdgDecorationInterface::d_func()
const
235 return reinterpret_cast<XdgDecorationInterface::Private *
>(d.data());