Wrap Terminal in TermHost

This commit is contained in:
Drew DeVault 2019-03-17 17:39:22 -04:00
parent dee0f8938b
commit 60b17c473a
5 changed files with 64 additions and 20 deletions

View file

@ -3,7 +3,6 @@ package commands
import ( import (
"errors" "errors"
"git.sr.ht/~sircmpwn/aerc2/lib/ui"
"git.sr.ht/~sircmpwn/aerc2/widgets" "git.sr.ht/~sircmpwn/aerc2/widgets"
) )
@ -15,15 +14,10 @@ func TermClose(aerc *widgets.Aerc, args []string) error {
if len(args) != 1 { if len(args) != 1 {
return errors.New("Usage: term-close") return errors.New("Usage: term-close")
} }
grid, ok := aerc.SelectedTab().(*ui.Grid) thost, ok := aerc.SelectedTab().(*widgets.TermHost)
if !ok { if !ok {
return errors.New("Error: not a terminal") return errors.New("Error: not a terminal")
} }
for _, child := range grid.Children() { thost.Terminal().Close(nil)
if term, ok := child.(*widgets.Terminal); ok { return nil
term.Close(nil)
return nil
}
}
return errors.New("Error: not a terminal")
} }

View file

@ -4,7 +4,6 @@ import (
"os/exec" "os/exec"
"time" "time"
"git.sr.ht/~sircmpwn/aerc2/lib/ui"
"git.sr.ht/~sircmpwn/aerc2/widgets" "git.sr.ht/~sircmpwn/aerc2/widgets"
"github.com/gdamore/tcell" "github.com/gdamore/tcell"
@ -27,14 +26,8 @@ func Term(aerc *widgets.Aerc, args []string) error {
if err != nil { if err != nil {
return err return err
} }
grid := ui.NewGrid().Rows([]ui.GridSpec{ host := widgets.NewTermHost(term, aerc.Config())
{ui.SIZE_WEIGHT, 1}, tab := aerc.NewTab(host, args[1])
}).Columns([]ui.GridSpec{
{ui.SIZE_EXACT, aerc.Config().Ui.SidebarWidth},
{ui.SIZE_WEIGHT, 1},
})
grid.AddChild(term).At(0, 1)
tab := aerc.NewTab(grid, args[1])
term.OnTitle = func(title string) { term.OnTitle = func(title string) {
if title == "" { if title == "" {
title = args[1] title = args[1]
@ -43,7 +36,7 @@ func Term(aerc *widgets.Aerc, args []string) error {
tab.Content.Invalidate() tab.Content.Invalidate()
} }
term.OnClose = func(err error) { term.OnClose = func(err error) {
aerc.RemoveTab(grid) aerc.RemoveTab(host)
if err != nil { if err != nil {
aerc.PushStatus(" "+err.Error(), 10*time.Second). aerc.PushStatus(" "+err.Error(), 10*time.Second).
Color(tcell.ColorRed, tcell.ColorWhite) Color(tcell.ColorRed, tcell.ColorWhite)

View file

@ -122,6 +122,11 @@ func (aerc *Aerc) Event(event tcell.Event) bool {
aerc.BeginExCommand() aerc.BeginExCommand()
return true return true
} }
interactive, ok := aerc.tabs.Tabs[aerc.tabs.Selected].Content.(ui.Interactive)
if ok {
return interactive.Event(event)
}
return false
} }
} }
return false return false

52
widgets/termhost.go Normal file
View file

@ -0,0 +1,52 @@
package widgets
import (
"github.com/gdamore/tcell"
"git.sr.ht/~sircmpwn/aerc2/config"
"git.sr.ht/~sircmpwn/aerc2/lib/ui"
)
type TermHost struct {
grid *ui.Grid
term *Terminal
}
// Thin wrapper around terminal which puts it in a grid and passes through
// input events. A bit of a hack tbh
func NewTermHost(term *Terminal, conf *config.AercConfig) *TermHost {
grid := ui.NewGrid().Rows([]ui.GridSpec{
{ui.SIZE_WEIGHT, 1},
}).Columns([]ui.GridSpec{
{ui.SIZE_EXACT, conf.Ui.SidebarWidth},
{ui.SIZE_WEIGHT, 1},
})
grid.AddChild(term).At(0, 1)
return &TermHost{grid, term}
}
func (th *TermHost) Draw(ctx *ui.Context) {
th.grid.Draw(ctx)
}
func (th TermHost) Invalidate() {
th.grid.Invalidate()
}
func (th *TermHost) OnInvalidate(fn func(d ui.Drawable)) {
th.grid.OnInvalidate(func(_ ui.Drawable) {
fn(th)
})
}
func (th *TermHost) Event(event tcell.Event) bool {
return th.term.Event(event)
}
func (th *TermHost) Focus(focus bool) {
th.term.Focus(focus)
}
func (th *TermHost) Terminal() *Terminal {
return th.term
}

View file

@ -1,6 +1,7 @@
package widgets package widgets
import ( import (
"fmt"
gocolor "image/color" gocolor "image/color"
"os" "os"
"os/exec" "os/exec"
@ -188,7 +189,6 @@ func (term *Terminal) Focus(focus bool) {
} }
func (term *Terminal) Event(event tcell.Event) bool { func (term *Terminal) Event(event tcell.Event) bool {
// TODO
return false return false
} }