diff --git a/cmd/micro/micro.go b/cmd/micro/micro.go index f3c6acf1c8..7a3b21717d 100644 --- a/cmd/micro/micro.go +++ b/cmd/micro/micro.go @@ -422,6 +422,7 @@ func DoEvent() { b.AutoSave() } case <-shell.CloseTerms: + action.Tabs.CloseTerms() case event = <-screen.Events: case <-screen.DrawChan(): for len(screen.DrawChan()) > 0 { diff --git a/internal/action/tab.go b/internal/action/tab.go index f5ca7fa466..bde667a3a3 100644 --- a/internal/action/tab.go +++ b/internal/action/tab.go @@ -188,6 +188,17 @@ func (t *TabList) ResetMouse() { } } +// CloseTerms notifies term panes that a terminal job has finished. +func (t *TabList) CloseTerms() { + for _, tab := range t.List { + for _, p := range tab.Panes { + if tp, ok := p.(*TermPane); ok { + tp.HandleTermClose() + } + } + } +} + // Tabs is the global tab list var Tabs *TabList diff --git a/internal/action/termpane.go b/internal/action/termpane.go index 46d14d91f0..6656a2cfdd 100644 --- a/internal/action/termpane.go +++ b/internal/action/termpane.go @@ -159,9 +159,9 @@ func (t *TermPane) HandleEvent(event tcell.Event) { if t.Status != shell.TTDone { t.WriteString(event.EscSeq()) } - } else if e, ok := event.(*tcell.EventMouse); e != nil && (!ok || t.State.Mode(terminal.ModeMouseMask)) { + } else if e, ok := event.(*tcell.EventMouse); !ok || t.State.Mode(terminal.ModeMouseMask) { // t.WriteString(event.EscSeq()) - } else if e != nil { + } else { x, y := e.Position() v := t.GetView() x -= v.X @@ -188,7 +188,12 @@ func (t *TermPane) HandleEvent(event tcell.Event) { t.mouseReleased = true } } +} +// HandleTermClose is called when a terminal has finished its job +// and should be closed. If that terminal is this termpane's terminal, +// HandleTermClose will close the terminal and the termpane itself. +func (t *TermPane) HandleTermClose() { if t.Status == shell.TTClose { t.Quit() }