diff --git a/uiterm/ui.go b/uiterm/ui.go index 6870e01..5a19208 100644 --- a/uiterm/ui.go +++ b/uiterm/ui.go @@ -100,15 +100,32 @@ func (ui *Ui) Run(cmds chan string) error { if err := termbox.Init(); err != nil { return err } - defer termbox.Close() termbox.SetInputMode(termbox.InputAlt) - events := make(chan termbox.Event) + // Closing termbox wakes PollEvent. Keep delivery cancellable so the polling + // goroutine cannot become stranded trying to send after Run returns. + events := make(chan termbox.Event, 1) + pollDone := make(chan struct{}) go func() { + defer close(pollDone) for { - events <- termbox.PollEvent() + event := termbox.PollEvent() + select { + case <-ui.close: + return + default: + } + select { + case events <- event: + case <-ui.close: + return + } } }() + defer func() { + termbox.Close() + <-pollDone + }() ui.manager.OnUiInitialize(ui) ui.manager.OnUiDoneInitialize(ui)