5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 05:00:31 +08:00
wails/v2/internal/ffenestri/windows_menu_cache.go
Eng Zer Jun ae341be638
chore: run go fmt ./... and go mod tidy
Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
2021-11-25 12:14:27 +08:00

76 lines
2.1 KiB
Go

//go:build windows
// +build windows
package ffenestri
import (
"github.com/leaanthony/idgen"
"github.com/wailsapp/wails/v2/internal/menumanager"
"sync"
)
/**
MenuCache
---------
When windows calls back to Go (when an item is clicked), we need to
be able to retrieve information about the menu item:
- The menu that the menuitem is part of (parent)
- The original processed menu item
- The type of the menu (application, context or tray)
This cache is built up when a menu is created.
*/
// TODO: Make this like the other caches
type menuCacheEntry struct {
parent win32Menu
menuType menuType
item *menumanager.ProcessedMenuItem
processedMenu *menumanager.ProcessedMenu
}
var idGenerator = idgen.New()
var menuCache = map[win32MenuItemID]*menuCacheEntry{}
var menuCacheLock sync.RWMutex
var wailsMenuIDtoWin32IDMap = map[wailsMenuItemID]win32MenuItemID{}
// This releases the menuIDs back to the id generator
var winIDsOwnedByProcessedMenu = map[*menumanager.ProcessedMenu][]win32MenuItemID{}
func releaseMenuIDsForProcessedMenu(processedMenu *menumanager.ProcessedMenu) {
for _, menuID := range winIDsOwnedByProcessedMenu[processedMenu] {
idGenerator.ReleaseID(uint(menuID))
}
delete(winIDsOwnedByProcessedMenu, processedMenu)
}
func addMenuCacheEntry(parent win32Menu, typ menuType, wailsMenuItem *menumanager.ProcessedMenuItem, processedMenu *menumanager.ProcessedMenu) win32MenuItemID {
menuCacheLock.Lock()
defer menuCacheLock.Unlock()
id, err := idGenerator.NewID()
checkFatal(err)
menuID := win32MenuItemID(id)
menuCache[menuID] = &menuCacheEntry{
parent: parent,
menuType: typ,
item: wailsMenuItem,
processedMenu: processedMenu,
}
// save the mapping
wailsMenuIDtoWin32IDMap[wailsMenuItemID(wailsMenuItem.ID)] = menuID
// keep track of menuids owned by this menu (so we can release the ids)
winIDsOwnedByProcessedMenu[processedMenu] = append(winIDsOwnedByProcessedMenu[processedMenu], menuID)
return menuID
}
func getMenuCacheEntry(id win32MenuItemID) *menuCacheEntry {
menuCacheLock.Lock()
defer menuCacheLock.Unlock()
return menuCache[id]
}