ZaStoGram_desktop/Telegram/SourceFiles/platform/mac/tray_mac.h
Mehran 71e2758891 Fix stale macOS tray menu after toggling the icon
On macOS the tray returned the "about to show" events of its current
status bar icon, and the application subscribes to them only once, when
the tray is created. After the tray icon was turned off and on again,
or turned on after launch, the new icon's events had no subscriber, so
the menu texts stopped updating and the minimize item kept acting on
the old window state.

Keep the events on the tray itself and forward the events of every
created icon to them, like on Windows and Linux.
2026-10-01 18:48:00 +04:00

78 lines
1.6 KiB
C++

/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "platform/platform_tray.h"
#include "base/unique_qptr.h"
class QMenu;
class QIcon;
namespace Ui {
class DynamicImage;
} // namespace Ui
namespace Platform {
class NativeIcon;
class Tray final {
public:
Tray();
~Tray();
[[nodiscard]] rpl::producer<> aboutToShowRequests() const;
[[nodiscard]] rpl::producer<> showFromTrayRequests() const;
[[nodiscard]] rpl::producer<> hideToTrayRequests() const;
[[nodiscard]] rpl::producer<> iconClicks() const;
[[nodiscard]] bool hasIcon() const;
void createIcon();
void destroyIcon();
void updateIcon();
void createMenu();
void destroyMenu();
void addAction(rpl::producer<QString> text, Fn<void()> &&callback);
void addAction(
rpl::producer<QString> text,
Fn<void()> &&callback,
const QIcon &icon);
void addAction(
rpl::producer<QString> text,
Fn<void()> &&callback,
std::shared_ptr<Ui::DynamicImage> icon,
int size);
void addSeparator();
void showTrayMessage() const;
[[nodiscard]] bool hasTrayMessageSupport() const;
[[nodiscard]] rpl::lifetime &lifetime();
private:
std::unique_ptr<NativeIcon> _nativeIcon;
base::unique_qptr<QMenu> _menu;
rpl::event_stream<> _showFromTrayRequests;
rpl::event_stream<> _aboutToShowRequests;
rpl::lifetime _actionsLifetime;
rpl::lifetime _lifetime;
};
inline bool HasMonochromeSetting() {
return false;
}
} // namespace Platform