Changeset View
Changeset View
Standalone View
Standalone View
src/server/server_decoration_palette_interface.cpp
- This file was added.
1 | /**************************************************************************** | ||||
---|---|---|---|---|---|
2 | Copyright 2017 David Edmundson <kde@davidedmundson.co.uk> | ||||
3 | | ||||
4 | This library is free software; you can redistribute it and/or | ||||
5 | modify it under the terms of the GNU Lesser General Public | ||||
6 | License as published by the Free Software Foundation; either | ||||
7 | version 2.1 of the License, or (at your option) version 3, or any | ||||
8 | later version accepted by the membership of KDE e.V. (or its | ||||
9 | successor approved by the membership of KDE e.V.), which shall | ||||
10 | act as a proxy defined in Section 6 of version 3 of the license. | ||||
11 | | ||||
12 | This library is distributed in the hope that it will be useful, | ||||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||||
15 | Lesser General Public License for more details. | ||||
16 | | ||||
17 | You should have received a copy of the GNU Lesser General Public | ||||
18 | License along with this library. If not, see <http://www.gnu.org/licenses/>. | ||||
19 | ****************************************************************************/ | ||||
20 | #include "server_decoration_palette_interface.h" | ||||
21 | #include "display.h" | ||||
22 | #include "surface_interface.h" | ||||
23 | #include "global_p.h" | ||||
24 | #include "resource_p.h" | ||||
25 | #include "logging_p.h" | ||||
26 | | ||||
27 | #include <QtGlobal> | ||||
28 | | ||||
29 | #include <wayland-server_decoration_palette-server-protocol.h> | ||||
30 | | ||||
31 | namespace KWayland | ||||
32 | { | ||||
33 | namespace Server | ||||
34 | { | ||||
35 | class ServerSideDecorationPaletteManagerInterface::Private : public Global::Private | ||||
36 | { | ||||
37 | public: | ||||
38 | Private(ServerSideDecorationPaletteManagerInterface *q, Display *d); | ||||
39 | | ||||
40 | QVector<ServerSideDecorationPaletteInterface*> palettes; | ||||
41 | private: | ||||
42 | void bind(wl_client *client, uint32_t version, uint32_t id) override; | ||||
43 | | ||||
44 | static void unbind(wl_resource *resource); | ||||
45 | static Private *cast(wl_resource *r) { | ||||
46 | return reinterpret_cast<Private*>(wl_resource_get_user_data(r)); | ||||
47 | } | ||||
48 | | ||||
49 | static void createCallback(wl_client *client, wl_resource *resource, uint32_t id, wl_resource * surface); | ||||
50 | | ||||
51 | ServerSideDecorationPaletteManagerInterface *q; | ||||
52 | static const struct org_kde_kwin_server_decoration_palette_manager_interface s_interface; | ||||
53 | static const quint32 s_version; | ||||
54 | }; | ||||
55 | | ||||
56 | const quint32 ServerSideDecorationPaletteManagerInterface::Private::s_version = 1; | ||||
57 | | ||||
58 | #ifndef DOXYGEN_SHOULD_SKIP_THIS | ||||
59 | const struct org_kde_kwin_server_decoration_palette_manager_interface ServerSideDecorationPaletteManagerInterface::Private::s_interface = { | ||||
60 | createCallback | ||||
61 | }; | ||||
62 | #endif | ||||
63 | | ||||
64 | void ServerSideDecorationPaletteManagerInterface::Private::createCallback(wl_client *client, wl_resource *resource, uint32_t id, wl_resource * surface) | ||||
65 | { | ||||
66 | auto p = reinterpret_cast<Private*>(wl_resource_get_user_data(resource)); | ||||
67 | Q_ASSERT(p); | ||||
68 | | ||||
69 | SurfaceInterface *s = SurfaceInterface::get(surface); | ||||
70 | if (!s) { | ||||
71 | // TODO: send error? | ||||
72 | qCWarning(KWAYLAND_SERVER) << "ServerSideDecorationPaletteInterface requested for non existing SurfaceInterface"; | ||||
73 | return; | ||||
74 | } | ||||
75 | auto palette = new ServerSideDecorationPaletteInterface(p->q, s, resource); | ||||
76 | palette->create(p->display->getConnection(client), wl_resource_get_version(resource), id); | ||||
77 | if (!palette->resource()) { | ||||
78 | wl_resource_post_no_memory(resource); | ||||
79 | delete palette; | ||||
80 | return; | ||||
81 | } | ||||
82 | p->palettes.append(palette); | ||||
83 | QObject::connect(palette, &QObject::destroyed, p->q, [=]() { | ||||
84 | p->palettes.removeOne(palette); | ||||
85 | }); | ||||
86 | emit p->q->paletteCreated(palette); | ||||
87 | } | ||||
88 | | ||||
89 | ServerSideDecorationPaletteManagerInterface::Private::Private(ServerSideDecorationPaletteManagerInterface *q, Display *d) | ||||
90 | : Global::Private(d, &org_kde_kwin_server_decoration_palette_manager_interface, s_version) | ||||
91 | , q(q) | ||||
92 | { | ||||
93 | } | ||||
94 | | ||||
95 | void ServerSideDecorationPaletteManagerInterface::Private::bind(wl_client *client, uint32_t version, uint32_t id) | ||||
96 | { | ||||
97 | auto c = display->getConnection(client); | ||||
98 | wl_resource *resource = c->createResource(&org_kde_kwin_server_decoration_palette_manager_interface, qMin(version, s_version), id); | ||||
99 | if (!resource) { | ||||
100 | wl_client_post_no_memory(client); | ||||
101 | return; | ||||
102 | } | ||||
103 | wl_resource_set_implementation(resource, &s_interface, this, unbind); | ||||
104 | } | ||||
105 | | ||||
106 | void ServerSideDecorationPaletteManagerInterface::Private::unbind(wl_resource *resource) | ||||
107 | { | ||||
108 | Q_UNUSED(resource) | ||||
109 | } | ||||
110 | | ||||
111 | class ServerSideDecorationPaletteInterface::Private : public Resource::Private | ||||
112 | { | ||||
113 | public: | ||||
114 | Private(ServerSideDecorationPaletteInterface *q, ServerSideDecorationPaletteManagerInterface *c, SurfaceInterface *surface, wl_resource *parentResource); | ||||
115 | ~Private(); | ||||
116 | | ||||
117 | | ||||
118 | SurfaceInterface *surface; | ||||
119 | QString palette; | ||||
120 | private: | ||||
121 | static void setPaletteCallback(wl_client *client, wl_resource *resource, const char * palette); | ||||
122 | | ||||
123 | ServerSideDecorationPaletteInterface *q_func() { | ||||
124 | return reinterpret_cast<ServerSideDecorationPaletteInterface *>(q); | ||||
125 | } | ||||
126 | static ServerSideDecorationPaletteInterface *get(SurfaceInterface *s); | ||||
127 | static const struct org_kde_kwin_server_decoration_palette_interface s_interface; | ||||
128 | }; | ||||
129 | | ||||
130 | #ifndef DOXYGEN_SHOULD_SKIP_THIS | ||||
131 | const struct org_kde_kwin_server_decoration_palette_interface ServerSideDecorationPaletteInterface::Private::s_interface = { | ||||
132 | setPaletteCallback, | ||||
133 | resourceDestroyedCallback | ||||
134 | }; | ||||
135 | #endif | ||||
136 | | ||||
137 | void ServerSideDecorationPaletteInterface::Private::setPaletteCallback(wl_client *client, wl_resource *resource, const char * palette) | ||||
138 | { | ||||
139 | Q_UNUSED(client); | ||||
140 | auto p = reinterpret_cast<Private*>(wl_resource_get_user_data(resource)); | ||||
141 | Q_ASSERT(p); | ||||
142 | | ||||
143 | if (p->palette == QLatin1String(palette)) { | ||||
144 | return; | ||||
145 | } | ||||
146 | p->palette = QString::fromUtf8(palette); | ||||
147 | emit p->q_func()->paletteChanged(p->palette); | ||||
148 | } | ||||
149 | | ||||
150 | ServerSideDecorationPaletteInterface::Private::Private(ServerSideDecorationPaletteInterface *q, ServerSideDecorationPaletteManagerInterface *c, SurfaceInterface *s, wl_resource *parentResource) | ||||
151 | : Resource::Private(q, c, parentResource, &org_kde_kwin_server_decoration_palette_interface, &s_interface), | ||||
152 | surface(s) | ||||
153 | { | ||||
154 | } | ||||
155 | | ||||
156 | ServerSideDecorationPaletteInterface::Private::~Private() | ||||
157 | { | ||||
158 | if (resource) { | ||||
159 | wl_resource_destroy(resource); | ||||
160 | resource = nullptr; | ||||
161 | } | ||||
162 | } | ||||
163 | | ||||
164 | ServerSideDecorationPaletteManagerInterface::ServerSideDecorationPaletteManagerInterface(Display *display, QObject *parent) | ||||
165 | : Global(new Private(this, display), parent) | ||||
166 | { | ||||
167 | } | ||||
168 | | ||||
169 | ServerSideDecorationPaletteManagerInterface::~ServerSideDecorationPaletteManagerInterface() | ||||
170 | { | ||||
171 | } | ||||
172 | | ||||
173 | ServerSideDecorationPaletteManagerInterface::Private *ServerSideDecorationPaletteManagerInterface::d_func() const | ||||
174 | { | ||||
175 | return reinterpret_cast<ServerSideDecorationPaletteManagerInterface::Private*>(d.data()); | ||||
176 | } | ||||
177 | | ||||
178 | ServerSideDecorationPaletteInterface* ServerSideDecorationPaletteManagerInterface::paletteForSurface(SurfaceInterface *surface) | ||||
179 | { | ||||
180 | Q_D(); | ||||
181 | for (ServerSideDecorationPaletteInterface* menu: d->palettes) { | ||||
182 | if (menu->surface() == surface) { | ||||
183 | return menu; | ||||
184 | } | ||||
185 | } | ||||
186 | return nullptr; | ||||
187 | } | ||||
188 | | ||||
189 | ServerSideDecorationPaletteInterface::ServerSideDecorationPaletteInterface(ServerSideDecorationPaletteManagerInterface *parent, SurfaceInterface *s, wl_resource *parentResource): | ||||
190 | Resource(new Private(this, parent, s, parentResource)) | ||||
191 | { | ||||
192 | } | ||||
193 | | ||||
194 | ServerSideDecorationPaletteInterface::Private *ServerSideDecorationPaletteInterface::d_func() const | ||||
195 | { | ||||
196 | return reinterpret_cast<ServerSideDecorationPaletteInterface::Private*>(d.data()); | ||||
197 | } | ||||
198 | | ||||
199 | ServerSideDecorationPaletteInterface::~ServerSideDecorationPaletteInterface() | ||||
200 | {} | ||||
201 | | ||||
202 | QString ServerSideDecorationPaletteInterface::palette() const | ||||
203 | { | ||||
204 | Q_D(); | ||||
205 | return d->palette; | ||||
206 | } | ||||
207 | | ||||
208 | SurfaceInterface* ServerSideDecorationPaletteInterface::surface() const | ||||
209 | { | ||||
210 | Q_D(); | ||||
211 | return d->surface; | ||||
212 | } | ||||
213 | | ||||
214 | }//namespace | ||||
215 | } | ||||
216 | |