From 77a0f68758905faa74407499ff92c90929e27989 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Wed, 10 Jan 2018 22:41:15 -0500 Subject: Make termbox event loop async --- ui/render.go | 53 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 9 deletions(-) (limited to 'ui/render.go') diff --git a/ui/render.go b/ui/render.go index bca0cf6..4fedc2c 100644 --- a/ui/render.go +++ b/ui/render.go @@ -8,15 +8,21 @@ import ( func Initialize(conf *config.AercConfig) (*UIState, error) { state := UIState{ + Config: conf, InvalidPanes: InvalidateAll, - Tabs: make([]AercTab, len(conf.Accounts)), + + tbEvents: make(chan tb.Event, 10), } - // TODO: Initialize each tab to a mailbox tab if err := tb.Init(); err != nil { return nil, err } tb.SetInputMode(tb.InputEsc | tb.InputMouse) tb.SetOutputMode(tb.Output256) + go (func() { + for !state.Exit { + state.tbEvents <- tb.PollEvent() + } + })() return &state, nil } @@ -24,21 +30,50 @@ func (state *UIState) Close() { tb.Close() } +func (state *UIState) AddTab(tab AercTab) { + state.Tabs = append(state.Tabs, tab) +} + func (state *UIState) Invalidate(what uint) { state.InvalidPanes |= what } +func (state *UIState) calcGeometries() { + width, height := tb.Size() + // TODO: more + state.Panes.TabView = Geometry{ + Row: 0, + Col: 0, + Width: width, + Height: height, + } +} + func (state *UIState) Tick() bool { - switch e := tb.PollEvent(); e.Type { - case tb.EventKey: - if e.Key == tb.KeyEsc { - state.Exit = true + select { + case event := <-state.tbEvents: + switch event.Type { + case tb.EventKey: + if event.Key == tb.KeyEsc { + state.Exit = true + } + case tb.EventResize: + state.Invalidate(InvalidateAll) } - case tb.EventResize: - state.Invalidate(InvalidateAll) + default: + // no-op + break } if state.InvalidPanes != 0 { - // TODO: re-render + if state.InvalidPanes&InvalidateAll == InvalidateAll { + tb.Clear(tb.ColorDefault, tb.ColorDefault) + state.calcGeometries() + } + if state.InvalidPanes&InvalidateTabs != 0 { + tab := state.Tabs[state.SelectedTab] + tab.Render(state.Panes.TabView) + } + tb.Flush() state.InvalidPanes = 0 } return true -- cgit v1.2.3