summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/jesseduffield/gocui/gui.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/jesseduffield/gocui/gui.go')
-rw-r--r--vendor/github.com/jesseduffield/gocui/gui.go172
1 files changed, 95 insertions, 77 deletions
diff --git a/vendor/github.com/jesseduffield/gocui/gui.go b/vendor/github.com/jesseduffield/gocui/gui.go
index 3bc701299..c2306c194 100644
--- a/vendor/github.com/jesseduffield/gocui/gui.go
+++ b/vendor/github.com/jesseduffield/gocui/gui.go
@@ -6,7 +6,6 @@ package gocui
import (
standardErrors "errors"
- "fmt"
"log"
"runtime"
"strings"
@@ -76,6 +75,8 @@ type GuiMutexes struct {
tickingMutex sync.Mutex
ViewsMutex sync.Mutex
+
+ drawMutex sync.Mutex
}
type PlayMode int
@@ -166,14 +167,14 @@ type Gui struct {
}
// NewGui returns a new Gui object with a given output mode.
-func NewGui(mode OutputMode, supportOverlaps bool, playMode PlayMode, headless bool) (*Gui, error) {
+func NewGui(mode OutputMode, supportOverlaps bool, playMode PlayMode, headless bool, runeReplacements map[rune]string) (*Gui, error) {
g := &Gui{}
var err error
if headless {
err = g.tcellInitSimulation()
} else {
- err = g.tcellInit()
+ err = g.tcellInit(runeReplacements)
}
if err != nil {
return nil, err
@@ -664,79 +665,6 @@ func (g *Gui) onResize() {
// g.screen.Sync()
}
-// flush updates the gui, re-drawing frames and buffers.
-func (g *Gui) flush() error {
- // pretty sure we don't need this, but keeping it here in case we get weird visual artifacts
- // g.clear(g.FgColor, g.BgColor)
-
- maxX, maxY := Screen.Size()
- // if GUI's size has changed, we need to redraw all views
- if maxX != g.maxX || maxY != g.maxY {
- for _, v := range g.views {
- v.clearViewLines()
- }
- }
- g.maxX, g.maxY = maxX, maxY
-
- for _, m := range g.managers {
- if err := m.Layout(g); err != nil {
- return err
- }
- }
- for _, v := range g.views {
- if !v.Visible || v.y1 < v.y0 {
- continue
- }
- if v.Frame {
- var fgColor, bgColor, frameColor Attribute
- if g.Highlight && v == g.currentView {
- fgColor = g.SelFgColor
- bgColor = g.SelBgColor
- frameColor = g.SelFrameColor
- } else {
- bgColor = g.BgColor
- if v.TitleColor != ColorDefault {
- fgColor = v.TitleColor
- } else {
- fgColor = g.FgColor
- }
- if v.FrameColor != ColorDefault {
- frameColor = v.FrameColor
- } else {
- frameColor = g.FrameColor
- }
- }
-
- if err := g.drawFrameEdges(v, frameColor, bgColor); err != nil {
- return err
- }
- if err := g.drawFrameCorners(v, frameColor, bgColor); err != nil {
- return err
- }
- if v.Title != "" || len(v.Tabs) > 0 {
- if err := g.drawTitle(v, fgColor, bgColor); err != nil {
- return err
- }
- }
- if v.Subtitle != "" {
- if err := g.drawSubtitle(v, fgColor, bgColor); err != nil {
- return err
- }
- }
- if v.ContainsList && g.ShowListFooter {
- if err := g.drawListFooter(v, fgColor, bgColor); err != nil {
- return err
- }
- }
- }
- if err := g.draw(v); err != nil {
- return err
- }
- }
- Screen.Show()
- return nil
-}
-
func (g *Gui) clear(fg, bg Attribute) (int, int) {
st := getTcellStyle(oldStyle{fg: fg, bg: bg, outputMode: g.outputMode})
w, h := Screen.Size()
@@ -983,7 +911,7 @@ func (g *Gui) drawListFooter(v *View, fgColor, bgColor Attribute) error {
return nil
}
- message := fmt.Sprintf("%d of %d", v.cy+v.oy+1, len(v.lines))
+ message := v.Footer
if v.y1 < 0 || v.y1 >= g.maxY {
return nil
@@ -1006,12 +934,102 @@ func (g *Gui) drawListFooter(v *View, fgColor, bgColor Attribute) error {
return nil
}
+// flush updates the gui, re-drawing frames and buffers.
+func (g *Gui) flush() error {
+ g.Mutexes.drawMutex.Lock()
+ defer g.Mutexes.drawMutex.Unlock()
+
+ // pretty sure we don't need this, but keeping it here in case we get weird visual artifacts
+ // g.clear(g.FgColor, g.BgColor)
+
+ maxX, maxY := Screen.Size()
+ // if GUI's size has changed, we need to redraw all views
+ if maxX != g.maxX || maxY != g.maxY {
+ for _, v := range g.views {
+ v.clearViewLines()
+ }
+ }
+ g.maxX, g.maxY = maxX, maxY
+
+ for _, m := range g.managers {
+ if err := m.Layout(g); err != nil {
+ return err
+ }
+ }
+ for _, v := range g.views {
+ if err := g.draw(v); err != nil {
+ return err
+ }
+ }
+
+ Screen.Show()
+ return nil
+}
+
+func (g *Gui) Draw(v *View) error {
+ g.Mutexes.drawMutex.Lock()
+ defer g.Mutexes.drawMutex.Unlock()
+
+ if err := g.draw(v); err != nil {
+ return err
+ }
+
+ Screen.Show()
+ return nil
+}
+
// draw manages the cursor and calls the draw function of a view.
func (g *Gui) draw(v *View) error {
if g.suspended {
return nil
}
+ if !v.Visible || v.y1 < v.y0 {
+ return nil
+ }
+ if v.Frame {
+ var fgColor, bgColor, frameColor Attribute
+ if g.Highlight && v == g.currentView {
+ fgColor = g.SelFgColor
+ bgColor = g.SelBgColor
+ frameColor = g.SelFrameColor
+ } else {
+ bgColor = g.BgColor
+ if v.TitleColor != ColorDefault {
+ fgColor = v.TitleColor
+ } else {
+ fgColor = g.FgColor
+ }
+ if v.FrameColor != ColorDefault {
+ frameColor = v.FrameColor
+ } else {
+ frameColor = g.FrameColor
+ }
+ }
+
+ if err := g.drawFrameEdges(v, frameColor, bgColor); err != nil {
+ return err
+ }
+ if err := g.drawFrameCorners(v, frameColor, bgColor); err != nil {
+ return err
+ }
+ if v.Title != "" || len(v.Tabs) > 0 {
+ if err := g.drawTitle(v, fgColor, bgColor); err != nil {
+ return err
+ }
+ }
+ if v.Subtitle != "" {
+ if err := g.drawSubtitle(v, fgColor, bgColor); err != nil {
+ return err
+ }
+ }
+ if v.Footer != "" && g.ShowListFooter {
+ if err := g.drawListFooter(v, fgColor, bgColor); err != nil {
+ return err
+ }
+ }
+ }
+
if g.Cursor {
if curview := g.currentView; curview != nil {
vMaxX, vMaxY := curview.Size()