diff options
author | Drew DeVault <sir@cmpwn.com> | 2019-03-17 17:23:53 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2019-03-17 17:23:53 -0400 |
commit | dee0f8938b62d668ed9105c96313fbd8b8bbd098 (patch) | |
tree | 2a6d9f1a427d7c4c4dabd371cff5ca0f3fb5ad70 /widgets/terminal.go | |
parent | 16c3f0a89309541e36a2de22e91176fd13c67898 (diff) | |
download | aerc-dee0f8938b62d668ed9105c96313fbd8b8bbd098.tar.gz |
Add :term-close
Diffstat (limited to 'widgets/terminal.go')
-rw-r--r-- | widgets/terminal.go | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/widgets/terminal.go b/widgets/terminal.go index bd84ab46..7726273b 100644 --- a/widgets/terminal.go +++ b/widgets/terminal.go @@ -20,12 +20,14 @@ type Terminal struct { cursorPos vterm.Pos cursorShown bool damage []vterm.Rect + err error focus bool onInvalidate func(d ui.Drawable) pty *os.File start chan interface{} vterm *vterm.VTerm + OnClose func(err error) OnTitle func(title string) } @@ -41,11 +43,11 @@ func NewTerminal(cmd *exec.Cmd) (*Terminal, error) { for { n, err := term.pty.Read(buf) if err != nil { - term.Close() + term.Close(err) } n, err = term.vterm.Write(buf[:n]) if err != nil { - term.Close() + term.Close(err) } term.Invalidate() } @@ -79,14 +81,24 @@ func NewTerminal(cmd *exec.Cmd) (*Terminal, error) { return term, nil } -func (term *Terminal) Close() { - if term.closed { - return +func (term *Terminal) Close(err error) { + term.err = err + if term.vterm != nil { + term.vterm.Close() + term.vterm = nil + } + if term.pty != nil { + term.pty.Close() + term.pty = nil + } + if term.cmd != nil && term.cmd.Process != nil { + term.cmd.Process.Kill() + term.cmd = nil + } + if !term.closed && term.OnClose != nil { + term.OnClose(err) } term.closed = true - term.vterm.Close() - term.pty.Close() - term.cmd.Process.Kill() } func (term *Terminal) OnInvalidate(cb func(d ui.Drawable)) { @@ -100,6 +112,15 @@ func (term *Terminal) Invalidate() { } func (term *Terminal) Draw(ctx *ui.Context) { + if term.closed { + if term.err != nil { + ui.NewText(term.err.Error()).Strategy(ui.TEXT_CENTER).Draw(ctx) + } else { + ui.NewText("Terminal closed").Strategy(ui.TEXT_CENTER).Draw(ctx) + } + return + } + winsize := pty.Winsize{ Cols: uint16(ctx.Width()), Rows: uint16(ctx.Height()), @@ -110,16 +131,13 @@ func (term *Terminal) Draw(ctx *ui.Context) { tty, err := pty.StartWithSize(term.cmd, &winsize) term.pty = tty if err != nil { - term.Close() + term.Close(err) return } term.start <- nil } term.ctx = ctx // gross - if term.closed { - return - } rows, cols, err := pty.Getsize(term.pty) if err != nil { |