5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-05 04:00:32 +08:00
wails/v3/internal/signal/signal.go
Lea Anthony e5c14d24ae
Initial implementation of dev mode.
Huge thanks to @atterpac!
2024-01-19 21:34:49 +11:00

51 lines
1.1 KiB
Go

package signal
import (
"fmt"
"log/slog"
"os"
"os/signal"
"syscall"
)
type SignalHandler struct {
cleanup func()
ExitMessage func(sig os.Signal) string
MaxSignal int
Logger *slog.Logger
LogLevel slog.Level
}
func NewSignalHandler(cleanup func()) *SignalHandler {
return &SignalHandler{
cleanup: cleanup,
ExitMessage: func(sig os.Signal) string { return fmt.Sprintf("Received signal: %v. Quitting...\n", sig) },
MaxSignal: 3,
Logger: slog.New(slog.NewTextHandler(os.Stderr, nil)),
LogLevel: slog.LevelInfo,
}
}
func (s *SignalHandler) Start() {
ctrlC := make(chan os.Signal, s.MaxSignal)
signal.Notify(ctrlC, os.Interrupt, syscall.SIGTERM)
go func() {
for i := 1; i <= s.MaxSignal; i++ {
sig := <-ctrlC
if i == 1 {
s.Logger.Info(s.ExitMessage(sig))
s.cleanup()
break
} else if i < s.MaxSignal {
s.Logger.Info("Received signal: %v. Press CTRL+C %d more times to force quit...\n", sig, s.MaxSignal-i)
continue
} else {
s.Logger.Info("Received signal: %v. Force quitting...\n", sig)
os.Exit(1)
}
}
}()
}