Handle terminal title, login shell
This commit is contained in:
parent
14cb8cb51f
commit
16c3f0a893
|
@ -1,11 +1,12 @@
|
||||||
package commands
|
package commands
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
|
||||||
"git.sr.ht/~sircmpwn/aerc2/lib/ui"
|
"git.sr.ht/~sircmpwn/aerc2/lib/ui"
|
||||||
"git.sr.ht/~sircmpwn/aerc2/widgets"
|
"git.sr.ht/~sircmpwn/aerc2/widgets"
|
||||||
|
|
||||||
|
"github.com/riywo/loginshell"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -13,8 +14,12 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func Term(aerc *widgets.Aerc, args []string) error {
|
func Term(aerc *widgets.Aerc, args []string) error {
|
||||||
if len(args) > 2 {
|
if len(args) == 1 {
|
||||||
return errors.New("Usage: term [<command>]")
|
shell, err := loginshell.Shell()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
args = append(args, shell)
|
||||||
}
|
}
|
||||||
term, err := widgets.NewTerminal(exec.Command(args[1], args[2:]...))
|
term, err := widgets.NewTerminal(exec.Command(args[1], args[2:]...))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -27,7 +32,13 @@ func Term(aerc *widgets.Aerc, args []string) error {
|
||||||
{ui.SIZE_WEIGHT, 1},
|
{ui.SIZE_WEIGHT, 1},
|
||||||
})
|
})
|
||||||
grid.AddChild(term).At(0, 1)
|
grid.AddChild(term).At(0, 1)
|
||||||
aerc.NewTab(grid, "Terminal")
|
tab := aerc.NewTab(grid, "Terminal")
|
||||||
// TODO: update tab name when child process changes it
|
term.OnTitle = func(title string) {
|
||||||
|
if title == "" {
|
||||||
|
title = "Terminal"
|
||||||
|
}
|
||||||
|
tab.Name = title
|
||||||
|
tab.Content.Invalidate()
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,7 +126,7 @@ h = :prev-tab<Enter>
|
||||||
d = :confirm 'Really delete this message?' ':delete-message<Enter>'<Enter>
|
d = :confirm 'Really delete this message?' ':delete-message<Enter>'<Enter>
|
||||||
|
|
||||||
c = :cf<space>
|
c = :cf<space>
|
||||||
$ = :term-exec
|
$ = :term<space>
|
||||||
|
|
||||||
[mbinds]
|
[mbinds]
|
||||||
#
|
#
|
||||||
|
|
3
go.mod
3
go.mod
|
@ -1,7 +1,7 @@
|
||||||
module git.sr.ht/~sircmpwn/aerc2
|
module git.sr.ht/~sircmpwn/aerc2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190316225658-2a4963dd9ec0
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190317210455-72d6c2838fbe
|
||||||
github.com/emersion/go-imap v1.0.0-beta.1
|
github.com/emersion/go-imap v1.0.0-beta.1
|
||||||
github.com/emersion/go-imap-idle v0.0.0-20180114101550-2af93776db6b
|
github.com/emersion/go-imap-idle v0.0.0-20180114101550-2af93776db6b
|
||||||
github.com/emersion/go-sasl v0.0.0-20161116183048-7e096a0a6197 // indirect
|
github.com/emersion/go-sasl v0.0.0-20161116183048-7e096a0a6197 // indirect
|
||||||
|
@ -16,6 +16,7 @@ require (
|
||||||
github.com/mattn/go-runewidth v0.0.2
|
github.com/mattn/go-runewidth v0.0.2
|
||||||
github.com/mitchellh/go-homedir v1.1.0
|
github.com/mitchellh/go-homedir v1.1.0
|
||||||
github.com/nsf/termbox-go v0.0.0-20180129072728-88b7b944be8b
|
github.com/nsf/termbox-go v0.0.0-20180129072728-88b7b944be8b
|
||||||
|
github.com/riywo/loginshell v0.0.0-20181227004642-c2f4167b2303
|
||||||
github.com/stretchr/testify v1.3.0
|
github.com/stretchr/testify v1.3.0
|
||||||
golang.org/x/text v0.3.0
|
golang.org/x/text v0.3.0
|
||||||
)
|
)
|
||||||
|
|
11
go.sum
11
go.sum
|
@ -1,5 +1,13 @@
|
||||||
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190316225658-2a4963dd9ec0 h1:aIQh7m6L3uS8/lg021Cia2QtttUgZO0LuuxJ8wc57dQ=
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190316225658-2a4963dd9ec0 h1:aIQh7m6L3uS8/lg021Cia2QtttUgZO0LuuxJ8wc57dQ=
|
||||||
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190316225658-2a4963dd9ec0/go.mod h1:cp37LbiS1y4CrTOmKSF87ZMLwawWUF612RYKTi8vbDc=
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190316225658-2a4963dd9ec0/go.mod h1:cp37LbiS1y4CrTOmKSF87ZMLwawWUF612RYKTi8vbDc=
|
||||||
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190317204448-1089ad765386 h1:3Zw5LLe4S7iyeZZsuDPyMPKalUvD8//FBdO7uSlB+s0=
|
||||||
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190317204448-1089ad765386/go.mod h1:cp37LbiS1y4CrTOmKSF87ZMLwawWUF612RYKTi8vbDc=
|
||||||
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190317205821-0763add02731 h1:/TF+apPakaqSpg2co0zXsndxeYQODhCbyGxlGpVeEhw=
|
||||||
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190317205821-0763add02731/go.mod h1:hT88+cTemwwESbMptwC7O33qrJfQX0SgRWbXlndUS2c=
|
||||||
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190317205953-0674b071e8bf h1:6Ynr+M6lUnkIxi8ONNmDn6dbyBTt1PawA6sT39S7i/8=
|
||||||
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190317205953-0674b071e8bf/go.mod h1:hT88+cTemwwESbMptwC7O33qrJfQX0SgRWbXlndUS2c=
|
||||||
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190317210455-72d6c2838fbe h1:pg73OOcg6PZp+XUOsFaqGG4Heu3kYAJZHSaS6eRRmJk=
|
||||||
|
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190317210455-72d6c2838fbe/go.mod h1:hT88+cTemwwESbMptwC7O33qrJfQX0SgRWbXlndUS2c=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/emersion/go-imap v1.0.0-beta.1 h1:bTCaVlUnb5mKoW9lEukusxguSYYZPer+q0g5t+vw5X0=
|
github.com/emersion/go-imap v1.0.0-beta.1 h1:bTCaVlUnb5mKoW9lEukusxguSYYZPer+q0g5t+vw5X0=
|
||||||
|
@ -39,8 +47,11 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk
|
||||||
github.com/nsf/termbox-go v0.0.0-20180129072728-88b7b944be8b/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ=
|
github.com/nsf/termbox-go v0.0.0-20180129072728-88b7b944be8b/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/riywo/loginshell v0.0.0-20181227004642-c2f4167b2303 h1:iVSzuQeMQqR6xo15tY215nUTBmrgpTq0Qwaw+YEil24=
|
||||||
|
github.com/riywo/loginshell v0.0.0-20181227004642-c2f4167b2303/go.mod h1:/PfPXh0EntGc3QAAyUaviy4S9tzy4Zp0e2ilq4voC6E=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
|
|
@ -96,7 +96,6 @@ func (aerc *Aerc) Draw(ctx *libui.Context) {
|
||||||
|
|
||||||
func (aerc *Aerc) Event(event tcell.Event) bool {
|
func (aerc *Aerc) Event(event tcell.Event) bool {
|
||||||
if aerc.focused != nil {
|
if aerc.focused != nil {
|
||||||
aerc.logger.Println("sending event to focused child")
|
|
||||||
return aerc.focused.Event(event)
|
return aerc.focused.Event(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,8 @@ type Terminal struct {
|
||||||
pty *os.File
|
pty *os.File
|
||||||
start chan interface{}
|
start chan interface{}
|
||||||
vterm *vterm.VTerm
|
vterm *vterm.VTerm
|
||||||
|
|
||||||
|
OnTitle func(title string)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTerminal(cmd *exec.Cmd) (*Terminal, error) {
|
func NewTerminal(cmd *exec.Cmd) (*Terminal, error) {
|
||||||
|
@ -51,6 +53,7 @@ func NewTerminal(cmd *exec.Cmd) (*Terminal, error) {
|
||||||
screen := term.vterm.ObtainScreen()
|
screen := term.vterm.ObtainScreen()
|
||||||
screen.OnDamage = term.onDamage
|
screen.OnDamage = term.onDamage
|
||||||
screen.OnMoveCursor = term.onMoveCursor
|
screen.OnMoveCursor = term.onMoveCursor
|
||||||
|
screen.OnSetTermProp = term.onSetTermProp
|
||||||
screen.Reset(true)
|
screen.Reset(true)
|
||||||
|
|
||||||
state := term.vterm.ObtainState()
|
state := term.vterm.ObtainState()
|
||||||
|
@ -231,3 +234,13 @@ func (term *Terminal) onMoveCursor(old *vterm.Pos,
|
||||||
term.resetCursor()
|
term.resetCursor()
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (term *Terminal) onSetTermProp(prop int, val *vterm.VTermValue) int {
|
||||||
|
switch prop {
|
||||||
|
case vterm.VTERM_PROP_TITLE:
|
||||||
|
if term.OnTitle != nil {
|
||||||
|
term.OnTitle(val.String)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue