client: Roundtrip in an own queue when exporting window instead of default queue

This way no other events will be dispatched which could cause calls into
user code when delivering events synchronously.

Change-Id: I5c195877388d178832067b5aba6b5f5abd26e099
Reviewed-by: David Edmundson <davidedmundson@kde.org>
This commit is contained in:
David Redondo 2024-01-31 17:03:04 +01:00
parent 610bcae568
commit 997b12fd56
3 changed files with 11 additions and 9 deletions

View File

@ -36,12 +36,6 @@ QWaylandXdgExporterV2::~QWaylandXdgExporterV2()
{
destroy();
}
QtWaylandClient::QWaylandXdgExportedV2 *QWaylandXdgExporterV2::exportToplevel(wl_surface *surface)
{
return new QWaylandXdgExportedV2(export_toplevel(surface));
}
}
QT_END_NAMESPACE

View File

@ -40,7 +40,6 @@ class QWaylandXdgExporterV2 : public QtWayland::zxdg_exporter_v2
public:
QWaylandXdgExporterV2(wl_registry *registry, uint32_t id, int version);
~QWaylandXdgExporterV2() override;
QWaylandXdgExportedV2 *exportToplevel(wl_surface *surface);
};
}

View File

@ -711,9 +711,18 @@ QString QWaylandXdgSurface::externWindowHandle()
return QString();
}
if (!m_toplevel->m_exported) {
m_toplevel->m_exported.reset(m_shell->exporter()->exportToplevel(m_window->wlSurface()));
auto *exporterWrapper = static_cast<zxdg_exporter_v2 *>(
wl_proxy_create_wrapper(m_shell->exporter()->object()));
auto exportQueue = wl_display_create_queue(m_shell->display()->wl_display());
wl_proxy_set_queue(reinterpret_cast<wl_proxy *>(exporterWrapper), exportQueue);
m_toplevel->m_exported.reset(new QWaylandXdgExportedV2(
zxdg_exporter_v2_export_toplevel(exporterWrapper, m_window->wlSurface())));
// handle events is sent immediately
m_shell->display()->forceRoundTrip();
wl_display_roundtrip_queue(m_shell->display()->wl_display(), exportQueue);
wl_proxy_set_queue(reinterpret_cast<wl_proxy *>(m_toplevel->m_exported->object()), nullptr);
wl_proxy_wrapper_destroy(exporterWrapper);
wl_event_queue_destroy(exportQueue);
}
return m_toplevel->m_exported->handle();
}