From ce8e42bcc2dba7fa8b9ce6caea58a86a295a4d6b Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sat, 16 Sep 2023 09:13:20 +0400 Subject: [PATCH] Support Wayland display reconnection --- .../linux/linux_wayland_integration.cpp | 42 +++++++++---------- Telegram/lib_base | 2 +- cmake | 2 +- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/Telegram/SourceFiles/platform/linux/linux_wayland_integration.cpp b/Telegram/SourceFiles/platform/linux/linux_wayland_integration.cpp index 0c60115a5..c1485dd8c 100644 --- a/Telegram/SourceFiles/platform/linux/linux_wayland_integration.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_wayland_integration.cpp @@ -8,7 +8,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "platform/linux/linux_wayland_integration.h" #include "base/platform/linux/base_linux_wayland_utilities.h" -#include "base/platform/base_platform_info.h" #include "base/qt_signal_producer.h" #include "base/flat_map.h" @@ -20,7 +19,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include -using namespace QNativeInterface; +using QWlApp = QNativeInterface::QWaylandApplication; using namespace QNativeInterface::Private; using namespace base::Platform::Wayland; @@ -38,9 +37,17 @@ public: } // namespace -struct WaylandIntegration::Private : public AutoDestroyer { +struct WaylandIntegration::Private + : public AutoDestroyer { + Private(not_null native) + : AutoDestroyer(wl_display_get_registry(native->display())) + , display(native->display()) { + wl_display_roundtrip(display); + } + QtWayland::org_kde_plasma_surface plasmaSurface(QWindow *window); + const not_null display; std::optional plasmaShell; protected: @@ -102,36 +109,27 @@ QtWayland::org_kde_plasma_surface WaylandIntegration::Private::plasmaSurface( } WaylandIntegration::WaylandIntegration() -: _private(std::make_unique()) { - const auto native = qApp->nativeInterface(); - if (!native) { - return; - } - - const auto display = native->display(); - if (!display) { - return; - } - - _private->init(wl_display_get_registry(display)); - wl_display_roundtrip(display); +: _private(std::make_unique(qApp->nativeInterface())) { } WaylandIntegration::~WaylandIntegration() = default; WaylandIntegration *WaylandIntegration::Instance() { - if (!IsWayland()) return nullptr; - static std::optional instance(std::in_place); - [[maybe_unused]] static const auto Inited = [] { + const auto native = qApp->nativeInterface(); + if (!native) return nullptr; + static std::optional instance; + if (instance && native->display() != instance->_private->display) { + instance.reset(); + } + if (!instance) { + instance.emplace(); base::qt_signal_producer( QGuiApplication::platformNativeInterface(), &QObject::destroyed ) | rpl::start_with_next([] { instance = std::nullopt; }, instance->_private->lifetime()); - return true; - }(); - if (!instance) return nullptr; + } return &*instance; } diff --git a/Telegram/lib_base b/Telegram/lib_base index 6de11e6ab..5916b1db7 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit 6de11e6ab705f27158f338e3e17c8b0767750721 +Subproject commit 5916b1db7ccae3ba0fafa8309d50c2c09a19604b diff --git a/cmake b/cmake index 0ae4e78a1..0bacdcaaa 160000 --- a/cmake +++ b/cmake @@ -1 +1 @@ -Subproject commit 0ae4e78a12d7fdea687ca52647465b9cf9ef95ee +Subproject commit 0bacdcaaa4ac11348cc5562e94eac1e5bdb58789