From 80fb506f84d9c6f43d69d7a83bb88597afa9bcd7 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 15 Aug 2023 12:11:45 +0200 Subject: [PATCH] Use underlying QPlatformSystemTrayIcon on Windows. Fixes #26655. --- .../SourceFiles/platform/win/tray_win.cpp | 58 +++++++++++++------ Telegram/SourceFiles/platform/win/tray_win.h | 4 +- Telegram/lib_base | 2 +- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/Telegram/SourceFiles/platform/win/tray_win.cpp b/Telegram/SourceFiles/platform/win/tray_win.cpp index 13a30858c..a0927702e 100644 --- a/Telegram/SourceFiles/platform/win/tray_win.cpp +++ b/Telegram/SourceFiles/platform/win/tray_win.cpp @@ -18,7 +18,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_session_controller.h" #include "styles/style_window.h" -#include +#include +#include +#include +#include +#include namespace Platform { @@ -96,28 +100,45 @@ Tray::Tray() { void Tray::createIcon() { if (!_icon) { - _icon = base::make_unique_q(nullptr); + if (const auto theme = QGuiApplicationPrivate::platformTheme()) { + _icon.reset(theme->createPlatformSystemTrayIcon()); + } + if (!_icon) { + return; + } + _icon->init(); updateIcon(); - _icon->setToolTip(AppName.utf16()); - using Reason = QSystemTrayIcon::ActivationReason; + _icon->updateToolTip(AppName.utf16()); + + using Reason = QPlatformSystemTrayIcon::ActivationReason; base::qt_signal_producer( _icon.get(), - &QSystemTrayIcon::activated - ) | rpl::start_with_next([=](Reason reason) { - if (reason == QSystemTrayIcon::Context && _menu) { - _aboutToShowRequests.fire({}); - InvokeQueued(_menu.get(), [=] { - _menu->popup(QCursor::pos()); - }); - } else { - _iconClicks.fire({}); - } + &QPlatformSystemTrayIcon::activated + ) | rpl::filter( + rpl::mappers::_1 != Reason::Context + ) | rpl::map_to( + rpl::empty + ) | rpl::start_to_stream(_iconClicks, _lifetime); + + base::qt_signal_producer( + _icon.get(), + &QPlatformSystemTrayIcon::contextMenuRequested + ) | rpl::filter([=] { + return _menu != nullptr; + }) | rpl::start_with_next([=]( + QPoint globalNativePosition, + const QPlatformScreen *screen) { + _aboutToShowRequests.fire({}); + const auto position = QHighDpi::fromNativePixels( + globalNativePosition, + screen ? screen->screen() : nullptr); + InvokeQueued(_menu.get(), [=] { + _menu->popup(position); + }); }, _lifetime); } else { updateIcon(); } - - _icon->show(); } void Tray::destroyIcon() { @@ -155,7 +176,7 @@ void Tray::updateIcon() { forTrayIcon.addPixmap(iconSizeWidth >= 20 ? iconSmallPixmap32 : iconSmallPixmap16); - _icon->setIcon(forTrayIcon); + _icon->updateIcon(forTrayIcon); } void Tray::createMenu() { @@ -199,7 +220,8 @@ void Tray::showTrayMessage() const { _icon->showMessage( AppName.utf16(), tr::lng_tray_icon_text(tr::now), - QSystemTrayIcon::Information, + QIcon(), + QPlatformSystemTrayIcon::Information, kTooltipDelay); cSetSeenTrayTooltip(true); Local::writeSettings(); diff --git a/Telegram/SourceFiles/platform/win/tray_win.h b/Telegram/SourceFiles/platform/win/tray_win.h index b71785b17..e399e5945 100644 --- a/Telegram/SourceFiles/platform/win/tray_win.h +++ b/Telegram/SourceFiles/platform/win/tray_win.h @@ -19,7 +19,7 @@ namespace Ui { class PopupMenu; } // namespace Ui -class QSystemTrayIcon; +class QPlatformSystemTrayIcon; namespace Platform { @@ -60,7 +60,7 @@ public: bool supportMode); private: - base::unique_qptr _icon; + base::unique_qptr _icon; base::unique_qptr _menu; rpl::event_stream<> _iconClicks; diff --git a/Telegram/lib_base b/Telegram/lib_base index e497dc134..185679354 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit e497dc134de3f8e2933ee0acdbba8bd702ce2130 +Subproject commit 185679354c7d0b7dd8d719daaaf806d177cb20bf