diff --git a/aerc.go b/aerc.go index 17b3c57..33acb43 100644 --- a/aerc.go +++ b/aerc.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "log" "os" + "runtime/debug" "sort" "time" @@ -153,6 +154,8 @@ func main() { ui *libui.UI ) + defer PanicTermFix(ui) // recover upon panic and try restoring the pty + aerc = widgets.NewAerc(conf, logger, func(cmd []string) error { return execCommand(aerc, ui, cmd) }, func(cmd string) []string { @@ -198,3 +201,19 @@ func main() { } aerc.CloseBackends() } + +//FatalTermFix prints the stacktrace upon panic and tries to recover the term +// not doing that leaves the terminal in a broken state +func PanicTermFix(ui *libui.UI) { + var err interface{} + if err = recover(); err == nil { + return + } + debug.PrintStack() + if ui != nil { + ui.Close() + } + fmt.Fprintf(os.Stderr, "aerc crashed: %v\n", err) + os.Exit(1) + +}