package main import ( "errors" "log" "os" "strconv" "sync" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/driver/desktop" "golang.design/x/hotkey" ) type Layer struct { Hotkey hotkey.Key Image *canvas.Image } var keymap = map[string]hotkey.Key{ "KeyF13": hotkey.KeyF13, "KeyF14": hotkey.KeyF14, "KeyF15": hotkey.KeyF15, "KeyF16": hotkey.KeyF16, "KeyF17": hotkey.KeyF17, } func main() { a := app.New() w := a.NewWindow("SysTray") icon, _ := fyne.LoadResourceFromPath("./keyboard.svg") if desk, ok := a.(desktop.App); ok { m := fyne.NewMenu("MyApp", fyne.NewMenuItem("Show", func() { w.Show() })) desk.SetSystemTrayMenu(m) desk.SetSystemTrayIcon(icon) } w.Resize(fyne.Size{ Width: 1656 / 2, Height: 546 / 2, }) defaultImage := canvas.NewImageFromFile("./default.png") layers := []Layer{} for i := range 5 { imagePath := "./layer_" + strconv.Itoa(i+1) + ".png" if _, err := os.Stat(imagePath); errors.Is(err, os.ErrNotExist) { continue } newLayer := Layer{ Image: canvas.NewImageFromFile(imagePath), Hotkey: keymap["KeyF"+strconv.Itoa(12+i)], } layers = append(layers, newLayer) } w.SetContent(container.NewPadded(defaultImage)) w.SetCloseIntercept(func() { w.Hide() }) go func() { wg := sync.WaitGroup{} wg.Add(len(layers)) for _, v := range layers { go func() { defer wg.Done() log.Printf("Registering %+v", v) err := listenHotkey( func() { w.SetContent(container.NewPadded(v.Image)) }, func() { w.SetContent(container.NewPadded(defaultImage)) }, v.Hotkey, ) if err != nil { log.Println(err) return } }() } wg.Wait() }() w.ShowAndRun() } func listenHotkey(downfn func(), upfn func(), key hotkey.Key, mods ...hotkey.Modifier) (err error) { ms := []hotkey.Modifier{} ms = append(ms, mods...) hk := hotkey.New(ms, key) err = hk.Register() if err != nil { return } for { select { case <-hk.Keyup(): go upfn() case <-hk.Keydown(): go downfn() } } }