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
2928native_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
7464native_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