diff --git a/Telegram/SourceFiles/platform/linux/linux_wayland_integration.cpp b/Telegram/SourceFiles/platform/linux/linux_wayland_integration.cpp index dab8fa498..c693282e2 100644 --- a/Telegram/SourceFiles/platform/linux/linux_wayland_integration.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_wayland_integration.cpp @@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include +#include #include #include @@ -157,22 +158,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 - for (auto it = _private->plasmaSurfaces.begin() - ; it != _private->plasmaSurfaces.cend() - ; ++it) { - free(it->second.release()); - _private->plasmaSurfaces.erase(it); - } - free(_private->plasmaShell.object()); - _private->plasmaShell.init(nullptr); - free(_private->registry.release()); - }, _private->lifetime); - wl_display_roundtrip(display); } @@ -180,8 +165,15 @@ WaylandIntegration::~WaylandIntegration() = default; WaylandIntegration *WaylandIntegration::Instance() { if (!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::skipTaskbarSupported() { diff --git a/Telegram/SourceFiles/platform/linux/linux_wayland_integration.h b/Telegram/SourceFiles/platform/linux/linux_wayland_integration.h index b7b093ffe..bb74be0b3 100644 --- a/Telegram/SourceFiles/platform/linux/linux_wayland_integration.h +++ b/Telegram/SourceFiles/platform/linux/linux_wayland_integration.h @@ -12,15 +12,15 @@ namespace internal { class WaylandIntegration { public: + WaylandIntegration(); + ~WaylandIntegration(); + [[nodiscard]] static WaylandIntegration *Instance(); [[nodiscard]] bool skipTaskbarSupported(); void skipTaskbar(QWindow *window, bool skip); private: - WaylandIntegration(); - ~WaylandIntegration(); - struct Private; const std::unique_ptr _private; };