From 53db687a261fcea1b1406a1d1a12debdf1b7011d Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Wed, 24 Feb 2021 21:49:55 +1100 Subject: [PATCH] Support DeleteTrayMenuByID --- v2/internal/ffenestri/ffenestri.h | 1 + v2/internal/ffenestri/ffenestri_client.go | 4 ++++ v2/internal/ffenestri/ffenestri_darwin.c | 6 ++++++ v2/internal/ffenestri/traymenustore_darwin.c | 7 ++++++- v2/internal/ffenestri/traymenustore_darwin.h | 1 + v2/internal/menumanager/traymenu.go | 11 ++++++++++- v2/internal/messagedispatcher/dispatchclient.go | 1 + v2/internal/messagedispatcher/messagedispatcher.go | 11 +++++++++++ v2/internal/runtime/menu.go | 5 +++++ v2/internal/subsystem/menu.go | 11 +++++++++++ 10 files changed, 56 insertions(+), 2 deletions(-) diff --git a/v2/internal/ffenestri/ffenestri.h b/v2/internal/ffenestri/ffenestri.h index c9fbb36ae..056f18ae1 100644 --- a/v2/internal/ffenestri/ffenestri.h +++ b/v2/internal/ffenestri/ffenestri.h @@ -37,6 +37,7 @@ extern void DarkModeEnabled(struct Application*, char *callbackID); extern void SetApplicationMenu(struct Application*, const char *); extern void AddTrayMenu(struct Application*, const char *menuTrayJSON); extern void SetTrayMenu(struct Application*, const char *menuTrayJSON); +extern void DeleteTrayMenuByID(struct Application*, const char *id); extern void UpdateTrayMenuLabel(struct Application*, const char* JSON); extern void AddContextMenu(struct Application*, char *contextMenuJSON); extern void UpdateContextMenu(struct Application*, char *contextMenuJSON); diff --git a/v2/internal/ffenestri/ffenestri_client.go b/v2/internal/ffenestri/ffenestri_client.go index 851d5471f..7c7accf42 100644 --- a/v2/internal/ffenestri/ffenestri_client.go +++ b/v2/internal/ffenestri/ffenestri_client.go @@ -208,3 +208,7 @@ func (c *Client) UpdateTrayMenuLabel(JSON string) { func (c *Client) UpdateContextMenu(contextMenuJSON string) { C.UpdateContextMenu(c.app.app, c.app.string2CString(contextMenuJSON)) } + +func (c *Client) DeleteTrayMenuByID(id string) { + C.DeleteTrayMenuByID(c.app.app, c.app.string2CString(id)) +} diff --git a/v2/internal/ffenestri/ffenestri_darwin.c b/v2/internal/ffenestri/ffenestri_darwin.c index 254cfd2f7..085a88c71 100644 --- a/v2/internal/ffenestri/ffenestri_darwin.c +++ b/v2/internal/ffenestri/ffenestri_darwin.c @@ -1047,6 +1047,12 @@ void SetTrayMenu(struct Application *app, const char* trayMenuJSON) { ); } +void DeleteTrayMenuByID(struct Application *app, const char *id) { + ON_MAIN_THREAD( + DeleteTrayMenuInStore(app->trayMenuStore, id); + ); +} + void UpdateTrayMenuLabel(struct Application* app, const char* JSON) { // Guard against calling during shutdown if( app->shuttingDown ) return; diff --git a/v2/internal/ffenestri/traymenustore_darwin.c b/v2/internal/ffenestri/traymenustore_darwin.c index bc52d0385..51e9b6ac9 100644 --- a/v2/internal/ffenestri/traymenustore_darwin.c +++ b/v2/internal/ffenestri/traymenustore_darwin.c @@ -48,7 +48,6 @@ void ShowTrayMenusInStore(TrayMenuStore* store) { } } - int freeTrayMenu(void *const context, struct hashmap_element_s *const e) { DeleteTrayMenu(e->data); return -1; @@ -81,6 +80,12 @@ TrayMenu* MustGetTrayMenuFromStore(TrayMenuStore* store, const char* menuID) { return result; } +void DeleteTrayMenuInStore(TrayMenuStore* store, const char* ID) { + TrayMenu *menu = MustGetTrayMenuFromStore(store, ID); + hashmap_remove(&store->trayMenuMap, ID, strlen(ID)); + DeleteTrayMenu(menu); +} + void UpdateTrayMenuLabelInStore(TrayMenuStore* store, const char* JSON) { // Parse the JSON JsonNode *parsedUpdate = mustParseJSON(JSON); diff --git a/v2/internal/ffenestri/traymenustore_darwin.h b/v2/internal/ffenestri/traymenustore_darwin.h index 99040f47f..d2d1e0081 100644 --- a/v2/internal/ffenestri/traymenustore_darwin.h +++ b/v2/internal/ffenestri/traymenustore_darwin.h @@ -23,5 +23,6 @@ void ShowTrayMenusInStore(TrayMenuStore* store); void DeleteTrayMenuStore(TrayMenuStore* store); void UpdateTrayMenuLabelInStore(TrayMenuStore* store, const char* JSON); +void DeleteTrayMenuInStore(TrayMenuStore* store, const char* id); #endif //TRAYMENUSTORE_DARWIN_H diff --git a/v2/internal/menumanager/traymenu.go b/v2/internal/menumanager/traymenu.go index 8a4df3665..c2aaa1c47 100644 --- a/v2/internal/menumanager/traymenu.go +++ b/v2/internal/menumanager/traymenu.go @@ -3,9 +3,10 @@ package menumanager import ( "encoding/json" "fmt" + "sync" + "github.com/pkg/errors" "github.com/wailsapp/wails/v2/pkg/menu" - "sync" ) var trayMenuID int @@ -65,6 +66,14 @@ func (m *Manager) AddTrayMenu(trayMenu *menu.TrayMenu) (string, error) { return newTrayMenu.AsJSON() } +func (m *Manager) GetTrayID(trayMenu *menu.TrayMenu) (string, error) { + trayID, exists := m.trayMenuPointers[trayMenu] + if !exists { + return "", fmt.Errorf("Unable to find menu ID for tray menu!") + } + return trayID, nil +} + // SetTrayMenu updates or creates a menu func (m *Manager) SetTrayMenu(trayMenu *menu.TrayMenu) (string, error) { trayID, trayMenuKnown := m.trayMenuPointers[trayMenu] diff --git a/v2/internal/messagedispatcher/dispatchclient.go b/v2/internal/messagedispatcher/dispatchclient.go index d604690e5..1c398c420 100644 --- a/v2/internal/messagedispatcher/dispatchclient.go +++ b/v2/internal/messagedispatcher/dispatchclient.go @@ -37,6 +37,7 @@ type Client interface { SetTrayMenu(trayMenuJSON string) UpdateTrayMenuLabel(JSON string) UpdateContextMenu(contextMenuJSON string) + DeleteTrayMenuByID(id string) } // DispatchClient is what the frontends use to interface with the diff --git a/v2/internal/messagedispatcher/messagedispatcher.go b/v2/internal/messagedispatcher/messagedispatcher.go index 382b2f386..5411bc22d 100644 --- a/v2/internal/messagedispatcher/messagedispatcher.go +++ b/v2/internal/messagedispatcher/messagedispatcher.go @@ -527,6 +527,17 @@ func (d *Dispatcher) processMenuMessage(result *servicebus.Message) { for _, client := range d.clients { client.frontend.UpdateTrayMenuLabel(updatedTrayMenuLabel) } + case "deletetraymenu": + traymenuid, ok := result.Data().(string) + if !ok { + d.logger.Error("Invalid data for 'menufrontend:updatetraymenulabel' : %#v", + result.Data()) + return + } + + for _, client := range d.clients { + client.frontend.DeleteTrayMenuByID(traymenuid) + } default: d.logger.Error("Unknown menufrontend command: %s", command) diff --git a/v2/internal/runtime/menu.go b/v2/internal/runtime/menu.go index 283b639ba..f4aa80429 100644 --- a/v2/internal/runtime/menu.go +++ b/v2/internal/runtime/menu.go @@ -10,6 +10,7 @@ type Menu interface { UpdateApplicationMenu() UpdateContextMenu(contextMenu *menu.ContextMenu) SetTrayMenu(trayMenu *menu.TrayMenu) + DeleteTrayMenu(trayMenu *menu.TrayMenu) UpdateTrayMenuLabel(trayMenu *menu.TrayMenu) } @@ -39,3 +40,7 @@ func (m *menuRuntime) SetTrayMenu(trayMenu *menu.TrayMenu) { func (m *menuRuntime) UpdateTrayMenuLabel(trayMenu *menu.TrayMenu) { m.bus.Publish("menu:updatetraymenulabel", trayMenu) } + +func (m *menuRuntime) DeleteTrayMenu(trayMenu *menu.TrayMenu) { + m.bus.Publish("menu:deletetraymenu", trayMenu) +} diff --git a/v2/internal/subsystem/menu.go b/v2/internal/subsystem/menu.go index 26d305627..b77907938 100644 --- a/v2/internal/subsystem/menu.go +++ b/v2/internal/subsystem/menu.go @@ -137,6 +137,17 @@ func (m *Menu) Start() error { // Notify frontend of menu change m.bus.Publish("menufrontend:settraymenu", updatedMenu) + case "deletetraymenu": + trayMenu := menuMessage.Data().(*menu.TrayMenu) + trayID, err := m.menuManager.GetTrayID(trayMenu) + if err != nil { + m.logger.Trace("%s", err.Error()) + return + } + + // Notify frontend of menu change + m.bus.Publish("menufrontend:deletetraymenu", trayID) + case "updatetraymenulabel": trayMenu := menuMessage.Data().(*menu.TrayMenu) updatedLabel, err := m.menuManager.UpdateTrayMenuLabel(trayMenu)