2024-06-05 21:24:20 -04:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2024-06-05 21:59:07 -04:00
|
|
|
"errors"
|
2024-06-05 21:24:20 -04:00
|
|
|
"log"
|
2024-06-05 21:59:07 -04:00
|
|
|
"os"
|
|
|
|
"strconv"
|
2024-06-05 21:24:20 -04:00
|
|
|
"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"
|
|
|
|
)
|
|
|
|
|
2024-06-05 21:59:07 -04:00
|
|
|
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,
|
|
|
|
}
|
|
|
|
|
2024-06-05 21:24:20 -04:00
|
|
|
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,
|
|
|
|
})
|
2024-06-05 21:59:07 -04:00
|
|
|
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))
|
2024-06-05 21:24:20 -04:00
|
|
|
|
|
|
|
w.SetCloseIntercept(func() {
|
|
|
|
w.Hide()
|
|
|
|
})
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
wg := sync.WaitGroup{}
|
2024-06-05 21:59:07 -04:00
|
|
|
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
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
}
|
2024-06-05 21:24:20 -04:00
|
|
|
wg.Wait()
|
|
|
|
}()
|
|
|
|
|
|
|
|
w.ShowAndRun()
|
|
|
|
}
|
|
|
|
|
2024-06-05 21:59:07 -04:00
|
|
|
func listenHotkey(downfn func(), upfn func(), key hotkey.Key, mods ...hotkey.Modifier) (err error) {
|
2024-06-05 21:24:20 -04:00
|
|
|
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()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|