summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--aerc.go3
-rw-r--r--commands/compose/compose.go16
-rw-r--r--commands/compose/next-field.go30
-rw-r--r--lib/ui/textinput.go6
-rw-r--r--widgets/compose.go17
-rw-r--r--widgets/terminal.go3
6 files changed, 70 insertions, 5 deletions
diff --git a/aerc.go b/aerc.go
index 978d448..f3607bb 100644
--- a/aerc.go
+++ b/aerc.go
@@ -12,6 +12,7 @@ import (
 	"git.sr.ht/~sircmpwn/aerc2/config"
 	"git.sr.ht/~sircmpwn/aerc2/commands"
 	"git.sr.ht/~sircmpwn/aerc2/commands/account"
+	"git.sr.ht/~sircmpwn/aerc2/commands/compose"
 	"git.sr.ht/~sircmpwn/aerc2/commands/msgview"
 	"git.sr.ht/~sircmpwn/aerc2/commands/terminal"
 	libui "git.sr.ht/~sircmpwn/aerc2/lib/ui"
@@ -27,7 +28,7 @@ func getCommands(selected libui.Drawable) []*commands.Commands {
 		}
 	case *widgets.Composer:
 		return []*commands.Commands{
-			// TODO: compose-specific commands
+			compose.ComposeCommands,
 			commands.GlobalCommands,
 		}
 	case *widgets.MessageViewer:
diff --git a/commands/compose/compose.go b/commands/compose/compose.go
new file mode 100644
index 0000000..ea53316
--- /dev/null
+++ b/commands/compose/compose.go
@@ -0,0 +1,16 @@
+package compose
+
+import (
+	"git.sr.ht/~sircmpwn/aerc2/commands"
+)
+
+var (
+	ComposeCommands *commands.Commands
+)
+
+func register(name string, cmd commands.AercCommand) {
+	if ComposeCommands == nil {
+		ComposeCommands = commands.NewCommands()
+	}
+	ComposeCommands.Register(name, cmd)
+}
diff --git a/commands/compose/next-field.go b/commands/compose/next-field.go
new file mode 100644
index 0000000..2c3b414
--- /dev/null
+++ b/commands/compose/next-field.go
@@ -0,0 +1,30 @@
+package compose
+
+import (
+	"errors"
+	"fmt"
+
+	"git.sr.ht/~sircmpwn/aerc2/widgets"
+)
+
+func init() {
+	register("next-field", NextPrevField)
+	register("prev-field", NextPrevField)
+}
+
+func nextPrevFieldUsage(cmd string) error {
+	return errors.New(fmt.Sprintf("Usage: %s", cmd))
+}
+
+func NextPrevField(aerc *widgets.Aerc, args []string) error {
+	if len(args) > 2 {
+		return nextPrevFieldUsage(args[0])
+	}
+	composer, _ := aerc.SelectedTab().(*widgets.Composer)
+	if args[0] == "prev-field" {
+		composer.PrevField()
+	} else {
+		composer.NextField()
+	}
+	return nil
+}
diff --git a/lib/ui/textinput.go b/lib/ui/textinput.go
index 3e1f68a..688d91d 100644
--- a/lib/ui/textinput.go
+++ b/lib/ui/textinput.go
@@ -47,9 +47,9 @@ func (ti *TextInput) Draw(ctx *Context) {
 	ti.ctx = ctx // gross
 	ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)
 	ctx.Printf(0, 0, tcell.StyleDefault, "%s%s", ti.prompt, string(ti.text))
-	cells := runewidth.StringWidth(string(ti.text[:ti.index]))
-	if cells != ti.cells {
-		ctx.SetCursor(cells+1, 0)
+	cells := runewidth.StringWidth(string(ti.text[:ti.index]) + ti.prompt)
+	if cells != ti.cells && ti.focus {
+		ctx.SetCursor(cells, 0)
 	}
 }
 
diff --git a/widgets/compose.go b/widgets/compose.go
index 10d14f7..f07e3ee 100644
--- a/widgets/compose.go
+++ b/widgets/compose.go
@@ -67,7 +67,7 @@ func NewComposer() *Composer {
 		grid:   grid,
 		editor: term,
 		// You have to backtab to get to "From", since you usually don't edit it
-		focused: 3,
+		focused: 1,
 		focusable: []ui.DrawableInteractive{
 			from,
 			to,
@@ -99,6 +99,21 @@ func (c *Composer) Focus(focus bool) {
 	c.focusable[c.focused].Focus(focus)
 }
 
+func (c *Composer) PrevField() {
+	c.focusable[c.focused].Focus(false)
+	c.focused--
+	if c.focused == -1 {
+		c.focused = len(c.focusable) - 1
+	}
+	c.focusable[c.focused].Focus(true)
+}
+
+func (c *Composer) NextField() {
+	c.focusable[c.focused].Focus(false)
+	c.focused = (c.focused + 1) % len(c.focusable)
+	c.focusable[c.focused].Focus(true)
+}
+
 func newHeaderEditor(name string, value string) *headerEditor {
 	return &headerEditor{
 		input: ui.NewTextInput(value),
diff --git a/widgets/terminal.go b/widgets/terminal.go
index 92736d5..ee99b60 100644
--- a/widgets/terminal.go
+++ b/widgets/terminal.go
@@ -273,6 +273,8 @@ func (term *Terminal) Draw(ctx *ui.Context) {
 		if ctx.Width() != cols || ctx.Height() != rows {
 			pty.Setsize(term.pty, &winsize)
 			term.vterm.SetSize(ctx.Height(), ctx.Width())
+			rect := vterm.NewRect(0, ctx.Width(), 0, ctx.Height())
+			term.damage = append(term.damage, *rect)
 			return
 		}
 	}
@@ -333,6 +335,7 @@ func (term *Terminal) Focus(focus bool) {
 			state := term.vterm.ObtainState()
 			row, col := state.GetCursorPos()
 			term.ctx.SetCursor(col, row)
+			term.Invalidate()
 		}
 	}
 }