1 | /* |
2 | SPDX-FileCopyrightText: 2019 Vlad Zahorodnii <vlad.zahorodnii@kde.org> |
3 | |
4 | SPDX-License-Identifier: LGPL-2.1-or-later |
5 | */ |
6 | |
7 | #include "kwindowshadow.h" |
8 | #include "kwindowshadow_dummy_p.h" |
9 | #include "kwindowshadow_p.h" |
10 | #include "kwindowsystem_debug.h" |
11 | #include "pluginwrapper_p.h" |
12 | |
13 | #include <array> |
14 | |
15 | KWindowShadowTile::KWindowShadowTile() |
16 | : d(KWindowSystemPluginWrapper::self().createWindowShadowTile()) |
17 | { |
18 | } |
19 | |
20 | KWindowShadowTile::~KWindowShadowTile() |
21 | { |
22 | if (d->isCreated) { |
23 | d->destroy(); |
24 | } |
25 | } |
26 | |
27 | QImage KWindowShadowTile::image() const |
28 | { |
29 | return d->image; |
30 | } |
31 | |
32 | void KWindowShadowTile::setImage(const QImage &image) |
33 | { |
34 | if (d->isCreated) { |
35 | qCWarning(LOG_KWINDOWSYSTEM, |
36 | "Cannot change the image on a tile that already has native " |
37 | "platform resources allocated." ); |
38 | return; |
39 | } |
40 | d->image = image; |
41 | } |
42 | |
43 | bool KWindowShadowTile::isCreated() const |
44 | { |
45 | return d->isCreated; |
46 | } |
47 | |
48 | bool KWindowShadowTile::create() |
49 | { |
50 | if (d->isCreated) { |
51 | return true; |
52 | } |
53 | d->isCreated = d->create(); |
54 | return d->isCreated; |
55 | } |
56 | |
57 | KWindowShadow::KWindowShadow(QObject *parent) |
58 | : QObject(parent) |
59 | , d(KWindowSystemPluginWrapper::self().createWindowShadow()) |
60 | { |
61 | } |
62 | |
63 | KWindowShadow::~KWindowShadow() |
64 | { |
65 | destroy(); |
66 | } |
67 | |
68 | KWindowShadowTile::Ptr KWindowShadow::leftTile() const |
69 | { |
70 | return d->leftTile; |
71 | } |
72 | |
73 | void KWindowShadow::setLeftTile(KWindowShadowTile::Ptr tile) |
74 | { |
75 | if (d->isCreated) { |
76 | qCWarning(LOG_KWINDOWSYSTEM, |
77 | "Cannot attach a left tile to a shadow that already has " |
78 | "native platform resources allocated. To do so, destroy() the shadow and then " |
79 | "setLeftTile() and create()" ); |
80 | return; |
81 | } |
82 | d->leftTile = tile; |
83 | } |
84 | |
85 | KWindowShadowTile::Ptr KWindowShadow::topLeftTile() const |
86 | { |
87 | return d->topLeftTile; |
88 | } |
89 | |
90 | void KWindowShadow::setTopLeftTile(KWindowShadowTile::Ptr tile) |
91 | { |
92 | if (d->isCreated) { |
93 | qCWarning(LOG_KWINDOWSYSTEM, |
94 | "Cannot attach a top-left tile to a shadow that already has " |
95 | "native platform resources allocated. To do so, destroy() the shadow and then " |
96 | "setTopLeftTile() and create()" ); |
97 | return; |
98 | } |
99 | d->topLeftTile = tile; |
100 | } |
101 | |
102 | KWindowShadowTile::Ptr KWindowShadow::topTile() const |
103 | { |
104 | return d->topTile; |
105 | } |
106 | |
107 | void KWindowShadow::setTopTile(KWindowShadowTile::Ptr tile) |
108 | { |
109 | if (d->isCreated) { |
110 | qCWarning(LOG_KWINDOWSYSTEM, |
111 | "Cannot attach a top tile to a shadow that already has " |
112 | "native platform resources allocated. To do so, destroy() the shadow and then " |
113 | "setTopTile() and create()" ); |
114 | return; |
115 | } |
116 | d->topTile = tile; |
117 | } |
118 | |
119 | KWindowShadowTile::Ptr KWindowShadow::topRightTile() const |
120 | { |
121 | return d->topRightTile; |
122 | } |
123 | |
124 | void KWindowShadow::setTopRightTile(KWindowShadowTile::Ptr tile) |
125 | { |
126 | if (d->isCreated) { |
127 | qCWarning(LOG_KWINDOWSYSTEM, |
128 | "Cannot attach a top-right tile to a shadow that already " |
129 | "has native platform resources allocated. To do so, destroy() the shadow and " |
130 | "then setTopRightTile() and create()" ); |
131 | return; |
132 | } |
133 | d->topRightTile = tile; |
134 | } |
135 | |
136 | KWindowShadowTile::Ptr KWindowShadow::rightTile() const |
137 | { |
138 | return d->rightTile; |
139 | } |
140 | |
141 | void KWindowShadow::setRightTile(KWindowShadowTile::Ptr tile) |
142 | { |
143 | if (d->isCreated) { |
144 | qCWarning(LOG_KWINDOWSYSTEM, |
145 | "Cannot attach a right tile to a shadow that already has " |
146 | "native platform resources allocated. To do so, destroy() the shadow and then " |
147 | "setRightTile() and create()" ); |
148 | return; |
149 | } |
150 | d->rightTile = tile; |
151 | } |
152 | |
153 | KWindowShadowTile::Ptr KWindowShadow::bottomRightTile() const |
154 | { |
155 | return d->bottomRightTile; |
156 | } |
157 | |
158 | void KWindowShadow::setBottomRightTile(KWindowShadowTile::Ptr tile) |
159 | { |
160 | if (d->isCreated) { |
161 | qCWarning(LOG_KWINDOWSYSTEM, |
162 | "Cannot attach a bottom-right tile to a shadow that already " |
163 | "has native platform resources allocated. To do so, destroy() the shadow and " |
164 | "then setBottomRightTile() and create()" ); |
165 | return; |
166 | } |
167 | d->bottomRightTile = tile; |
168 | } |
169 | |
170 | KWindowShadowTile::Ptr KWindowShadow::bottomTile() const |
171 | { |
172 | return d->bottomTile; |
173 | } |
174 | |
175 | void KWindowShadow::setBottomTile(KWindowShadowTile::Ptr tile) |
176 | { |
177 | if (d->isCreated) { |
178 | qCWarning(LOG_KWINDOWSYSTEM, |
179 | "Cannot attach a bottom tile to a shadow that already has " |
180 | "native platform resources allocated. To do so, destroy() the shadow and then " |
181 | "setBottomTile() and create()" ); |
182 | return; |
183 | } |
184 | d->bottomTile = tile; |
185 | } |
186 | |
187 | KWindowShadowTile::Ptr KWindowShadow::bottomLeftTile() const |
188 | { |
189 | return d->bottomLeftTile; |
190 | } |
191 | |
192 | void KWindowShadow::setBottomLeftTile(KWindowShadowTile::Ptr tile) |
193 | { |
194 | if (d->isCreated) { |
195 | qCWarning(LOG_KWINDOWSYSTEM, |
196 | "Cannot attach a bottom-left tile to a shadow that already " |
197 | "has native platform resources allocated. To do so, destroy() the shadow and " |
198 | "then setBottomLeftTile() and create()" ); |
199 | return; |
200 | } |
201 | d->bottomLeftTile = tile; |
202 | } |
203 | |
204 | QMargins KWindowShadow::padding() const |
205 | { |
206 | return d->padding; |
207 | } |
208 | |
209 | void KWindowShadow::setPadding(const QMargins &padding) |
210 | { |
211 | if (d->isCreated) { |
212 | qCWarning(LOG_KWINDOWSYSTEM, |
213 | "Cannot set the padding on a shadow that already has " |
214 | "native platform resources allocated. To do so, destroy() the shadow and " |
215 | "then setPadding() and create()" ); |
216 | return; |
217 | } |
218 | d->padding = padding; |
219 | } |
220 | |
221 | QWindow *KWindowShadow::window() const |
222 | { |
223 | return d->window; |
224 | } |
225 | |
226 | void KWindowShadow::setWindow(QWindow *window) |
227 | { |
228 | if (d->isCreated) { |
229 | qCWarning(LOG_KWINDOWSYSTEM, |
230 | "Cannot set the target window on a shadow that already has " |
231 | "native platform resources allocated. To do so, destroy() the shadow and then " |
232 | "setWindow() and create()" ); |
233 | return; |
234 | } |
235 | d->window = window; |
236 | } |
237 | |
238 | bool KWindowShadow::isCreated() const |
239 | { |
240 | return d->isCreated; |
241 | } |
242 | |
243 | bool KWindowShadow::create() |
244 | { |
245 | if (d->isCreated) { |
246 | return true; |
247 | } |
248 | if (!d->window) { |
249 | qCWarning(LOG_KWINDOWSYSTEM, |
250 | "Cannot allocate the native platform resources for the shadow " |
251 | "because the target window is not specified." ); |
252 | return false; |
253 | } |
254 | if (!d->prepareTiles()) { |
255 | return false; |
256 | } |
257 | d->isCreated = d->create(); |
258 | return d->isCreated; |
259 | } |
260 | |
261 | void KWindowShadow::destroy() |
262 | { |
263 | if (!d->isCreated) { |
264 | return; |
265 | } |
266 | d->destroy(); |
267 | d->isCreated = false; |
268 | } |
269 | |
270 | KWindowShadowTilePrivate::~KWindowShadowTilePrivate() |
271 | { |
272 | } |
273 | |
274 | KWindowShadowTilePrivate *KWindowShadowTilePrivate::get(const KWindowShadowTile *tile) |
275 | { |
276 | return tile->d.data(); |
277 | } |
278 | |
279 | KWindowShadowPrivate::~KWindowShadowPrivate() |
280 | { |
281 | } |
282 | |
283 | bool KWindowShadowPrivate::create() |
284 | { |
285 | return false; |
286 | } |
287 | |
288 | void KWindowShadowPrivate::destroy() |
289 | { |
290 | } |
291 | |
292 | bool KWindowShadowPrivate::prepareTiles() |
293 | { |
294 | const std::array<KWindowShadowTile *, 8> tiles{ |
295 | leftTile.data(), |
296 | topLeftTile.data(), |
297 | topTile.data(), |
298 | topRightTile.data(), |
299 | rightTile.data(), |
300 | bottomRightTile.data(), |
301 | bottomTile.data(), |
302 | bottomLeftTile.data(), |
303 | }; |
304 | |
305 | for (KWindowShadowTile *tile : tiles) { |
306 | if (!tile) { |
307 | continue; |
308 | } |
309 | if (tile->isCreated()) { |
310 | continue; |
311 | } |
312 | if (!tile->create()) { |
313 | return false; |
314 | } |
315 | } |
316 | |
317 | return true; |
318 | } |
319 | |
320 | bool KWindowShadowTilePrivateDummy::create() |
321 | { |
322 | return false; |
323 | } |
324 | |
325 | void KWindowShadowTilePrivateDummy::destroy() |
326 | { |
327 | } |
328 | |
329 | bool KWindowShadowPrivateDummy::create() |
330 | { |
331 | return false; |
332 | } |
333 | |
334 | void KWindowShadowPrivateDummy::destroy() |
335 | { |
336 | } |
337 | |
338 | #include "moc_kwindowshadow.cpp" |
339 | |