|
| 1 | +#include <optional> |
1 | 2 | #include "../../foundation/geometry.h" |
2 | 3 | #include "../../menu.h" |
3 | 4 | #include "../../tray_icon.h" |
|
10 | 11 | // for proper memory management of Objective-C objects. |
11 | 12 |
|
12 | 13 | // Forward declarations |
13 | | -typedef void (^TrayIconClickedBlock)(nativeapi::TrayIconID tray_icon_id, const std::string& button); |
14 | | -typedef void (^TrayIconRightClickedBlock)(nativeapi::TrayIconID tray_icon_id); |
15 | | -typedef void (^TrayIconDoubleClickedBlock)(nativeapi::TrayIconID tray_icon_id); |
| 14 | +typedef void (^TrayIconClickedBlock)(nativeapi::TrayIconId tray_icon_id, const std::string& button); |
| 15 | +typedef void (^TrayIconRightClickedBlock)(nativeapi::TrayIconId tray_icon_id); |
| 16 | +typedef void (^TrayIconDoubleClickedBlock)(nativeapi::TrayIconId tray_icon_id); |
16 | 17 |
|
17 | 18 | @interface NSStatusBarButtonTarget : NSObject |
18 | 19 | @property(nonatomic, assign) nativeapi::TrayIcon* trayIcon; |
@@ -86,76 +87,46 @@ - (void)statusItemClicked:(id)sender; |
86 | 87 | size_t menu_closed_listener_id_; |
87 | 88 | }; |
88 | 89 |
|
89 | | -TrayIcon::TrayIcon() { |
90 | | - id = -1; |
91 | | - |
92 | | - // Create platform-specific NSStatusItem |
93 | | - NSStatusBar* status_bar = [NSStatusBar systemStatusBar]; |
94 | | - NSStatusItem* status_item = [status_bar statusItemWithLength:NSVariableStatusItemLength]; |
95 | | - |
96 | | - if (status_item) { |
97 | | - // Initialize the Impl with the created status item |
98 | | - pimpl_ = std::make_unique<Impl>(status_item); |
99 | | - |
100 | | - if (pimpl_->ns_status_bar_button_target_) { |
101 | | - pimpl_->ns_status_bar_button_target_.trayIcon = this; |
102 | | - |
103 | | - // 设置默认的 Block 处理器,直接发送事件 |
104 | | - pimpl_->ns_status_bar_button_target_.leftClickedBlock = |
105 | | - ^(TrayIconID tray_icon_id, const std::string& button) { |
106 | | - try { |
107 | | - EmitSync<TrayIconClickedEvent>(tray_icon_id, button); |
108 | | - } catch (...) { |
109 | | - // Protect against event emission exceptions |
110 | | - } |
111 | | - }; |
112 | | - |
113 | | - pimpl_->ns_status_bar_button_target_.rightClickedBlock = ^(TrayIconID tray_icon_id) { |
114 | | - try { |
115 | | - EmitSync<TrayIconRightClickedEvent>(tray_icon_id); |
116 | | - } catch (...) { |
117 | | - // Protect against event emission exceptions |
118 | | - } |
119 | | - }; |
120 | | - |
121 | | - pimpl_->ns_status_bar_button_target_.doubleClickedBlock = ^(TrayIconID tray_icon_id) { |
122 | | - try { |
123 | | - EmitSync<TrayIconDoubleClickedEvent>(tray_icon_id); |
124 | | - } catch (...) { |
125 | | - // Protect against event emission exceptions |
126 | | - } |
127 | | - }; |
128 | | - } |
| 90 | +TrayIcon::TrayIcon() : TrayIcon(nullptr) {} |
| 91 | + |
| 92 | +TrayIcon::TrayIcon(void* tray) { |
| 93 | + id = IdAllocator::Allocate<TrayIcon>(); |
| 94 | + |
| 95 | + NSStatusItem* status_item = nullptr; |
| 96 | + |
| 97 | + if (tray == nullptr) { |
| 98 | + // Create platform-specific NSStatusItem |
| 99 | + NSStatusBar* status_bar = [NSStatusBar systemStatusBar]; |
| 100 | + status_item = [status_bar statusItemWithLength:NSVariableStatusItemLength]; |
129 | 101 | } else { |
130 | | - // If status_item creation failed, create Impl with nil |
131 | | - pimpl_ = std::make_unique<Impl>(nil); |
| 102 | + status_item = (__bridge NSStatusItem*)tray; |
132 | 103 | } |
133 | | -} |
134 | 104 |
|
135 | | -TrayIcon::TrayIcon(void* tray) : pimpl_(std::make_unique<Impl>((__bridge NSStatusItem*)tray)) { |
136 | | - id = -1; // Will be set by TrayManager when created |
| 105 | + // Initialize the Impl with the status item |
| 106 | + pimpl_ = std::make_unique<Impl>(status_item); |
| 107 | + |
137 | 108 | if (pimpl_->ns_status_bar_button_target_) { |
138 | 109 | pimpl_->ns_status_bar_button_target_.trayIcon = this; |
139 | 110 |
|
140 | 111 | // 设置默认的 Block 处理器,直接发送事件 |
141 | 112 | pimpl_->ns_status_bar_button_target_.leftClickedBlock = |
142 | | - ^(TrayIconID tray_icon_id, const std::string& button) { |
| 113 | + ^(TrayIconId tray_icon_id, const std::string& button) { |
143 | 114 | try { |
144 | 115 | EmitSync<TrayIconClickedEvent>(tray_icon_id, button); |
145 | 116 | } catch (...) { |
146 | 117 | // Protect against event emission exceptions |
147 | 118 | } |
148 | 119 | }; |
149 | 120 |
|
150 | | - pimpl_->ns_status_bar_button_target_.rightClickedBlock = ^(TrayIconID tray_icon_id) { |
| 121 | + pimpl_->ns_status_bar_button_target_.rightClickedBlock = ^(TrayIconId tray_icon_id) { |
151 | 122 | try { |
152 | 123 | EmitSync<TrayIconRightClickedEvent>(tray_icon_id); |
153 | 124 | } catch (...) { |
154 | 125 | // Protect against event emission exceptions |
155 | 126 | } |
156 | 127 | }; |
157 | 128 |
|
158 | | - pimpl_->ns_status_bar_button_target_.doubleClickedBlock = ^(TrayIconID tray_icon_id) { |
| 129 | + pimpl_->ns_status_bar_button_target_.doubleClickedBlock = ^(TrayIconId tray_icon_id) { |
159 | 130 | try { |
160 | 131 | EmitSync<TrayIconDoubleClickedEvent>(tray_icon_id); |
161 | 132 | } catch (...) { |
|
0 commit comments