From 8a5797e1bd2c0e4ae49a6722d3b5231ef787288c Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Wed, 19 Jun 2024 02:47:37 +0400 Subject: [PATCH] Re-create QSystemTrayIcon on SNI watcher owner change --- .../SourceFiles/platform/linux/tray_linux.cpp | 25 ++++++++++++++++++- .../SourceFiles/platform/linux/tray_linux.h | 5 ++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/platform/linux/tray_linux.cpp b/Telegram/SourceFiles/platform/linux/tray_linux.cpp index ab1e34df8..2d0e23aec 100644 --- a/Telegram/SourceFiles/platform/linux/tray_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/tray_linux.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/invoke_queued.h" #include "base/qt_signal_producer.h" +#include "base/platform/linux/base_linux_dbus_utilities.h" #include "core/application.h" #include "core/sandbox.h" #include "platform/platform_specific.h" @@ -21,9 +22,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include +#include + namespace Platform { namespace { +using namespace gi::repository; + [[nodiscard]] QString PanelIconName(int counter, bool muted) { return (counter > 0) ? (muted @@ -282,11 +287,29 @@ rpl::producer<> TrayEventFilter::contextMenuFilters() const { } Tray::Tray() { - LOG(("System tray available: %1").arg(Logs::b(TrayIconSupported()))); + auto connection = Gio::bus_get_sync(Gio::BusType::SESSION_, nullptr); + if (connection) { + _sniWatcher = std::make_unique( + connection.gobj_(), + "org.kde.StatusNotifierWatcher", + [=]( + const std::string &service, + const std::string &oldOwner, + const std::string &newOwner) { + Core::Sandbox::Instance().customEnterFromEventLoop([&] { + if (hasIcon()) { + destroyIcon(); + createIcon(); + } + }); + }); + } } void Tray::createIcon() { if (!_icon) { + LOG(("System tray available: %1").arg(Logs::b(TrayIconSupported()))); + if (!_iconGraphic) { _iconGraphic = std::make_unique(); } diff --git a/Telegram/SourceFiles/platform/linux/tray_linux.h b/Telegram/SourceFiles/platform/linux/tray_linux.h index dd0175a2c..712592777 100644 --- a/Telegram/SourceFiles/platform/linux/tray_linux.h +++ b/Telegram/SourceFiles/platform/linux/tray_linux.h @@ -11,6 +11,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/unique_qptr.h" +namespace base::Platform::DBus { +class ServiceWatcher; +} // namespace base::Platform::DBus + namespace Ui { class PopupMenu; } // namespace Ui @@ -51,6 +55,7 @@ public: [[nodiscard]] rpl::lifetime &lifetime(); private: + std::unique_ptr _sniWatcher; std::unique_ptr _iconGraphic; base::unique_qptr _icon;