From be4ea0d96b8cc70becb94f2d4e5abe41dea58f3a Mon Sep 17 00:00:00 2001 From: Kevin Kuehler Date: Tue, 15 Oct 2019 02:01:47 -0700 Subject: [PATCH] Cleanup pager processes after closing a msgviewer A pager is spawned every time an email is viewed but not killed off when quitting the msgviewer, thus leading to process leakage. This patch fixes this by adding a Close method to the msgview widget, which is called in the close command. Signed-off-by: Kevin Kuehler --- commands/msgview/close.go | 1 + widgets/msgviewer.go | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/commands/msgview/close.go b/commands/msgview/close.go index 9966735..ed86405 100644 --- a/commands/msgview/close.go +++ b/commands/msgview/close.go @@ -25,6 +25,7 @@ func (Close) Execute(aerc *widgets.Aerc, args []string) error { return errors.New("Usage: close") } mv, _ := aerc.SelectedTab().(*widgets.MessageViewer) + mv.Close() aerc.RemoveTab(mv) return nil } diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go index c179070..d5bbace 100644 --- a/widgets/msgviewer.go +++ b/widgets/msgviewer.go @@ -284,6 +284,10 @@ func (mv *MessageViewer) NextPart() { mv.Invalidate() } +func (mv *MessageViewer) Close() { + mv.switcher.Cleanup() +} + func (ps *PartSwitcher) Invalidate() { ps.DoInvalidate(ps) } @@ -381,6 +385,12 @@ func (ps *PartSwitcher) MouseEvent(localX int, localY int, event tcell.Event) { } } +func (ps *PartSwitcher) Cleanup() { + for _, partViewer := range ps.parts { + partViewer.Cleanup() + } +} + func (mv *MessageViewer) Event(event tcell.Event) bool { return mv.switcher.Event(event) } @@ -593,6 +603,13 @@ func (pv *PartViewer) Draw(ctx *ui.Context) { pv.term.Draw(ctx) } +func (pv *PartViewer) Cleanup() { + if pv.pager != nil && pv.pager.Process != nil { + pv.pager.Process.Kill() + pv.pager = nil + } +} + type HeaderView struct { ui.Invalidatable Name string