about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/ui/context.go17
-rw-r--r--widgets/exline.go12
2 files changed, 18 insertions, 11 deletions
diff --git a/lib/ui/context.go b/lib/ui/context.go
index d7796bf..d450fd8 100644
--- a/lib/ui/context.go
+++ b/lib/ui/context.go
@@ -10,7 +10,9 @@ import (
 
 // A context allows you to draw in a sub-region of the terminal
 type Context struct {
+	screen   tcell.Screen
 	viewport *views.ViewPort
+	x, y     int
 }
 
 func (ctx *Context) X() int {
@@ -35,7 +37,7 @@ func (ctx *Context) Height() int {
 
 func NewContext(width, height int, screen tcell.Screen) *Context {
 	vp := views.NewViewPort(screen, 0, 0, width, height)
-	return &Context{vp}
+	return &Context{screen, vp, 0, 0}
 }
 
 func (ctx *Context) Subcontext(x, y, width, height int) *Context {
@@ -47,7 +49,7 @@ func (ctx *Context) Subcontext(x, y, width, height int) *Context {
 		panic(fmt.Errorf("Attempted to create context larger than parent"))
 	}
 	vp := views.NewViewPort(ctx.viewport, x, y, width, height)
-	return &Context{vp}
+	return &Context{ctx.screen, vp, ctx.x + x, ctx.y + y}
 }
 
 func (ctx *Context) SetCell(x, y int, ch rune, style tcell.Style) {
@@ -105,10 +107,9 @@ func (ctx *Context) Fill(x, y, width, height int, rune rune, style tcell.Style)
 }
 
 func (ctx *Context) SetCursor(x, y int) {
-	// FIXME: Cursor needs to be set on tcell.Screen, or layout has to
-	// provide a CellModel
-	// cv := views.NewCellView()
-	// cv.Init()
-	// cv.SetView(ctx.viewport)
-	// cv.SetCursor(x, y)
+	ctx.screen.ShowCursor(ctx.x+x, ctx.y+y)
+}
+
+func (ctx *Context) HideCursor() {
+	ctx.screen.HideCursor()
 }
diff --git a/widgets/exline.go b/widgets/exline.go
index ae83933..e0954d7 100644
--- a/widgets/exline.go
+++ b/widgets/exline.go
@@ -14,7 +14,9 @@ import (
 type ExLine struct {
 	command []rune
 	commit  func(cmd string)
+	ctx     *ui.Context
 	cancel  func()
+	cells   int
 	index   int
 	scroll  int
 
@@ -24,6 +26,7 @@ type ExLine struct {
 func NewExLine(commit func(cmd string), cancel func()) *ExLine {
 	return &ExLine{
 		cancel:  cancel,
+		cells:   -1,
 		commit:  commit,
 		command: []rune{},
 	}
@@ -40,10 +43,13 @@ func (ex *ExLine) Invalidate() {
 }
 
 func (ex *ExLine) Draw(ctx *ui.Context) {
+	ex.ctx = ctx // gross
 	ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)
 	ctx.Printf(0, 0, tcell.StyleDefault, ":%s", string(ex.command))
 	cells := runewidth.StringWidth(string(ex.command[:ex.index]))
-	ctx.SetCursor(cells+1, 0)
+	if cells != ex.cells {
+		ctx.SetCursor(cells+1, 0)
+	}
 }
 
 func (ex *ExLine) insert(ch rune) {
@@ -115,10 +121,10 @@ func (ex *ExLine) Event(event tcell.Event) bool {
 		case tcell.KeyCtrlW:
 			ex.deleteWord()
 		case tcell.KeyEnter:
-			//ex.ctx.Screen().HideCursor()
+			ex.ctx.HideCursor()
 			ex.commit(string(ex.command))
 		case tcell.KeyEsc, tcell.KeyCtrlC:
-			//ex.ctx.Screen().HideCursor()
+			ex.ctx.HideCursor()
 			ex.cancel()
 		default:
 			if event.Rune() != 0 {