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 <robin@jarry.cc>
Tested-by: Tim Culverhouse <tim@timculverhouse.com>
This commit is contained in:
Robin Jarry 2022-09-14 21:09:02 +02:00
parent d93ad24f5f
commit ee7937d0dd
3 changed files with 14 additions and 27 deletions

View File

@ -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)
}

View File

@ -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()

View File

@ -743,18 +743,13 @@ func (aerc *Aerc) DecryptKeys(keys []openpgp.Key, symmetric bool) (b []byte, err
fmt.Sprintf("Enter password for %s (%8X)\nPress <ESC> 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