From fda3f43e7c5e5a175a01dd3e5b8637b1ecb30c51 Mon Sep 17 00:00:00 2001 From: Andrew Jeffery Date: Mon, 6 Jul 2020 20:14:15 +0100 Subject: [PATCH] Allow open to be asynchronous This stops the ui being blocked while the resource is opened. The wait ensures that resources are reclaimed when the process finishes while aerc is still running. --- commands/msg/unsubscribe.go | 2 +- commands/msgview/open.go | 5 ++--- lib/open.go | 15 +++++++++++++-- lib/open_darwin.go | 15 +++++++++++++-- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/commands/msg/unsubscribe.go b/commands/msg/unsubscribe.go index 1a2dd37..dec90d5 100644 --- a/commands/msg/unsubscribe.go +++ b/commands/msg/unsubscribe.go @@ -115,6 +115,6 @@ func unsubscribeMailto(aerc *widgets.Aerc, u *url.URL) error { } func unsubscribeHTTP(u *url.URL) error { - go lib.OpenFile(u.String()) + lib.OpenFile(u.String(), nil) return nil } diff --git a/commands/msgview/open.go b/commands/msgview/open.go index f708b2d..4aa6133 100644 --- a/commands/msgview/open.go +++ b/commands/msgview/open.go @@ -60,10 +60,9 @@ func (Open) Execute(aerc *widgets.Aerc, args []string) error { return } - err = lib.OpenFile(tmpFile.Name()) - if err != nil { + lib.OpenFile(tmpFile.Name(), func(err error) { aerc.PushError(" " + err.Error()) - } + }) aerc.PushStatus("Opened", 10*time.Second) }) diff --git a/lib/open.go b/lib/open.go index ad6533e..ebcf878 100644 --- a/lib/open.go +++ b/lib/open.go @@ -6,7 +6,18 @@ import ( "os/exec" ) -func OpenFile(filename string) error { +func OpenFile(filename string, onErr func(error)) { cmd := exec.Command("xdg-open", filename) - return cmd.Run() + err := cmd.Start() + if err != nil && onErr != nil { + onErr(err) + return + } + + go func() { + err := cmd.Wait() + if err != nil && onErr != nil { + onErr(err) + } + }() } diff --git a/lib/open_darwin.go b/lib/open_darwin.go index 0ffd9a1..d98c898 100644 --- a/lib/open_darwin.go +++ b/lib/open_darwin.go @@ -4,7 +4,18 @@ import ( "os/exec" ) -func OpenFile(filename string) error { +func OpenFile(filename string, onErr func(error)) { cmd := exec.Command("open", filename) - return cmd.Run() + err := cmd.Start() + if err != nil && onErr != nil { + onErr(err) + return + } + + go func() { + err := cmd.Wait() + if err != nil && onErr != nil { + onErr(err) + } + }() }