adam-gui/vendor/fyne.io/fyne/v2/internal/app/lifecycle.go
2024-04-29 19:13:50 +02:00

86 lines
2.3 KiB
Go

package app
import (
"sync/atomic"
"fyne.io/fyne/v2"
)
var _ fyne.Lifecycle = (*Lifecycle)(nil)
// Lifecycle represents the various phases that an app can transition through.
//
// Since: 2.1
type Lifecycle struct {
onForeground atomic.Value // func()
onBackground atomic.Value // func()
onStarted atomic.Value // func()
onStopped atomic.Value // func()
onStoppedHookExecuted func()
}
// SetOnStoppedHookExecuted is an internal function that lets Fyne schedule a clean-up after
// the user-provided stopped hook. It should only be called once during an application start-up.
func (l *Lifecycle) SetOnStoppedHookExecuted(f func()) {
l.onStoppedHookExecuted = f
}
// SetOnEnteredForeground hooks into the the app becoming foreground.
func (l *Lifecycle) SetOnEnteredForeground(f func()) {
l.onForeground.Store(f)
}
// SetOnExitedForeground hooks into the app having moved to the background.
// Depending on the platform it may still be visible but will not receive keyboard events.
// On some systems hover or desktop mouse move events may still occur.
func (l *Lifecycle) SetOnExitedForeground(f func()) {
l.onBackground.Store(f)
}
// SetOnStarted hooks into an event that says the app is now running.
func (l *Lifecycle) SetOnStarted(f func()) {
l.onStarted.Store(f)
}
// SetOnStopped hooks into an event that says the app is no longer running.
func (l *Lifecycle) SetOnStopped(f func()) {
l.onStopped.Store(f)
}
// TriggerEnteredForeground will call the focus gained hook, if one is registered.
func (l *Lifecycle) TriggerEnteredForeground() {
f := l.onForeground.Load()
if ff, ok := f.(func()); ok && ff != nil {
ff()
}
}
// TriggerExitedForeground will call the focus lost hook, if one is registered.
func (l *Lifecycle) TriggerExitedForeground() {
f := l.onBackground.Load()
if ff, ok := f.(func()); ok && ff != nil {
ff()
}
}
// TriggerStarted will call the started hook, if one is registered.
func (l *Lifecycle) TriggerStarted() {
f := l.onStarted.Load()
if ff, ok := f.(func()); ok && ff != nil {
ff()
}
}
// TriggerStopped will call the stopped hook, if one is registered,
// and an internal stopped hook after that.
func (l *Lifecycle) TriggerStopped() {
f := l.onStopped.Load()
if ff, ok := f.(func()); ok && ff != nil {
ff()
}
if l.onStoppedHookExecuted != nil {
l.onStoppedHookExecuted()
}
}