5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 07:41:37 +08:00
wails/v2/internal/signal/signal.go
2021-02-03 07:14:44 +11:00

84 lines
1.7 KiB
Go

package signal
import (
"context"
"os"
gosignal "os/signal"
"sync"
"syscall"
"github.com/wailsapp/wails/v2/internal/logger"
"github.com/wailsapp/wails/v2/internal/servicebus"
)
// Manager manages signals such as CTRL-C
type Manager struct {
// Service Bus
bus *servicebus.ServiceBus
// logger
logger logger.CustomLogger
// signalChannel
signalchannel chan os.Signal
// ctx
ctx context.Context
cancel context.CancelFunc
// The shutdown callback to notify the user's app that a shutdown
// has started
shutdownCallback func()
// Parent waitgroup
wg *sync.WaitGroup
}
// NewManager creates a new signal manager
func NewManager(ctx context.Context, cancel context.CancelFunc, bus *servicebus.ServiceBus, logger *logger.Logger, shutdownCallback func()) (*Manager, error) {
result := &Manager{
bus: bus,
logger: logger.CustomLogger("Event Manager"),
signalchannel: make(chan os.Signal, 2),
ctx: ctx,
cancel: cancel,
shutdownCallback: shutdownCallback,
wg: ctx.Value("waitgroup").(*sync.WaitGroup),
}
return result, nil
}
// Start the Signal Manager
func (m *Manager) Start() {
// Hook into interrupts
gosignal.Notify(m.signalchannel, os.Interrupt, syscall.SIGTERM)
m.wg.Add(1)
// Spin off signal listener and wait for either a cancellation
// or signal
go func() {
select {
case <-m.signalchannel:
println()
m.logger.Trace("Ctrl+C detected. Shutting down...")
m.bus.Publish("quit", "ctrl-c pressed")
// Shutdown app first
if m.shutdownCallback != nil {
m.shutdownCallback()
}
// Start shutdown of Wails
m.cancel()
case <-m.ctx.Done():
}
m.logger.Trace("Shutdown")
m.wg.Done()
}()
}