termui: use a forked gocui to fix large character handling

Michael Muré created

Change summary

Gopkg.lock                                        | 18 +++++-----
Gopkg.toml                                        |  2 
termui/bug_table.go                               |  2 
termui/input_popup.go                             |  2 
termui/label_select.go                            |  2 
termui/msg_popup.go                               |  2 
termui/show_bug.go                                |  2 
termui/termui.go                                  |  2 
vendor/github.com/MichaelMure/gocui/.gitignore    |  0 
vendor/github.com/MichaelMure/gocui/AUTHORS       |  0 
vendor/github.com/MichaelMure/gocui/LICENSE       |  0 
vendor/github.com/MichaelMure/gocui/README.md     |  0 
vendor/github.com/MichaelMure/gocui/attribute.go  |  0 
vendor/github.com/MichaelMure/gocui/doc.go        |  0 
vendor/github.com/MichaelMure/gocui/edit.go       | 27 ++++++++++------
vendor/github.com/MichaelMure/gocui/escape.go     |  0 
vendor/github.com/MichaelMure/gocui/gui.go        |  0 
vendor/github.com/MichaelMure/gocui/keybinding.go |  0 
vendor/github.com/MichaelMure/gocui/view.go       |  3 +
19 files changed, 34 insertions(+), 28 deletions(-)

Detailed changes

Gopkg.lock 🔗

@@ -19,6 +19,14 @@
   revision = "3a7f37c7e22a8fedce430c4d340ad5c1351198f4"
   version = "v0.7.1"
 
+[[projects]]
+  branch = "master"
+  digest = "1:38a84d9b4cf50b3e8eb2b54f218413ac163076e3a7763afe5fa15a4eb15fbda6"
+  name = "github.com/MichaelMure/gocui"
+  packages = ["."]
+  pruneopts = "UT"
+  revision = "d753c235dd8582d55e99bbb7f7fe453fb3fd3a19"
+
 [[projects]]
   digest = "1:897d91c431ce469d35a5e6030e60e617dccd9a0e95bdffa6a80594f5c5800d29"
   name = "github.com/agnivade/levenshtein"
@@ -155,14 +163,6 @@
   revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
   version = "v1.0"
 
-[[projects]]
-  branch = "master"
-  digest = "1:114ecad51af93a73ae6781fd0d0bc28e52b433c852b84ab4b4c109c15e6c6b6d"
-  name = "github.com/jroimartin/gocui"
-  packages = ["."]
-  pruneopts = "UT"
-  revision = "c055c87ae801372cd74a0839b972db4f7697ae5f"
-
 [[projects]]
   digest = "1:c658e84ad3916da105a761660dcaeb01e63416c8ec7bc62256a9b411a05fcd67"
   name = "github.com/mattn/go-colorable"
@@ -462,13 +462,13 @@
     "github.com/99designs/gqlgen/graphql",
     "github.com/99designs/gqlgen/graphql/introspection",
     "github.com/99designs/gqlgen/handler",
+    "github.com/MichaelMure/gocui",
     "github.com/cheekybits/genny/generic",
     "github.com/dustin/go-humanize",
     "github.com/fatih/color",
     "github.com/go-test/deep",
     "github.com/gorilla/mux",
     "github.com/icrowley/fake",
-    "github.com/jroimartin/gocui",
     "github.com/phayes/freeport",
     "github.com/pkg/errors",
     "github.com/shurcooL/githubv4",

Gopkg.toml 🔗

@@ -61,5 +61,5 @@
   version = "0.7.1"
 
 [[constraint]]
-  name = "github.com/jroimartin/gocui"
+  name = "github.com/MichaelMure/gocui"
   branch = "master"

termui/bug_table.go 🔗

@@ -8,8 +8,8 @@ import (
 	"github.com/MichaelMure/git-bug/cache"
 	"github.com/MichaelMure/git-bug/util/colors"
 	"github.com/MichaelMure/git-bug/util/text"
+	"github.com/MichaelMure/gocui"
 	"github.com/dustin/go-humanize"
-	"github.com/jroimartin/gocui"
 )
 
 const bugTableView = "bugTableView"

termui/input_popup.go 🔗

@@ -3,7 +3,7 @@ package termui
 import (
 	"io/ioutil"
 
-	"github.com/jroimartin/gocui"
+	"github.com/MichaelMure/gocui"
 )
 
 const inputPopupView = "inputPopupView"

termui/label_select.go 🔗

@@ -6,7 +6,7 @@ import (
 
 	"github.com/MichaelMure/git-bug/bug"
 	"github.com/MichaelMure/git-bug/cache"
-	"github.com/jroimartin/gocui"
+	"github.com/MichaelMure/gocui"
 )
 
 const labelSelectView = "labelSelectView"

termui/msg_popup.go 🔗

@@ -4,7 +4,7 @@ import (
 	"fmt"
 
 	"github.com/MichaelMure/git-bug/util/text"
-	"github.com/jroimartin/gocui"
+	"github.com/MichaelMure/gocui"
 )
 
 const msgPopupView = "msgPopupView"

termui/show_bug.go 🔗

@@ -10,7 +10,7 @@ import (
 	"github.com/MichaelMure/git-bug/util/colors"
 	"github.com/MichaelMure/git-bug/util/git"
 	"github.com/MichaelMure/git-bug/util/text"
-	"github.com/jroimartin/gocui"
+	"github.com/MichaelMure/gocui"
 )
 
 const showBugView = "showBugView"

termui/termui.go 🔗

@@ -5,7 +5,7 @@ import (
 	"github.com/MichaelMure/git-bug/cache"
 	"github.com/MichaelMure/git-bug/input"
 	"github.com/MichaelMure/git-bug/util/git"
-	"github.com/jroimartin/gocui"
+	"github.com/MichaelMure/gocui"
 	"github.com/pkg/errors"
 )
 

vendor/github.com/jroimartin/gocui/edit.go → vendor/github.com/MichaelMure/gocui/edit.go 🔗

@@ -4,7 +4,11 @@
 
 package gocui
 
-import "errors"
+import (
+	"errors"
+
+	"github.com/mattn/go-runewidth"
+)
 
 const maxInt = int(^uint(0) >> 1)
 
@@ -55,7 +59,7 @@ func simpleEditor(v *View, key Key, ch rune, mod Modifier) {
 // EditWrite writes a rune at the cursor position.
 func (v *View) EditWrite(ch rune) {
 	v.writeRune(v.cx, v.cy, ch)
-	v.MoveCursor(1, 0, true)
+	v.MoveCursor(runewidth.RuneWidth(ch), 0, true)
 }
 
 // EditDelete deletes a rune at the cursor position. back determines the
@@ -89,12 +93,12 @@ func (v *View) EditDelete(back bool) {
 					v.MoveCursor(-1, 0, true)
 				}
 			} else { // wrapped line
-				v.deleteRune(len(v.viewLines[y-1].line)-1, v.cy-1)
-				v.MoveCursor(-1, 0, true)
+				ch, _ := v.deleteRune(len(v.viewLines[y-1].line)-1, v.cy-1)
+				v.MoveCursor(0-runewidth.RuneWidth(ch), 0, true)
 			}
 		} else { // middle/end of the line
-			v.deleteRune(v.cx-1, v.cy)
-			v.MoveCursor(-1, 0, true)
+			ch, _ := v.deleteRune(v.cx-1, v.cy)
+			v.MoveCursor(0-runewidth.RuneWidth(ch), 0, true)
 		}
 	} else {
 		if x == len(v.viewLines[y].line) { // end of the line
@@ -275,19 +279,20 @@ func (v *View) writeRune(x, y int, ch rune) error {
 
 // deleteRune removes a rune from the view's internal buffer, at the
 // position corresponding to the point (x, y).
-func (v *View) deleteRune(x, y int) error {
+func (v *View) deleteRune(x, y int) (ch rune, err error) {
 	v.tainted = true
 
-	x, y, err := v.realPosition(x, y)
+	x, y, err = v.realPosition(x, y)
 	if err != nil {
-		return err
+		return 0, err
 	}
 
 	if x < 0 || y < 0 || y >= len(v.lines) || x >= len(v.lines[y]) {
-		return errors.New("invalid point")
+		return 0, errors.New("invalid point")
 	}
+	chx := v.lines[y][x]
 	v.lines[y] = append(v.lines[y][:x], v.lines[y][x+1:]...)
-	return nil
+	return chx.chr, nil
 }
 
 // mergeLines merges the lines "y" and "y+1" if possible.

vendor/github.com/jroimartin/gocui/view.go → vendor/github.com/MichaelMure/gocui/view.go 🔗

@@ -10,6 +10,7 @@ import (
 	"io"
 	"strings"
 
+	"github.com/mattn/go-runewidth"
 	"github.com/nsf/termbox-go"
 )
 
@@ -353,7 +354,7 @@ func (v *View) draw() error {
 			if err := v.setRune(x, y, c.chr, fgColor, bgColor); err != nil {
 				return err
 			}
-			x++
+			x += runewidth.RuneWidth(c.chr)
 		}
 		y++
 	}