github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/signal/signal.go (about)

     1  package signal
     2  
     3  import (
     4  	"os"
     5  	gosignal "os/signal"
     6  	"sync"
     7  	"syscall"
     8  )
     9  
    10  var signalChannel = make(chan os.Signal, 2)
    11  
    12  var (
    13  	callbacks []func()
    14  	lock      sync.Mutex
    15  )
    16  
    17  func OnShutdown(callback func()) {
    18  	lock.Lock()
    19  	defer lock.Unlock()
    20  	callbacks = append(callbacks, callback)
    21  }
    22  
    23  // Start the Signal Manager
    24  func Start() {
    25  	// Hook into interrupts
    26  	gosignal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
    27  
    28  	// Spin off signal listener and wait for either a cancellation
    29  	// or signal
    30  	go func() {
    31  		<-signalChannel
    32  		println("")
    33  		println("Ctrl+C detected. Shutting down...")
    34  		for _, callback := range callbacks {
    35  			callback()
    36  		}
    37  	}()
    38  }