diff options
author | Robin Jarry <robin@jarry.cc> | 2023-04-11 10:51:47 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2023-04-15 17:26:57 +0200 |
commit | e641da83471bc3e70b31bfceac21933836a26eac (patch) | |
tree | aca78815ff6ce8b03a4334afcc77823c471e0aab /widgets | |
parent | 66995d17eea2a45a4e8d88a7739db18c13b91bf7 (diff) | |
download | aerc-e641da83471bc3e70b31bfceac21933836a26eac.tar.gz |
term: ignore redraw events when not visible
Another attempt at fixing the high CPU usage when terminal tabs are
running interactive tui applications and the message list tab is
selected.
There are cases where a terminal widget can be visible but not focused
(composer, message viewer, attachment selector, etc.). Define a new
Visible interface with a single Show() method. Call that method when
changing tabs to make sure that terminal widget content events only
trigger redraws when they are visible.
Fixes: 382aea4a9426 ("terminal: avoid high cpu usage when not focused")
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Koni Marti <koni.marti@gmail.com>
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/compose.go | 8 | ||||
-rw-r--r-- | widgets/msgviewer.go | 10 | ||||
-rw-r--r-- | widgets/terminal.go | 12 |
3 files changed, 27 insertions, 3 deletions
diff --git a/widgets/compose.go b/widgets/compose.go index 4f36b297..3693ad18 100644 --- a/widgets/compose.go +++ b/widgets/compose.go @@ -700,6 +700,14 @@ func (c *Composer) Focus(focus bool) { c.Unlock() } +func (c *Composer) Show(visible bool) { + c.Lock() + if vis, ok := c.focusable[c.focused].(ui.Visible); ok { + vis.Show(visible) + } + c.Unlock() +} + func (c *Composer) Config() *config.AccountConfig { return c.acctConfig } diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go index f38b186a..684c99cb 100644 --- a/widgets/msgviewer.go +++ b/widgets/msgviewer.go @@ -406,6 +406,12 @@ func (ps *PartSwitcher) Focus(focus bool) { } } +func (ps *PartSwitcher) Show(visible bool) { + if ps.parts[ps.selected].term != nil { + ps.parts[ps.selected].term.Show(visible) + } +} + func (ps *PartSwitcher) Event(event tcell.Event) bool { return ps.parts[ps.selected].Event(event) } @@ -505,6 +511,10 @@ func (mv *MessageViewer) Focus(focus bool) { mv.switcher.Focus(focus) } +func (mv *MessageViewer) Show(visible bool) { + mv.switcher.Show(visible) +} + type PartViewer struct { acctConfig *config.AccountConfig err error diff --git a/widgets/terminal.go b/widgets/terminal.go index ca5a5ef2..c3c16db6 100644 --- a/widgets/terminal.go +++ b/widgets/terminal.go @@ -18,6 +18,7 @@ type Terminal struct { ctx *ui.Context destroyed bool focus bool + visible bool vterm *tcellterm.Terminal running bool @@ -29,8 +30,9 @@ type Terminal struct { func NewTerminal(cmd *exec.Cmd) (*Terminal, error) { term := &Terminal{ - cmd: cmd, - vterm: tcellterm.New(), + cmd: cmd, + vterm: tcellterm.New(), + visible: true, } return term, nil } @@ -97,6 +99,10 @@ func (term *Terminal) Draw(ctx *ui.Context) { term.draw() } +func (term *Terminal) Show(visible bool) { + term.visible = visible +} + func (term *Terminal) draw() { term.vterm.Draw() if term.focus && !term.closed && term.ctx != nil { @@ -149,7 +155,7 @@ func (term *Terminal) HandleEvent(ev tcell.Event) bool { } switch ev := ev.(type) { case *views.EventWidgetContent: - if term.focus { + if term.visible { ui.QueueRedraw() } return true |