kpsync/app/tray.go
2025-08-20 14:19:12 +02:00

140 lines
3.0 KiB
Go

package app
import (
"fyne.io/systray"
"mikescher.com/kpsync/assets"
)
func (app *Application) initTray() {
sigBGStop := make(chan bool, 128)
trayOnReady := func() {
app.masterLock.Lock()
defer app.masterLock.Unlock()
systray.SetIcon(assets.IconInit)
systray.SetTitle("KeepassXC Sync")
app.currSysTrayTooltip = "Initializing..."
systray.SetTooltip(app.currSysTrayTooltip)
miSync := systray.AddMenuItem("Sync Now (checked)", "")
miSyncForce := systray.AddMenuItem("Sync Now (forced)", "")
miShowLogFifo := systray.AddMenuItem("Show Log (fifo)", "")
miShowLogFile := systray.AddMenuItem("Show Log (file)", "")
systray.AddMenuItem("", "")
app.trayItemChecksum = systray.AddMenuItem("Checksum: {...}", "")
app.trayItemETag = systray.AddMenuItem("ETag: {...}", "")
app.trayItemLastModified = systray.AddMenuItem("LastModified: {...}", "")
systray.AddMenuItem("", "")
miQuit := systray.AddMenuItem("Quit", "")
app.LogDebug("SysTray initialized")
app.LogLine()
go func() {
for {
select {
case <-miSync.ClickedCh:
app.LogDebug("SysTray: [Sync Now (checked)] clicked")
app.LogLine()
go func() { app.runExplicitSync(false) }()
case <-miSyncForce.ClickedCh:
app.LogDebug("SysTray: [Sync Now (forced)] clicked")
app.LogLine()
go func() { app.runExplicitSync(true) }()
case <-miShowLogFifo.ClickedCh:
app.LogDebug("SysTray: [Show Log Fifo] clicked")
app.LogLine()
go func() { app.openLogFifo() }()
case <-miShowLogFile.ClickedCh:
app.LogDebug("SysTray: [Show Log File] clicked")
app.LogLine()
go func() { app.openLogFile() }()
case <-miQuit.ClickedCh:
app.LogDebug("SysTray: [Quit] clicked")
app.LogLine()
app.sigManualStopChan <- true
case <-sigBGStop:
app.LogDebug("SysTray: Click-Listener goroutine stopped")
app.LogLine()
return
}
}
}()
app.trayReady.Set(true)
}
systray.Run(trayOnReady, nil)
sigBGStop <- true
app.LogDebug("SysTray stopped")
app.LogLine()
app.trayReady.Set(false)
}
func (app *Application) setTrayState(txt string, icon []byte) func() {
if !app.trayReady.Get() {
return func() {}
}
app.masterLock.Lock()
defer app.masterLock.Unlock()
systray.SetIcon(icon)
systray.SetTooltip(txt)
var finDone = false
fin := func() {
app.masterLock.Lock()
defer app.masterLock.Unlock()
if finDone {
return
}
if !app.trayReady.Get() {
return
}
systray.SetIcon(assets.IconDefault)
app.currSysTrayTooltip = "Sleeping..."
systray.SetTooltip(app.currSysTrayTooltip)
finDone = true
}
return fin
}
func (app *Application) setTrayStateDirect(txt string, icon []byte) {
if !app.trayReady.Get() {
return
}
app.masterLock.Lock()
defer app.masterLock.Unlock()
systray.SetIcon(icon)
systray.SetTooltip(txt)
}
func (app *Application) setTrayTooltip(txt string) {
if !app.trayReady.Get() {
return
}
app.masterLock.Lock()
defer app.masterLock.Unlock()
systray.SetTooltip(txt)
app.currSysTrayTooltip = txt
systray.SetTooltip(app.currSysTrayTooltip)
}