terminal: use Invalidate and QueueRedraw

The terminal widget uses it's own redraw logic to improve performance.
With the addition of a main event loop, the redraw logic can happen in
the main loop via the standard Invalidate logic.

Use the Invalidate method to mark aerc invalid, and immediately trigger
a redraw with ui.QueueRedraw. The follow up call to QueueRedraw is
needed because the terminal update happens in a separate goroutine. This
can result in the main event loop finishing it's process of the current
event, redrawing the screen, and the terminal having additional updates
to be drawn.

This fixes race conditions by drawing and calling screen.Show in a
separate goroutine.

Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
Tim Culverhouse 2022-10-06 11:46:43 -05:00 committed by Robin Jarry
parent 725fe07d24
commit a49caf96b5

View file

@ -148,20 +148,8 @@ func (term *Terminal) HandleEvent(ev tcell.Event) bool {
} }
switch ev := ev.(type) { switch ev := ev.(type) {
case *views.EventWidgetContent: case *views.EventWidgetContent:
if !term.focus { term.Invalidate()
return false ui.QueueRedraw()
}
// Draw here for performance improvement. We call draw again in
// the main Draw, but tcell-term only draws dirty cells, so it
// won't be too much extra CPU there. Drawing there is needed
// for certain msgviews, particularly if the pager command
// exits.
term.draw()
// Perform a tcell screen.Show() to show our updates
// immediately
if term.ctx != nil {
term.ctx.Show()
}
return true return true
case *tcellterm.EventTitle: case *tcellterm.EventTitle:
if term.OnTitle != nil { if term.OnTitle != nil {