5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 18:10:48 +08:00
wails/v2/internal/signal/signal.go

69 lines
1.3 KiB
Go

package signal
import (
"os"
gosignal "os/signal"
"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
// Quit channel
quitChannel <-chan *servicebus.Message
}
// NewManager creates a new signal manager
func NewManager(bus *servicebus.ServiceBus, logger *logger.Logger) (*Manager, error) {
// Register quit channel
quitChannel, err := bus.Subscribe("quit")
if err != nil {
return nil, err
}
result := &Manager{
bus: bus,
logger: logger.CustomLogger("Event Manager"),
signalchannel: make(chan os.Signal, 2),
quitChannel: quitChannel,
}
return result, nil
}
// Start the Signal Manager
func (m *Manager) Start() {
// Hook into interrupts
gosignal.Notify(m.signalchannel, os.Interrupt, syscall.SIGTERM)
// Spin off signal listener
go func() {
running := true
for running {
select {
case <-m.signalchannel:
println()
m.logger.Trace("Ctrl+C detected. Shutting down...")
m.bus.Publish("quit", "ctrl-c pressed")
case <-m.quitChannel:
running = false
break
}
}
m.logger.Trace("Shutdown")
}()
}