package wrap import ( "context" "log" "mayhem-party/src/device/input/button" "mayhem-party/src/device/input/raw" "os" "os/signal" "syscall" ) var ( ChSigUsr1 = func() chan os.Signal { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGUSR1) return c }() ) type Refresh struct { can context.CancelFunc input Wrap } func NewRefresh(ctx context.Context, newWrap func() Wrap) *Refresh { return NewRefreshWith(ctx, newWrap, ChSigUsr1) } func NewRefreshWith(ctx context.Context, newWrap func() Wrap, ch <-chan os.Signal) *Refresh { ctx, can := context.WithCancel(ctx) result := &Refresh{ can: can, input: newWrap(), } go func() { defer log.Println("refreshing done") for { select { case <-ctx.Done(): return case sig := <-ch: log.Println("refreshing for", sig) result.input.CloseWrap() result.input = newWrap() } } }() return result } func (r *Refresh) CloseWrap() raw.Raw { r.can() return r.input.CloseWrap() } func (r *Refresh) Read() []button.Button { return r.input.Read() } func (r *Refresh) Close() { r.can() r.input.Close() }