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 | |
parent | 16c3f0a89309541e36a2de22e91176fd13c67898 (diff) |
Add :term-close
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/aerc.go | 8 | ||||
-rw-r--r-- | widgets/terminal.go | 42 |
2 files changed, 38 insertions, 12 deletions
diff --git a/widgets/aerc.go b/widgets/aerc.go index a968ab1..49a61bd 100644 --- a/widgets/aerc.go +++ b/widgets/aerc.go @@ -139,12 +139,20 @@ func (aerc *Aerc) SelectedAccount() *AccountView { return acct } +func (aerc *Aerc) SelectedTab() ui.Drawable { + return aerc.tabs.Tabs[aerc.tabs.Selected].Content +} + func (aerc *Aerc) NewTab(drawable ui.Drawable, name string) *ui.Tab { tab := aerc.tabs.Add(drawable, name) aerc.tabs.Select(len(aerc.tabs.Tabs) - 1) return tab } +func (aerc *Aerc) RemoveTab(tab ui.Drawable) { + aerc.tabs.Remove(tab) +} + func (aerc *Aerc) NextTab() { next := aerc.tabs.Selected + 1 if next >= len(aerc.tabs.Tabs) { diff --git a/widgets/terminal.go b/widgets/terminal.go index bd84ab4..7726273 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 { |