diff --git a/v2/internal/ffenestri/ffenestri_darwin.c b/v2/internal/ffenestri/ffenestri_darwin.c index 18c8fb08d..6f4c6761e 100644 --- a/v2/internal/ffenestri/ffenestri_darwin.c +++ b/v2/internal/ffenestri/ffenestri_darwin.c @@ -1720,6 +1720,7 @@ void Quit(struct Application *app) { id createImageFromBase64Data(const char *data, bool isTemplateImage) { id nsdata = ALLOC("NSData"); + msg_reg(nsdata, s("autorelease")); id imageData = ((id(*)(id, SEL, id, int))objc_msgSend)(nsdata, s("initWithBase64EncodedString:options:"), str(data), 0); // If it's not valid base64 data, use the broken image diff --git a/v2/internal/ffenestri/menu_darwin.c b/v2/internal/ffenestri/menu_darwin.c index 81cc2d606..e3cc6f82d 100644 --- a/v2/internal/ffenestri/menu_darwin.c +++ b/v2/internal/ffenestri/menu_darwin.c @@ -92,11 +92,6 @@ void DeleteMenu(Menu *menu) { } vec_deinit(&menu->callbackDataCache); - // Free nsmenu if we have it - if ( menu->menu != NULL ) { - msg_reg(menu->menu, s("release")); - } - free(menu); } @@ -380,7 +375,7 @@ id createMenu(id title) { id menu = ALLOC("NSMenu"); msg_id(menu, s("initWithTitle:"), title); msg_bool(menu, s("setAutoenablesItems:"), NO); -// msg(menu, s("autorelease")); + msg(menu, s("autorelease")); return menu; } @@ -566,6 +561,7 @@ id processRadioMenuItem(Menu *menu, id parentmenu, const char *title, const char id processCheckboxMenuItem(Menu *menu, id parentmenu, const char *title, const char *menuid, bool disabled, bool checked, const char *key) { id item = ALLOC("NSMenuItem"); + msg_reg(item, s("autorelease")); // Store the item in the menu item map hashmap_put(&menu->menuItemMap, (char*)menuid, strlen(menuid), item); @@ -577,7 +573,6 @@ id processCheckboxMenuItem(Menu *menu, id parentmenu, const char *title, const c msg_id(item, s("setRepresentedObject:"), wrappedId); ((id(*)(id, SEL, id, SEL, id))objc_msgSend)(item, s("initWithTitle:action:keyEquivalent:"), str(title), s("menuItemCallback:"), str(key)); msg_bool(item, s("setEnabled:"), !disabled); - msg_reg(item, s("autorelease")); msg_int(item, s("setState:"), (checked ? NSControlStateValueOn : NSControlStateValueOff)); msg_id(parentmenu, s("addItem:"), item); return item; @@ -731,6 +726,7 @@ id createAttributedString(const char* title, const char* fontName, int fontSize, id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA, bool templateImage, bool alternate, JsonNode* styledLabel) { id item = ALLOC("NSMenuItem"); + msg_reg(item, s("autorelease")); // Create a MenuItemCallbackData MenuItemCallbackData *callback = CreateMenuItemCallbackData(menu, item, menuid, Text); @@ -767,7 +763,6 @@ id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char //msg_id(item, s("setTitle:"), str(title)); msg_bool(item, s("setEnabled:"), !disabled); - msg_reg(item, s("autorelease")); // Process modifiers if( modifiers != NULL && !alternate) { diff --git a/v2/internal/ffenestri/traymenu_darwin.c b/v2/internal/ffenestri/traymenu_darwin.c index 2ae3e44a5..32fad5ef8 100644 --- a/v2/internal/ffenestri/traymenu_darwin.c +++ b/v2/internal/ffenestri/traymenu_darwin.c @@ -177,9 +177,6 @@ void UpdateTrayMenuInPlace(TrayMenu* currentMenu, TrayMenu* newMenu) { void DeleteTrayMenu(TrayMenu* trayMenu) { -// printf("Freeing TrayMenu:\n"); -// DumpTrayMenu(trayMenu); - // Delete the menu DeleteMenu(trayMenu->menu); @@ -196,8 +193,17 @@ void DeleteTrayMenu(TrayMenu* trayMenu) { trayMenu->statusbaritem = NULL; } - if ( trayMenu->delegate != NULL ) { - msg_reg(trayMenu->delegate, s("release")); + // Free the tray menu memory + MEMFREE(trayMenu); +} +void DeleteTrayMenuKeepStatusBarItem(TrayMenu* trayMenu) { + + // Delete the menu + DeleteMenu(trayMenu->menu); + + // Free JSON + if (trayMenu->processedJSON != NULL ) { + json_delete(trayMenu->processedJSON); } // Free the tray menu memory diff --git a/v2/internal/ffenestri/traymenu_darwin.h b/v2/internal/ffenestri/traymenu_darwin.h index 683881fed..763b4d63d 100644 --- a/v2/internal/ffenestri/traymenu_darwin.h +++ b/v2/internal/ffenestri/traymenu_darwin.h @@ -46,5 +46,6 @@ void LoadTrayIcons(); void UnloadTrayIcons(); void DeleteTrayMenu(TrayMenu* trayMenu); +void DeleteTrayMenuKeepStatusBarItem(TrayMenu* trayMenu); #endif //TRAYMENU_DARWIN_H diff --git a/v2/internal/ffenestri/traymenustore_darwin.c b/v2/internal/ffenestri/traymenustore_darwin.c index 771b548d2..362c07bf7 100644 --- a/v2/internal/ffenestri/traymenustore_darwin.c +++ b/v2/internal/ffenestri/traymenustore_darwin.c @@ -162,11 +162,7 @@ void UpdateTrayMenuInStore(TrayMenuStore* store, const char* menuJSON) { pthread_mutex_unlock(&store->lock); // Delete the current menu - DeleteMenu(currentMenu->menu); - currentMenu->menu = NULL; - - // Free the tray menu memory - MEMFREE(currentMenu); + DeleteTrayMenuKeepStatusBarItem(currentMenu); pthread_mutex_lock(&store->lock); hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu);