mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-01-08 04:04:22 +02:00
add mutex to views array
This commit is contained in:
parent
ca105692cf
commit
c12752cf53
2
go.mod
2
go.mod
@ -16,7 +16,7 @@ require (
|
|||||||
github.com/golang/protobuf v1.3.2 // indirect
|
github.com/golang/protobuf v1.3.2 // indirect
|
||||||
github.com/google/go-cmp v0.3.1 // indirect
|
github.com/google/go-cmp v0.3.1 // indirect
|
||||||
github.com/integrii/flaggy v1.4.0
|
github.com/integrii/flaggy v1.4.0
|
||||||
github.com/jesseduffield/gocui v0.3.1-0.20200927010622-b998f1723844
|
github.com/jesseduffield/gocui v0.3.1-0.20200930205305-1b445b9bd5da
|
||||||
github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe // indirect
|
github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe // indirect
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0
|
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
||||||
|
2
go.sum
2
go.sum
@ -100,6 +100,8 @@ github.com/jesseduffield/gocui v0.3.1-0.20200824100831-1b6ec5d7d449 h1:G5Cm2QuFi
|
|||||||
github.com/jesseduffield/gocui v0.3.1-0.20200824100831-1b6ec5d7d449/go.mod h1:2RtZznzYKt8RLRwvFiSkXjU0Ei8WwHdubgnlaYH47dw=
|
github.com/jesseduffield/gocui v0.3.1-0.20200824100831-1b6ec5d7d449/go.mod h1:2RtZznzYKt8RLRwvFiSkXjU0Ei8WwHdubgnlaYH47dw=
|
||||||
github.com/jesseduffield/gocui v0.3.1-0.20200927010622-b998f1723844 h1:D2/gUHscz5LmHojvNUmEVtvNBlX8OF6Ez82oW7GitfI=
|
github.com/jesseduffield/gocui v0.3.1-0.20200927010622-b998f1723844 h1:D2/gUHscz5LmHojvNUmEVtvNBlX8OF6Ez82oW7GitfI=
|
||||||
github.com/jesseduffield/gocui v0.3.1-0.20200927010622-b998f1723844/go.mod h1:2RtZznzYKt8RLRwvFiSkXjU0Ei8WwHdubgnlaYH47dw=
|
github.com/jesseduffield/gocui v0.3.1-0.20200927010622-b998f1723844/go.mod h1:2RtZznzYKt8RLRwvFiSkXjU0Ei8WwHdubgnlaYH47dw=
|
||||||
|
github.com/jesseduffield/gocui v0.3.1-0.20200930205305-1b445b9bd5da h1:I3GD+Set99tj57PgmjZJLoW6lkv0NTHadKNosJ1OKj4=
|
||||||
|
github.com/jesseduffield/gocui v0.3.1-0.20200930205305-1b445b9bd5da/go.mod h1:2RtZznzYKt8RLRwvFiSkXjU0Ei8WwHdubgnlaYH47dw=
|
||||||
github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe h1:qsVhCf2RFyyKIUe/+gJblbCpXMUki9rZrHuEctg6M/E=
|
github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe h1:qsVhCf2RFyyKIUe/+gJblbCpXMUki9rZrHuEctg6M/E=
|
||||||
github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe/go.mod h1:anMibpZtqNxjDbxrcDEAwSdaJ37vyUeM1f/M4uekib4=
|
github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe/go.mod h1:anMibpZtqNxjDbxrcDEAwSdaJ37vyUeM1f/M4uekib4=
|
||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
|
@ -617,6 +617,9 @@ func (gui *Gui) getFocusLayout() func(g *gocui.Gui) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) onViewFocusChange() error {
|
func (gui *Gui) onViewFocusChange() error {
|
||||||
|
gui.g.Mutexes.ViewsMutex.Lock()
|
||||||
|
defer gui.g.Mutexes.ViewsMutex.Unlock()
|
||||||
|
|
||||||
currentView := gui.g.CurrentView()
|
currentView := gui.g.CurrentView()
|
||||||
for _, view := range gui.g.Views() {
|
for _, view := range gui.g.Views() {
|
||||||
view.Highlight = view.Name() != "main" && view == currentView
|
view.Highlight = view.Name() != "main" && view == currentView
|
||||||
|
42
vendor/github.com/jesseduffield/gocui/gui.go
generated
vendored
42
vendor/github.com/jesseduffield/gocui/gui.go
generated
vendored
@ -48,6 +48,14 @@ type tabClickBinding struct {
|
|||||||
handler tabClickHandler
|
handler tabClickHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GuiMutexes struct {
|
||||||
|
// tickingMutex ensures we don't have two loops ticking. The point of 'ticking'
|
||||||
|
// is to refresh the gui rapidly so that loader characters can be animated.
|
||||||
|
tickingMutex sync.Mutex
|
||||||
|
|
||||||
|
ViewsMutex sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
// Gui represents the whole User Interface, including the views, layouts
|
// Gui represents the whole User Interface, including the views, layouts
|
||||||
// and keybindings.
|
// and keybindings.
|
||||||
type Gui struct {
|
type Gui struct {
|
||||||
@ -92,9 +100,7 @@ type Gui struct {
|
|||||||
// view edges
|
// view edges
|
||||||
SupportOverlaps bool
|
SupportOverlaps bool
|
||||||
|
|
||||||
// tickingMutex ensures we don't have two loops ticking. The point of 'ticking'
|
Mutexes GuiMutexes
|
||||||
// is to refresh the gui rapidly so that loader characters can be animated.
|
|
||||||
tickingMutex sync.Mutex
|
|
||||||
|
|
||||||
OnSearchEscape func() error
|
OnSearchEscape func() error
|
||||||
// these keys must either be of type Key of rune
|
// these keys must either be of type Key of rune
|
||||||
@ -192,11 +198,16 @@ func (g *Gui) SetView(name string, x0, y0, x1, y1 int, overlaps byte) (*View, er
|
|||||||
return v, nil
|
return v, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g.Mutexes.ViewsMutex.Lock()
|
||||||
|
|
||||||
v := newView(name, x0, y0, x1, y1, g.outputMode)
|
v := newView(name, x0, y0, x1, y1, g.outputMode)
|
||||||
v.BgColor, v.FgColor = g.BgColor, g.FgColor
|
v.BgColor, v.FgColor = g.BgColor, g.FgColor
|
||||||
v.SelBgColor, v.SelFgColor = g.SelBgColor, g.SelFgColor
|
v.SelBgColor, v.SelFgColor = g.SelBgColor, g.SelFgColor
|
||||||
v.Overlaps = overlaps
|
v.Overlaps = overlaps
|
||||||
g.views = append(g.views, v)
|
g.views = append(g.views, v)
|
||||||
|
|
||||||
|
g.Mutexes.ViewsMutex.Unlock()
|
||||||
|
|
||||||
return v, errors.Wrap(ErrUnknownView, 0)
|
return v, errors.Wrap(ErrUnknownView, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,6 +224,9 @@ func (g *Gui) SetViewBeneath(name string, aboveViewName string, height int) (*Vi
|
|||||||
|
|
||||||
// SetViewOnTop sets the given view on top of the existing ones.
|
// SetViewOnTop sets the given view on top of the existing ones.
|
||||||
func (g *Gui) SetViewOnTop(name string) (*View, error) {
|
func (g *Gui) SetViewOnTop(name string) (*View, error) {
|
||||||
|
g.Mutexes.ViewsMutex.Lock()
|
||||||
|
defer g.Mutexes.ViewsMutex.Unlock()
|
||||||
|
|
||||||
for i, v := range g.views {
|
for i, v := range g.views {
|
||||||
if v.name == name {
|
if v.name == name {
|
||||||
s := append(g.views[:i], g.views[i+1:]...)
|
s := append(g.views[:i], g.views[i+1:]...)
|
||||||
@ -225,6 +239,9 @@ func (g *Gui) SetViewOnTop(name string) (*View, error) {
|
|||||||
|
|
||||||
// SetViewOnBottom sets the given view on bottom of the existing ones.
|
// SetViewOnBottom sets the given view on bottom of the existing ones.
|
||||||
func (g *Gui) SetViewOnBottom(name string) (*View, error) {
|
func (g *Gui) SetViewOnBottom(name string) (*View, error) {
|
||||||
|
g.Mutexes.ViewsMutex.Lock()
|
||||||
|
defer g.Mutexes.ViewsMutex.Unlock()
|
||||||
|
|
||||||
for i, v := range g.views {
|
for i, v := range g.views {
|
||||||
if v.name == name {
|
if v.name == name {
|
||||||
s := append(g.views[:i], g.views[i+1:]...)
|
s := append(g.views[:i], g.views[i+1:]...)
|
||||||
@ -243,6 +260,9 @@ func (g *Gui) Views() []*View {
|
|||||||
// View returns a pointer to the view with the given name, or error
|
// View returns a pointer to the view with the given name, or error
|
||||||
// ErrUnknownView if a view with that name does not exist.
|
// ErrUnknownView if a view with that name does not exist.
|
||||||
func (g *Gui) View(name string) (*View, error) {
|
func (g *Gui) View(name string) (*View, error) {
|
||||||
|
g.Mutexes.ViewsMutex.Lock()
|
||||||
|
defer g.Mutexes.ViewsMutex.Unlock()
|
||||||
|
|
||||||
for _, v := range g.views {
|
for _, v := range g.views {
|
||||||
if v.name == name {
|
if v.name == name {
|
||||||
return v, nil
|
return v, nil
|
||||||
@ -254,6 +274,9 @@ func (g *Gui) View(name string) (*View, error) {
|
|||||||
// ViewByPosition returns a pointer to a view matching the given position, or
|
// ViewByPosition returns a pointer to a view matching the given position, or
|
||||||
// error ErrUnknownView if a view in that position does not exist.
|
// error ErrUnknownView if a view in that position does not exist.
|
||||||
func (g *Gui) ViewByPosition(x, y int) (*View, error) {
|
func (g *Gui) ViewByPosition(x, y int) (*View, error) {
|
||||||
|
g.Mutexes.ViewsMutex.Lock()
|
||||||
|
defer g.Mutexes.ViewsMutex.Unlock()
|
||||||
|
|
||||||
// traverse views in reverse order checking top views first
|
// traverse views in reverse order checking top views first
|
||||||
for i := len(g.views); i > 0; i-- {
|
for i := len(g.views); i > 0; i-- {
|
||||||
v := g.views[i-1]
|
v := g.views[i-1]
|
||||||
@ -271,6 +294,9 @@ func (g *Gui) ViewByPosition(x, y int) (*View, error) {
|
|||||||
// ViewPosition returns the coordinates of the view with the given name, or
|
// ViewPosition returns the coordinates of the view with the given name, or
|
||||||
// error ErrUnknownView if a view with that name does not exist.
|
// error ErrUnknownView if a view with that name does not exist.
|
||||||
func (g *Gui) ViewPosition(name string) (x0, y0, x1, y1 int, err error) {
|
func (g *Gui) ViewPosition(name string) (x0, y0, x1, y1 int, err error) {
|
||||||
|
g.Mutexes.ViewsMutex.Lock()
|
||||||
|
defer g.Mutexes.ViewsMutex.Unlock()
|
||||||
|
|
||||||
for _, v := range g.views {
|
for _, v := range g.views {
|
||||||
if v.name == name {
|
if v.name == name {
|
||||||
return v.x0, v.y0, v.x1, v.y1, nil
|
return v.x0, v.y0, v.x1, v.y1, nil
|
||||||
@ -281,6 +307,9 @@ func (g *Gui) ViewPosition(name string) (x0, y0, x1, y1 int, err error) {
|
|||||||
|
|
||||||
// DeleteView deletes a view by name.
|
// DeleteView deletes a view by name.
|
||||||
func (g *Gui) DeleteView(name string) error {
|
func (g *Gui) DeleteView(name string) error {
|
||||||
|
g.Mutexes.ViewsMutex.Lock()
|
||||||
|
defer g.Mutexes.ViewsMutex.Unlock()
|
||||||
|
|
||||||
for i, v := range g.views {
|
for i, v := range g.views {
|
||||||
if v.name == name {
|
if v.name == name {
|
||||||
g.views = append(g.views[:i], g.views[i+1:]...)
|
g.views = append(g.views[:i], g.views[i+1:]...)
|
||||||
@ -292,6 +321,9 @@ func (g *Gui) DeleteView(name string) error {
|
|||||||
|
|
||||||
// SetCurrentView gives the focus to a given view.
|
// SetCurrentView gives the focus to a given view.
|
||||||
func (g *Gui) SetCurrentView(name string) (*View, error) {
|
func (g *Gui) SetCurrentView(name string) (*View, error) {
|
||||||
|
g.Mutexes.ViewsMutex.Lock()
|
||||||
|
defer g.Mutexes.ViewsMutex.Unlock()
|
||||||
|
|
||||||
for _, v := range g.views {
|
for _, v := range g.views {
|
||||||
if v.name == name {
|
if v.name == name {
|
||||||
g.currentView = v
|
g.currentView = v
|
||||||
@ -914,8 +946,8 @@ func (g *Gui) execKeybinding(v *View, kb *keybinding) (bool, error) {
|
|||||||
|
|
||||||
func (g *Gui) StartTicking() {
|
func (g *Gui) StartTicking() {
|
||||||
go func() {
|
go func() {
|
||||||
g.tickingMutex.Lock()
|
g.Mutexes.tickingMutex.Lock()
|
||||||
defer g.tickingMutex.Unlock()
|
defer g.Mutexes.tickingMutex.Unlock()
|
||||||
ticker := time.NewTicker(time.Millisecond * 50)
|
ticker := time.NewTicker(time.Millisecond * 50)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
outer:
|
outer:
|
||||||
|
2
vendor/modules.txt
vendored
2
vendor/modules.txt
vendored
@ -108,7 +108,7 @@ github.com/hashicorp/hcl/json/token
|
|||||||
github.com/integrii/flaggy
|
github.com/integrii/flaggy
|
||||||
# github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99
|
# github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99
|
||||||
github.com/jbenet/go-context/io
|
github.com/jbenet/go-context/io
|
||||||
# github.com/jesseduffield/gocui v0.3.1-0.20200927010622-b998f1723844
|
# github.com/jesseduffield/gocui v0.3.1-0.20200930205305-1b445b9bd5da
|
||||||
## explicit
|
## explicit
|
||||||
github.com/jesseduffield/gocui
|
github.com/jesseduffield/gocui
|
||||||
# github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe
|
# github.com/jesseduffield/termbox-go v0.0.0-20200823212418-a2289ed6aafe
|
||||||
|
Loading…
Reference in New Issue
Block a user