mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-04 06:22:16 +08:00
[mac] Fix memory leak wrt updating menus
This commit is contained in:
parent
824256db6d
commit
d7bb831d7f
@ -1720,6 +1720,7 @@ void Quit(struct Application *app) {
|
|||||||
|
|
||||||
id createImageFromBase64Data(const char *data, bool isTemplateImage) {
|
id createImageFromBase64Data(const char *data, bool isTemplateImage) {
|
||||||
id nsdata = ALLOC("NSData");
|
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);
|
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
|
// If it's not valid base64 data, use the broken image
|
||||||
|
@ -92,11 +92,6 @@ void DeleteMenu(Menu *menu) {
|
|||||||
}
|
}
|
||||||
vec_deinit(&menu->callbackDataCache);
|
vec_deinit(&menu->callbackDataCache);
|
||||||
|
|
||||||
// Free nsmenu if we have it
|
|
||||||
if ( menu->menu != NULL ) {
|
|
||||||
msg_reg(menu->menu, s("release"));
|
|
||||||
}
|
|
||||||
|
|
||||||
free(menu);
|
free(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,7 +375,7 @@ id createMenu(id title) {
|
|||||||
id menu = ALLOC("NSMenu");
|
id menu = ALLOC("NSMenu");
|
||||||
msg_id(menu, s("initWithTitle:"), title);
|
msg_id(menu, s("initWithTitle:"), title);
|
||||||
msg_bool(menu, s("setAutoenablesItems:"), NO);
|
msg_bool(menu, s("setAutoenablesItems:"), NO);
|
||||||
// msg(menu, s("autorelease"));
|
msg(menu, s("autorelease"));
|
||||||
return menu;
|
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 processCheckboxMenuItem(Menu *menu, id parentmenu, const char *title, const char *menuid, bool disabled, bool checked, const char *key) {
|
||||||
|
|
||||||
id item = ALLOC("NSMenuItem");
|
id item = ALLOC("NSMenuItem");
|
||||||
|
msg_reg(item, s("autorelease"));
|
||||||
|
|
||||||
// Store the item in the menu item map
|
// Store the item in the menu item map
|
||||||
hashmap_put(&menu->menuItemMap, (char*)menuid, strlen(menuid), item);
|
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);
|
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));
|
((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_bool(item, s("setEnabled:"), !disabled);
|
||||||
msg_reg(item, s("autorelease"));
|
|
||||||
msg_int(item, s("setState:"), (checked ? NSControlStateValueOn : NSControlStateValueOff));
|
msg_int(item, s("setState:"), (checked ? NSControlStateValueOn : NSControlStateValueOff));
|
||||||
msg_id(parentmenu, s("addItem:"), item);
|
msg_id(parentmenu, s("addItem:"), item);
|
||||||
return 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 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");
|
id item = ALLOC("NSMenuItem");
|
||||||
|
msg_reg(item, s("autorelease"));
|
||||||
|
|
||||||
// Create a MenuItemCallbackData
|
// Create a MenuItemCallbackData
|
||||||
MenuItemCallbackData *callback = CreateMenuItemCallbackData(menu, item, menuid, Text);
|
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_id(item, s("setTitle:"), str(title));
|
||||||
|
|
||||||
msg_bool(item, s("setEnabled:"), !disabled);
|
msg_bool(item, s("setEnabled:"), !disabled);
|
||||||
msg_reg(item, s("autorelease"));
|
|
||||||
|
|
||||||
// Process modifiers
|
// Process modifiers
|
||||||
if( modifiers != NULL && !alternate) {
|
if( modifiers != NULL && !alternate) {
|
||||||
|
@ -177,9 +177,6 @@ void UpdateTrayMenuInPlace(TrayMenu* currentMenu, TrayMenu* newMenu) {
|
|||||||
|
|
||||||
void DeleteTrayMenu(TrayMenu* trayMenu) {
|
void DeleteTrayMenu(TrayMenu* trayMenu) {
|
||||||
|
|
||||||
// printf("Freeing TrayMenu:\n");
|
|
||||||
// DumpTrayMenu(trayMenu);
|
|
||||||
|
|
||||||
// Delete the menu
|
// Delete the menu
|
||||||
DeleteMenu(trayMenu->menu);
|
DeleteMenu(trayMenu->menu);
|
||||||
|
|
||||||
@ -196,8 +193,17 @@ void DeleteTrayMenu(TrayMenu* trayMenu) {
|
|||||||
trayMenu->statusbaritem = NULL;
|
trayMenu->statusbaritem = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( trayMenu->delegate != NULL ) {
|
// Free the tray menu memory
|
||||||
msg_reg(trayMenu->delegate, s("release"));
|
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
|
// Free the tray menu memory
|
||||||
|
@ -46,5 +46,6 @@ void LoadTrayIcons();
|
|||||||
void UnloadTrayIcons();
|
void UnloadTrayIcons();
|
||||||
|
|
||||||
void DeleteTrayMenu(TrayMenu* trayMenu);
|
void DeleteTrayMenu(TrayMenu* trayMenu);
|
||||||
|
void DeleteTrayMenuKeepStatusBarItem(TrayMenu* trayMenu);
|
||||||
|
|
||||||
#endif //TRAYMENU_DARWIN_H
|
#endif //TRAYMENU_DARWIN_H
|
||||||
|
@ -162,11 +162,7 @@ void UpdateTrayMenuInStore(TrayMenuStore* store, const char* menuJSON) {
|
|||||||
pthread_mutex_unlock(&store->lock);
|
pthread_mutex_unlock(&store->lock);
|
||||||
|
|
||||||
// Delete the current menu
|
// Delete the current menu
|
||||||
DeleteMenu(currentMenu->menu);
|
DeleteTrayMenuKeepStatusBarItem(currentMenu);
|
||||||
currentMenu->menu = NULL;
|
|
||||||
|
|
||||||
// Free the tray menu memory
|
|
||||||
MEMFREE(currentMenu);
|
|
||||||
|
|
||||||
pthread_mutex_lock(&store->lock);
|
pthread_mutex_lock(&store->lock);
|
||||||
hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu);
|
hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu);
|
||||||
|
Loading…
Reference in New Issue
Block a user