diff --git a/ui/platform/linux/ui_linux_wayland_integration.cpp b/ui/platform/linux/ui_linux_wayland_integration.cpp index d27d9b9..e3ea156 100644 --- a/ui/platform/linux/ui_linux_wayland_integration.cpp +++ b/ui/platform/linux/ui_linux_wayland_integration.cpp @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include +#include #include #include @@ -81,14 +82,6 @@ WaylandIntegration::WaylandIntegration() &Private::RegistryListener, _private.get()); - base::qt_signal_producer( - qApp, - &QObject::destroyed - ) | rpl::start_with_next([=] { - // too late for standard destructors, just free - free(_private->registry.release()); - }, _private->lifetime); - wl_display_roundtrip(display); } @@ -96,8 +89,15 @@ WaylandIntegration::~WaylandIntegration() = default; WaylandIntegration *WaylandIntegration::Instance() { if (!::Platform::IsWayland()) return nullptr; - static WaylandIntegration instance; - return &instance; + static std::optional instance(std::in_place); + base::qt_signal_producer( + QGuiApplication::platformNativeInterface(), + &QObject::destroyed + ) | rpl::start_with_next([&] { + instance = std::nullopt; + }, instance->_private->lifetime); + if (!instance) return nullptr; + return &*instance; } bool WaylandIntegration::xdgDecorationSupported() { diff --git a/ui/platform/linux/ui_linux_wayland_integration.h b/ui/platform/linux/ui_linux_wayland_integration.h index ef089d2..4ce6a8a 100644 --- a/ui/platform/linux/ui_linux_wayland_integration.h +++ b/ui/platform/linux/ui_linux_wayland_integration.h @@ -14,6 +14,9 @@ namespace Platform { class WaylandIntegration { public: + WaylandIntegration(); + ~WaylandIntegration(); + [[nodiscard]] static WaylandIntegration *Instance(); [[nodiscard]] bool xdgDecorationSupported(); @@ -23,9 +26,6 @@ public: void showWindowMenu(not_null widget, const QPoint &point); private: - WaylandIntegration(); - ~WaylandIntegration(); - struct Private; const std::unique_ptr _private; };