Skip to content

Commit aa81d86

Browse files
committed
Remove GlobalRegistry usage from tray_icon_c.cpp
Refactored tray icon management to use raw pointers instead of shared_ptr and GlobalRegistry. Updated all functions to directly allocate, access, and delete TrayIcon instances, adding null checks for safety. This simplifies object lifetime management and removes unnecessary registry lookups.
1 parent e3da3cd commit aa81d86

File tree

1 file changed

+43
-33
lines changed

1 file changed

+43
-33
lines changed

src/capi/tray_icon_c.cpp

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
#include <map>
44
#include <memory>
55
#include <optional>
6-
#include "../global_registry.h"
76
#include "../image.h"
87
#include "../tray_icon.h"
98
#include "../tray_icon_event.h"
@@ -28,13 +27,8 @@ static std::atomic<int> g_tray_icon_next_listener_id{1};
2827

2928
native_tray_icon_t native_tray_icon_create(void) {
3029
try {
31-
auto tray_icon = std::make_shared<TrayIcon>();
32-
void* handle = tray_icon.get();
33-
34-
// Store the shared_ptr in the registry to keep the object alive
35-
GlobalRegistry<TrayIcon>().Register(handle, tray_icon);
36-
37-
return static_cast<native_tray_icon_t>(handle);
30+
auto tray_icon_raw = new TrayIcon();
31+
return static_cast<native_tray_icon_t>(tray_icon_raw);
3832
} catch (...) {
3933
return nullptr;
4034
}
@@ -45,13 +39,8 @@ native_tray_icon_t native_tray_icon_create_from_native(void* native_tray) {
4539
return nullptr;
4640

4741
try {
48-
auto tray_icon = std::make_shared<TrayIcon>(native_tray);
49-
void* handle = tray_icon.get();
50-
51-
// Store the shared_ptr in the registry to keep the object alive
52-
GlobalRegistry<TrayIcon>().Register(handle, tray_icon);
53-
54-
return static_cast<native_tray_icon_t>(handle);
42+
auto tray_icon_raw = new TrayIcon(native_tray);
43+
return static_cast<native_tray_icon_t>(tray_icon_raw);
5544
} catch (...) {
5645
return nullptr;
5746
}
@@ -67,20 +56,19 @@ void native_tray_icon_destroy(native_tray_icon_t tray_icon) {
6756
g_tray_icon_listeners.erase(listeners_it);
6857
}
6958

70-
// Unregister from registry - this will also destroy the object
71-
GlobalRegistry<TrayIcon>().Unregister(tray_icon);
59+
// Delete TrayIcon instance
60+
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
61+
delete tray_icon_ptr;
7262
}
7363

7464
native_tray_icon_id_t native_tray_icon_get_id(native_tray_icon_t tray_icon) {
7565
if (!tray_icon)
7666
return -1;
7767

78-
// Verify the tray icon exists in the registry
79-
if (!GlobalRegistry<TrayIcon>().Contains(tray_icon))
80-
return -1;
81-
8268
try {
8369
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
70+
if (!tray_icon_ptr)
71+
return -1;
8472
return tray_icon_ptr->GetId();
8573
} catch (...) {
8674
return -1;
@@ -91,12 +79,10 @@ void native_tray_icon_set_icon(native_tray_icon_t tray_icon, native_image_t imag
9179
if (!tray_icon)
9280
return;
9381

94-
// Verify the tray icon exists in the registry
95-
if (!GlobalRegistry<TrayIcon>().Contains(tray_icon))
96-
return;
97-
9882
try {
9983
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
84+
if (!tray_icon_ptr)
85+
return;
10086
if (image) {
10187
// Extract the shared_ptr from the native_image_t handle
10288
auto image_ptr = static_cast<std::shared_ptr<Image>*>(image);
@@ -115,6 +101,8 @@ native_image_t native_tray_icon_get_icon(native_tray_icon_t tray_icon) {
115101

116102
try {
117103
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
104+
if (!tray_icon_ptr)
105+
return nullptr;
118106
auto image = tray_icon_ptr->GetIcon();
119107

120108
if (!image) {
@@ -134,6 +122,8 @@ void native_tray_icon_set_title(native_tray_icon_t tray_icon, const char* title)
134122

135123
try {
136124
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
125+
if (!tray_icon_ptr)
126+
return;
137127
if (title) {
138128
tray_icon_ptr->SetTitle(std::string(title));
139129
} else {
@@ -150,6 +140,8 @@ char* native_tray_icon_get_title(native_tray_icon_t tray_icon) {
150140

151141
try {
152142
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
143+
if (!tray_icon_ptr)
144+
return nullptr;
153145
auto title = tray_icon_ptr->GetTitle();
154146
if (title.has_value()) {
155147
return to_c_str(title.value());
@@ -167,6 +159,8 @@ void native_tray_icon_set_tooltip(native_tray_icon_t tray_icon, const char* tool
167159

168160
try {
169161
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
162+
if (!tray_icon_ptr)
163+
return;
170164
if (tooltip) {
171165
tray_icon_ptr->SetTooltip(std::string(tooltip));
172166
} else {
@@ -183,6 +177,8 @@ char* native_tray_icon_get_tooltip(native_tray_icon_t tray_icon) {
183177

184178
try {
185179
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
180+
if (!tray_icon_ptr)
181+
return nullptr;
186182
auto tooltip = tray_icon_ptr->GetTooltip();
187183
if (tooltip.has_value()) {
188184
return to_c_str(tooltip.value());
@@ -200,6 +196,8 @@ void native_tray_icon_set_context_menu(native_tray_icon_t tray_icon, native_menu
200196

201197
try {
202198
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
199+
if (!tray_icon_ptr)
200+
return;
203201
if (menu) {
204202
// IMPORTANT: Do NOT create an owning shared_ptr from a raw pointer here.
205203
// Menu objects are owned by the global registry in menu_c.cpp and by
@@ -223,6 +221,8 @@ native_menu_t native_tray_icon_get_context_menu(native_tray_icon_t tray_icon) {
223221

224222
try {
225223
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
224+
if (!tray_icon_ptr)
225+
return nullptr;
226226
auto menu = tray_icon_ptr->GetContextMenu();
227227
return menu ? static_cast<native_menu_t>(menu.get()) : nullptr;
228228
} catch (...) {
@@ -237,6 +237,8 @@ void native_tray_icon_set_context_menu_trigger(native_tray_icon_t tray_icon,
237237

238238
try {
239239
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
240+
if (!tray_icon_ptr)
241+
return;
240242

241243
// Convert C enum to C++ enum
242244
ContextMenuTrigger cpp_trigger;
@@ -271,6 +273,8 @@ native_context_menu_trigger_t native_tray_icon_get_context_menu_trigger(
271273

272274
try {
273275
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
276+
if (!tray_icon_ptr)
277+
return NATIVE_CONTEXT_MENU_TRIGGER_NONE;
274278
ContextMenuTrigger cpp_trigger = tray_icon_ptr->GetContextMenuTrigger();
275279

276280
// Convert C++ enum to C enum
@@ -297,6 +301,8 @@ bool native_tray_icon_get_bounds(native_tray_icon_t tray_icon, native_rectangle_
297301

298302
try {
299303
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
304+
if (!tray_icon_ptr)
305+
return false;
300306
Rectangle cpp_bounds = tray_icon_ptr->GetBounds();
301307

302308
bounds->x = cpp_bounds.x;
@@ -316,6 +322,8 @@ bool native_tray_icon_set_visible(native_tray_icon_t tray_icon, bool visible) {
316322

317323
try {
318324
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
325+
if (!tray_icon_ptr)
326+
return false;
319327
return tray_icon_ptr->SetVisible(visible);
320328
} catch (...) {
321329
return false;
@@ -328,6 +336,8 @@ bool native_tray_icon_is_visible(native_tray_icon_t tray_icon) {
328336

329337
try {
330338
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
339+
if (!tray_icon_ptr)
340+
return false;
331341
return tray_icon_ptr->IsVisible();
332342
} catch (...) {
333343
return false;
@@ -341,12 +351,10 @@ int native_tray_icon_add_listener(native_tray_icon_t tray_icon,
341351
if (!tray_icon || !callback)
342352
return -1;
343353

344-
// Verify the tray icon exists in the registry
345-
if (!GlobalRegistry<TrayIcon>().Contains(tray_icon))
346-
return -1;
347-
348354
try {
349355
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
356+
if (!tray_icon_ptr)
357+
return -1;
350358

351359
// Create listener data
352360
auto listener_data = std::make_shared<TrayIconListenerData>();
@@ -412,12 +420,10 @@ bool native_tray_icon_remove_listener(native_tray_icon_t tray_icon, int listener
412420
if (!tray_icon)
413421
return false;
414422

415-
// Verify the tray icon exists in the registry
416-
if (!GlobalRegistry<TrayIcon>().Contains(tray_icon))
417-
return false;
418-
419423
try {
420424
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
425+
if (!tray_icon_ptr)
426+
return false;
421427

422428
// Find and remove the listener
423429
auto it = g_tray_icon_listeners.find(tray_icon);
@@ -443,6 +449,8 @@ bool native_tray_icon_open_context_menu(native_tray_icon_t tray_icon) {
443449

444450
try {
445451
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
452+
if (!tray_icon_ptr)
453+
return false;
446454
return tray_icon_ptr->OpenContextMenu();
447455
} catch (...) {
448456
return false;
@@ -455,6 +463,8 @@ bool native_tray_icon_close_context_menu(native_tray_icon_t tray_icon) {
455463

456464
try {
457465
auto tray_icon_ptr = static_cast<TrayIcon*>(tray_icon);
466+
if (!tray_icon_ptr)
467+
return false;
458468
return tray_icon_ptr->CloseContextMenu();
459469
} catch (...) {
460470
return false;

0 commit comments

Comments
 (0)