KWin
Loading...
Searching...
No Matches
xwaylandshell_v1.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2022 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6
7#include "xwaylandshell_v1.h"
8#include "display.h"
9#include "surface.h"
10
11#include "qwayland-server-xwayland-shell-v1.h"
12
13#include <QPointer>
14
15namespace KWin
16{
17
18static const quint32 s_version = 1;
19
20class XwaylandShellV1InterfacePrivate : public QtWaylandServer::xwayland_shell_v1
21{
22public:
24
26 QList<XwaylandSurfaceV1Interface *> m_surfaces;
27
28protected:
29 void xwayland_shell_v1_destroy(Resource *resource) override;
30 void xwayland_shell_v1_get_xwayland_surface(Resource *resource, uint32_t id, struct ::wl_resource *surface) override;
31};
32
34{
35 std::optional<uint64_t> serial;
36};
37
38class XwaylandSurfaceV1InterfacePrivate : public SurfaceExtension<XwaylandSurfaceV1Commit>, public QtWaylandServer::xwayland_surface_v1
39{
40public:
42
43 void apply(XwaylandSurfaceV1Commit *commit) override;
44
47 QPointer<SurfaceInterface> surface;
48 std::optional<uint64_t> serial;
49
50protected:
51 void xwayland_surface_v1_destroy_resource(Resource *resource) override;
52 void xwayland_surface_v1_set_serial(Resource *resource, uint32_t serial_lo, uint32_t serial_hi) override;
53 void xwayland_surface_v1_destroy(Resource *resource) override;
54};
55
57 : QtWaylandServer::xwayland_shell_v1(*display, s_version)
58 , q(q)
59{
60}
61
63{
64 wl_resource_destroy(resource->handle);
65}
66
67void XwaylandShellV1InterfacePrivate::xwayland_shell_v1_get_xwayland_surface(Resource *resource, uint32_t id, ::wl_resource *surface_resource)
68{
69 SurfaceInterface *surface = SurfaceInterface::get(surface_resource);
70
71 if (const SurfaceRole *role = surface->role()) {
73 wl_resource_post_error(resource->handle, error_role, "the surface already has a role assigned %s", role->name().constData());
74 return;
75 }
76 } else {
78 }
79
80 auto xwaylandSurface = new XwaylandSurfaceV1Interface(q, surface, resource->client(), id, resource->version());
81 m_surfaces.append(xwaylandSurface);
82 QObject::connect(xwaylandSurface, &QObject::destroyed, q, [this, xwaylandSurface]() {
83 m_surfaces.removeOne(xwaylandSurface);
84 });
85}
86
88 : SurfaceExtension(surface)
89 , QtWaylandServer::xwayland_surface_v1(client, id, version)
90 , q(q)
91 , shell(shell)
92 , surface(surface)
93{
94}
95
97{
98 if (commit->serial.has_value()) {
99 serial = commit->serial;
100 Q_EMIT shell->surfaceAssociated(q);
101 }
102}
103
108
109void XwaylandSurfaceV1InterfacePrivate::xwayland_surface_v1_set_serial(Resource *resource, uint32_t serial_lo, uint32_t serial_hi)
110{
111 const uint64_t serial = (uint64_t(serial_hi) << 32) | serial_lo;
112 if (!serial) {
113 wl_resource_post_error(resource->handle, error_invalid_serial, "given serial is 0");
114 return;
115 }
116
117 if (this->serial.has_value()) {
118 wl_resource_post_error(resource->handle, error_already_associated,
119 "xwayland_surface_v1 already has a serial assigned to it: %" PRIu64, this->serial.value());
120 return;
121 }
122
124}
125
127{
128 wl_resource_destroy(resource->handle);
129}
130
132 : QObject(parent)
133 , d(new XwaylandShellV1InterfacePrivate(display, this))
134{
135}
136
140
142{
143 for (XwaylandSurfaceV1Interface *surface : std::as_const(d->m_surfaces)) {
144 if (surface->serial() == serial) {
145 return surface;
146 }
147 }
148 return nullptr;
149}
150
152 : d(new XwaylandSurfaceV1InterfacePrivate(shell, surface, client, id, version, this))
153{
154}
155
159
161{
162 static SurfaceRole role(QByteArrayLiteral("xwayland_surface_v1"));
163 return &role;
164}
165
167{
168 return d->surface;
169}
170
171std::optional<uint64_t> XwaylandSurfaceV1Interface::serial() const
172{
173 return d->serial;
174}
175
176} // namespace KWin
177
178#include "moc_xwaylandshell_v1.cpp"
Class holding the Wayland server display loop.
Definition display.h:34
Resource representing a wl_surface.
Definition surface.h:80
static SurfaceInterface * get(wl_resource *native)
Definition surface.cpp:819
SurfaceRole * role() const
Definition surface.cpp:429
void setRole(SurfaceRole *role)
Definition surface.cpp:434
XwaylandShellV1Interface(Display *display, QObject *parent=nullptr)
void surfaceAssociated(XwaylandSurfaceV1Interface *surface)
XwaylandSurfaceV1Interface * findSurface(uint64_t serial) const
XwaylandShellV1InterfacePrivate(Display *display, XwaylandShellV1Interface *q)
void xwayland_shell_v1_get_xwayland_surface(Resource *resource, uint32_t id, struct ::wl_resource *surface) override
QList< XwaylandSurfaceV1Interface * > m_surfaces
void xwayland_shell_v1_destroy(Resource *resource) override
XwaylandSurfaceV1Interface(XwaylandShellV1Interface *shell, SurfaceInterface *surface, wl_client *client, uint32_t id, int version)
SurfaceInterface * surface() const
std::optional< uint64_t > serial() const
void apply(XwaylandSurfaceV1Commit *commit) override
void xwayland_surface_v1_set_serial(Resource *resource, uint32_t serial_lo, uint32_t serial_hi) override
void xwayland_surface_v1_destroy_resource(Resource *resource) override
void xwayland_surface_v1_destroy(Resource *resource) override
XwaylandSurfaceV1InterfacePrivate(XwaylandShellV1Interface *shell, SurfaceInterface *surface, wl_client *client, uint32_t id, int version, XwaylandSurfaceV1Interface *q)
constexpr int version
std::optional< uint64_t > serial