Changeset View
Changeset View
Standalone View
Standalone View
src/server/xdgforeign_v2_interface.cpp
Show First 20 Lines • Show All 233 Lines • ▼ Show 20 Line(s) | 233 | { | |||
---|---|---|---|---|---|
234 | return reinterpret_cast<Private*>(d.data()); | 234 | return reinterpret_cast<Private*>(d.data()); | ||
235 | } | 235 | } | ||
236 | 236 | | |||
237 | void XdgImporterUnstableV2Interface::Private::destroyCallback(wl_client *client, wl_resource *resource) | 237 | void XdgImporterUnstableV2Interface::Private::destroyCallback(wl_client *client, wl_resource *resource) | ||
238 | { | 238 | { | ||
239 | Q_UNUSED(client) | 239 | Q_UNUSED(client) | ||
240 | } | 240 | } | ||
241 | 241 | | |||
242 | void XdgImporterUnstableV2Interface::Private::importCallback(wl_client *client, wl_resource *resource, uint32_t id, const char * handle) | 242 | void XdgImporterUnstableV2Interface::Private::importCallback(wl_client *client, wl_resource *resource, uint32_t id, const char *h) | ||
243 | { | 243 | { | ||
244 | auto s = cast(resource); | 244 | auto s = cast(resource); | ||
245 | 245 | | |||
246 | Q_ASSERT(s->foreignInterface); | 246 | Q_ASSERT(s->foreignInterface); | ||
247 | const QString handle = QString::fromUtf8(h); | ||||
247 | 248 | | |||
248 | XdgExportedUnstableV2Interface *exp = s->foreignInterface->d->exporter->exportedSurface(QString::fromUtf8(handle)); | 249 | XdgExportedUnstableV2Interface *exp = s->foreignInterface->d->exporter->exportedSurface(handle); | ||
249 | if (!exp) { | 250 | if (!exp) { | ||
250 | zxdg_imported_v2_send_destroyed(resource); | 251 | zxdg_imported_v2_send_destroyed(resource); | ||
251 | return; | 252 | return; | ||
252 | } | 253 | } | ||
253 | 254 | | |||
254 | wl_resource *surface = exp->parentResource(); | 255 | wl_resource *surface = exp->parentResource(); | ||
255 | if (!surface) { | 256 | if (!surface) { | ||
256 | zxdg_imported_v2_send_destroyed(resource); | 257 | zxdg_imported_v2_send_destroyed(resource); | ||
257 | return; | 258 | return; | ||
258 | } | 259 | } | ||
259 | 260 | | |||
260 | QPointer<XdgImportedUnstableV2Interface> imp = new XdgImportedUnstableV2Interface(s->q, surface); | 261 | QPointer<XdgImportedUnstableV2Interface> imp = new XdgImportedUnstableV2Interface(s->q, surface); | ||
261 | imp->create(s->display->getConnection(client), wl_resource_get_version(resource), id); | 262 | imp->create(s->display->getConnection(client), wl_resource_get_version(resource), id); | ||
262 | 263 | | |||
263 | //surface no longer exported | 264 | //surface no longer exported | ||
264 | connect(exp, &XdgExportedUnstableV2Interface::unbound, | 265 | connect(exp, &XdgExportedUnstableV2Interface::unbound, | ||
265 | s->q, [s, imp, handle]() { | 266 | s->q, [s, imp, handle]() { | ||
266 | //imp valid when the exported is deleted before the imported | 267 | //imp valid when the exported is deleted before the imported | ||
267 | if (imp) { | 268 | if (imp) { | ||
268 | zxdg_imported_v2_send_destroyed(imp->resource()); | 269 | zxdg_imported_v2_send_destroyed(imp->resource()); | ||
269 | imp->deleteLater(); | 270 | imp->deleteLater(); | ||
270 | } | 271 | } | ||
271 | s->importedSurfaces.remove(QString::fromUtf8(handle)); | 272 | s->importedSurfaces.remove(handle); | ||
272 | emit s->q->surfaceUnimported(QString::fromUtf8(handle)); | 273 | emit s->q->surfaceUnimported(handle); | ||
273 | }); | 274 | }); | ||
274 | 275 | | |||
275 | connect(imp.data(), &XdgImportedUnstableV2Interface::childChanged, | 276 | connect(imp.data(), &XdgImportedUnstableV2Interface::childChanged, | ||
276 | s->q, [s, imp](SurfaceInterface *child) { | 277 | s->q, [s, imp](SurfaceInterface *child) { | ||
277 | //remove any previous association | 278 | //remove any previous association | ||
278 | auto it = s->children.find(imp); | 279 | auto it = s->children.find(imp); | ||
279 | if (it != s->children.end()) { | 280 | if (it != s->children.end()) { | ||
280 | s->parents.remove(*it); | 281 | s->parents.remove(*it); | ||
281 | s->children.erase(it); | 282 | s->children.erase(it); | ||
282 | } | 283 | } | ||
283 | 284 | | |||
284 | s->parents[child] = imp; | 285 | s->parents[child] = imp; | ||
285 | s->children[imp] = child; | 286 | s->children[imp] = child; | ||
286 | SurfaceInterface *parent = SurfaceInterface::get(imp->parentResource()); | 287 | SurfaceInterface *parent = SurfaceInterface::get(imp->parentResource()); | ||
287 | emit s->q->transientChanged(child, parent); | 288 | emit s->q->transientChanged(child, parent); | ||
288 | 289 | | |||
289 | //child surface destroyed | 290 | //child surface destroyed | ||
290 | connect(child, &Resource::unbound, | 291 | connect(child, &Resource::unbound, | ||
291 | s->q, [s, child]() { | 292 | s->q, [s, child]() { | ||
292 | auto it = s->parents.find(child); | 293 | auto it = s->parents.find(child); | ||
293 | if (it != s->parents.end()) { | 294 | if (it != s->parents.end()) { | ||
295 | KWayland::Server::XdgImportedUnstableV2Interface* parent = *it; | ||||
294 | s->children.remove(*it); | 296 | s->children.remove(*it); | ||
295 | s->parents.erase(it); | 297 | s->parents.erase(it); | ||
296 | emit s->q->transientChanged(nullptr, SurfaceInterface::get((*it)->parentResource())); | 298 | emit s->q->transientChanged(nullptr, SurfaceInterface::get(parent->parentResource())); | ||
297 | } | 299 | } | ||
298 | }); | 300 | }); | ||
299 | }); | 301 | }); | ||
300 | 302 | | |||
301 | //surface no longer imported | 303 | //surface no longer imported | ||
302 | connect(imp.data(), &XdgImportedUnstableV2Interface::unbound, | 304 | connect(imp.data(), &XdgImportedUnstableV2Interface::unbound, | ||
303 | s->q, [s, handle, imp]() { | 305 | s->q, [s, handle, imp]() { | ||
304 | s->importedSurfaces.remove(QString::fromUtf8(handle)); | 306 | s->importedSurfaces.remove(handle); | ||
305 | emit s->q->surfaceUnimported(QString::fromUtf8(handle)); | 307 | emit s->q->surfaceUnimported(handle); | ||
306 | 308 | | |||
307 | auto it = s->children.find(imp); | 309 | auto it = s->children.find(imp); | ||
308 | if (it != s->children.end()) { | 310 | if (it != s->children.end()) { | ||
311 | KWayland::Server::SurfaceInterface* child = *it; | ||||
309 | s->parents.remove(*it); | 312 | s->parents.remove(*it); | ||
310 | s->children.erase(it); | 313 | s->children.erase(it); | ||
311 | emit s->q->transientChanged(*it, nullptr); | 314 | emit s->q->transientChanged(child, nullptr); | ||
312 | } | 315 | } | ||
313 | }); | 316 | }); | ||
314 | 317 | | |||
315 | if (!imp->resource()) { | 318 | if (!imp->resource()) { | ||
316 | wl_resource_post_no_memory(resource); | 319 | wl_resource_post_no_memory(resource); | ||
317 | delete imp; | 320 | delete imp; | ||
318 | return; | 321 | return; | ||
319 | } | 322 | } | ||
320 | 323 | | |||
321 | s->importedSurfaces[QString::fromUtf8(handle)] = imp; | 324 | s->importedSurfaces[handle] = imp; | ||
322 | emit s->q->surfaceImported(QString::fromUtf8(handle), imp); | 325 | emit s->q->surfaceImported(handle, imp); | ||
323 | } | 326 | } | ||
324 | 327 | | |||
325 | XdgImporterUnstableV2Interface::Private::Private(XdgImporterUnstableV2Interface *q, Display *d, XdgForeignInterface *foreignInterface) | 328 | XdgImporterUnstableV2Interface::Private::Private(XdgImporterUnstableV2Interface *q, Display *d, XdgForeignInterface *foreignInterface) | ||
326 | : Global::Private(d, &zxdg_importer_v2_interface, s_version) | 329 | : Global::Private(d, &zxdg_importer_v2_interface, s_version) | ||
327 | , foreignInterface(foreignInterface) | 330 | , foreignInterface(foreignInterface) | ||
328 | , q(q) | 331 | , q(q) | ||
329 | { | 332 | { | ||
330 | } | 333 | } | ||
▲ Show 20 Lines • Show All 129 Lines • Show Last 20 Lines |