From ee7937d0dd9201fdb78f363ddc8af950d0778f1b Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Wed, 14 Sep 2022 21:09:02 +0200 Subject: [PATCH] ui: cleanup internals and api Now that tcell events are handled in a goroutine, no need for a channel to buffer them. Rename ui.Tick() to ui.Render() and ui.Run() to ui.ProcessEvents() to better reflect what these functions do. Move screen.PollEvent() into ui.ProcessEvents(). Register the panic handler in ui.ProcessEvents(). Remove aerc.ui.Tick() from DecryptKeys(). What the hell was that? Signed-off-by: Robin Jarry Tested-by: Tim Culverhouse --- aerc.go | 4 ++-- lib/ui/ui.go | 22 +++++++--------------- widgets/aerc.go | 15 +++++---------- 3 files changed, 14 insertions(+), 27 deletions(-) diff --git a/aerc.go b/aerc.go index 37d9509..e1a1345 100644 --- a/aerc.go +++ b/aerc.go @@ -241,12 +241,12 @@ func main() { setWindowTitle() } - go ui.Run() + go ui.ProcessEvents() for !ui.ShouldExit() { for aerc.Tick() { // Continue updating our internal state } - if !ui.Tick() { + if !ui.Render() { // ~60 FPS time.Sleep(16 * time.Millisecond) } diff --git a/lib/ui/ui.go b/lib/ui/ui.go index 7cff575..a4128a5 100644 --- a/lib/ui/ui.go +++ b/lib/ui/ui.go @@ -13,9 +13,7 @@ type UI struct { ctx *Context screen tcell.Screen popover *Popover - - tcEvents chan tcell.Event - invalid int32 // access via atomic + invalid int32 // access via atomic } func Initialize(content DrawableInteractive) (*UI, error) { @@ -36,19 +34,10 @@ func Initialize(content DrawableInteractive) (*UI, error) { state := UI{ Content: content, screen: screen, - - tcEvents: make(chan tcell.Event, 10), } state.ctx = NewContext(width, height, screen, state.onPopover) state.exit.Store(false) - go func() { - defer logging.PanicHandler() - - for !state.ShouldExit() { - state.tcEvents <- screen.PollEvent() - } - }() state.invalid = 1 content.OnInvalidate(func(_ Drawable) { @@ -82,7 +71,7 @@ func (state *UI) Close() { state.screen.Fini() } -func (state *UI) Tick() bool { +func (state *UI) Render() bool { more := false wasInvalid := atomic.SwapInt32(&state.invalid, 0) @@ -110,8 +99,11 @@ func (state *UI) EnableMouse() { state.screen.EnableMouse() } -func (state *UI) Run() { - for event := range state.tcEvents { +func (state *UI) ProcessEvents() { + defer logging.PanicHandler() + + for !state.ShouldExit() { + event := state.screen.PollEvent() if event, ok := event.(*tcell.EventResize); ok { state.screen.Clear() width, height := event.Size() diff --git a/widgets/aerc.go b/widgets/aerc.go index f0bc1ba..cbc3779 100644 --- a/widgets/aerc.go +++ b/widgets/aerc.go @@ -743,18 +743,13 @@ func (aerc *Aerc) DecryptKeys(keys []openpgp.Key, symmetric bool) (b []byte, err fmt.Sprintf("Enter password for %s (%8X)\nPress to cancel", ident.Name, key.PublicKey.KeyId)) - for { - select { - case err = <-chErr: - if err != nil { - return nil, err - } - pass := <-chPass - err = key.PrivateKey.Decrypt([]byte(pass)) + for err := range chErr { + if err != nil { return nil, err - default: - aerc.ui.Tick() } + pass := <-chPass + err = key.PrivateKey.Decrypt([]byte(pass)) + return nil, err } } return nil, err