aboutsummaryrefslogtreecommitdiff
path: root/widgets/terminal.go
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2019-03-17 17:23:53 -0400
committerDrew DeVault <sir@cmpwn.com>2019-03-17 17:23:53 -0400
commitdee0f8938b62d668ed9105c96313fbd8b8bbd098 (patch)
tree2a6d9f1a427d7c4c4dabd371cff5ca0f3fb5ad70 /widgets/terminal.go
parent16c3f0a89309541e36a2de22e91176fd13c67898 (diff)
Add :term-close
Diffstat (limited to 'widgets/terminal.go')
-rw-r--r--widgets/terminal.go42
1 files changed, 30 insertions, 12 deletions
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 {