package tui import ( "errors" "fmt" "git.tordarus.net/tordarus/buf2d" "github.com/gdamore/tcell" ) type Screen struct { scr tcell.Screen stopCh chan error Root View } func NewScreen(root View) (*Screen, error) { scr, err := tcell.NewScreen() if err != nil { return nil, err } s := &Screen{ Root: root, scr: scr, stopCh: make(chan error, 1), } go s.eventloop() return s, nil } func (s *Screen) eventloop() { for evt := s.scr.PollEvent(); evt != nil; evt = s.scr.PollEvent() { switch event := evt.(type) { case *tcell.EventResize: go s.Redraw() case *tcell.EventKey: go func() { s.Root.OnKeyPressed(event.Key()) s.Redraw() }() default: s.StopWithError(errors.New(fmt.Sprintf("%#v", event))) } } s.StopWithError(errors.New("unknown error occured")) } func (s *Screen) Start() error { err := s.scr.Init() if err != nil { return err } s.Redraw() return <-s.stopCh } func (s *Screen) Stop() { s.StopWithError(nil) } func (s *Screen) StopWithError(err error) { s.stopCh <- err } func (s *Screen) Redraw() { w, h := s.scr.Size() buf := buf2d.NewBuffer(w, h) s.Root.Draw(buf) drawBuffer(s.scr, buf) }