86 lines
2.3 KiB
Go
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()
|
||
|
}
|
||
|
}
|