diff --git a/v2/internal/appng/app_bindings.go b/v2/internal/appng/app_bindings.go index 477e811c2..8a80da32b 100644 --- a/v2/internal/appng/app_bindings.go +++ b/v2/internal/appng/app_bindings.go @@ -35,6 +35,8 @@ func (a *App) Run() error { return nil } +func (a *App) Shutdown() {} + // CreateApp creates the app! func CreateApp(appoptions *options.App) (*App, error) { // Set up logger diff --git a/v2/internal/appng/app_dev.go b/v2/internal/appng/app_dev.go index 71715635a..453292696 100644 --- a/v2/internal/appng/app_dev.go +++ b/v2/internal/appng/app_dev.go @@ -44,11 +44,16 @@ type App struct { ctx context.Context } -func (a *App) Run() error { - err := a.frontend.Run(a.ctx) +func (a *App) Shutdown() { if a.shutdownCallback != nil { a.shutdownCallback(a.ctx) } + a.frontend.Quit() +} + +func (a *App) Run() error { + err := a.frontend.Run(a.ctx) + a.Shutdown() return err } diff --git a/v2/internal/appng/app_production.go b/v2/internal/appng/app_production.go index cbbb75d3e..05e205712 100644 --- a/v2/internal/appng/app_production.go +++ b/v2/internal/appng/app_production.go @@ -34,11 +34,16 @@ type App struct { ctx context.Context } -func (a *App) Run() error { - err := a.frontend.Run(a.ctx) +func (a *App) Shutdown() { if a.shutdownCallback != nil { a.shutdownCallback(a.ctx) } + a.frontend.Quit() +} + +func (a *App) Run() error { + err := a.frontend.Run(a.ctx) + a.Shutdown() return err } diff --git a/v2/internal/signal/signal.go b/v2/internal/signal/signal.go index f6db19cd3..96e10bee6 100644 --- a/v2/internal/signal/signal.go +++ b/v2/internal/signal/signal.go @@ -1,73 +1,39 @@ 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 +var signalChannel = make(chan os.Signal, 2) - // logger - logger logger.CustomLogger +var callbacks []func() +var lock sync.Mutex - // signalChannel - signalchannel chan os.Signal - - // ctx - ctx context.Context - cancel context.CancelFunc - - // 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) (*Manager, error) { - - result := &Manager{ - bus: bus, - logger: logger.CustomLogger("Signal Manager"), - signalchannel: make(chan os.Signal, 2), - ctx: ctx, - cancel: cancel, - wg: ctx.Value("waitgroup").(*sync.WaitGroup), - } - - return result, nil +func OnShutdown(callback func()) { + lock.Lock() + defer lock.Unlock() + callbacks = append(callbacks, callback) } // Start the Signal Manager -func (m *Manager) Start() { +func Start() { // Hook into interrupts - gosignal.Notify(m.signalchannel, os.Interrupt, syscall.SIGTERM, syscall.SIGINT) - - m.wg.Add(1) + gosignal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM, syscall.SIGINT) // 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") - - // Start shutdown of Wails - m.cancel() - - case <-m.ctx.Done(): + case <-signalChannel: + println("") + println("Ctrl+C detected. Shutting down...") + for _, callback := range callbacks { + callback() + } } - m.logger.Trace("Shutdown") - m.wg.Done() }() } diff --git a/v2/wails.go b/v2/wails.go index 09d810ce3..e35ca82e9 100644 --- a/v2/wails.go +++ b/v2/wails.go @@ -4,6 +4,7 @@ package wails import ( app "github.com/wailsapp/wails/v2/internal/appng" + "github.com/wailsapp/wails/v2/internal/signal" "github.com/wailsapp/wails/v2/pkg/options" ) @@ -30,5 +31,11 @@ func Run(options *options.App) error { return err } + signal.OnShutdown(func() { + mainapp.Shutdown() + }) + + signal.Start() + return mainapp.Run() }