mirror of
https://github.com/Llewellynvdm/fzf.git
synced 2024-12-23 03:19:01 +00:00
Fix race condition where preview window is not properly cleared
This commit is contained in:
parent
8a90f26c8a
commit
e455836cc9
@ -82,6 +82,11 @@ type selectedItem struct {
|
||||
|
||||
type byTimeOrder []selectedItem
|
||||
|
||||
type previewRequest struct {
|
||||
ok bool
|
||||
str string
|
||||
}
|
||||
|
||||
func (a byTimeOrder) Len() int {
|
||||
return len(a)
|
||||
}
|
||||
@ -908,21 +913,23 @@ func (t *Terminal) Loop() {
|
||||
if t.hasPreviewWindow() {
|
||||
go func() {
|
||||
for {
|
||||
focused := ""
|
||||
request := previewRequest{false, ""}
|
||||
t.previewBox.Wait(func(events *util.Events) {
|
||||
for req, value := range *events {
|
||||
switch req {
|
||||
case reqPreviewEnqueue:
|
||||
focused = value.(string)
|
||||
request = value.(previewRequest)
|
||||
}
|
||||
}
|
||||
events.Clear()
|
||||
})
|
||||
if len(focused) > 0 {
|
||||
command := strings.Replace(t.preview.command, "{}", quoteEntry(focused), -1)
|
||||
if request.ok {
|
||||
command := strings.Replace(t.preview.command, "{}", quoteEntry(request.str), -1)
|
||||
cmd := util.ExecCommand(command)
|
||||
out, _ := cmd.CombinedOutput()
|
||||
t.reqBox.Set(reqPreviewDisplay, string(out))
|
||||
} else {
|
||||
t.reqBox.Set(reqPreviewDisplay, "")
|
||||
}
|
||||
}
|
||||
}()
|
||||
@ -936,7 +943,7 @@ func (t *Terminal) Loop() {
|
||||
}
|
||||
|
||||
go func() {
|
||||
focused := ""
|
||||
focused := previewRequest{false, ""}
|
||||
for {
|
||||
t.reqBox.Wait(func(events *util.Events) {
|
||||
defer events.Clear()
|
||||
@ -953,19 +960,17 @@ func (t *Terminal) Loop() {
|
||||
case reqList:
|
||||
t.printList()
|
||||
cnt := t.merger.Length()
|
||||
var currentFocus previewRequest
|
||||
if cnt > 0 && cnt > t.cy {
|
||||
currentFocus := t.current()
|
||||
if currentFocus != focused {
|
||||
focused = currentFocus
|
||||
if t.isPreviewEnabled() {
|
||||
t.previewBox.Set(reqPreviewEnqueue, focused)
|
||||
}
|
||||
}
|
||||
currentFocus = previewRequest{true, t.current()}
|
||||
} else {
|
||||
if focused != "" && t.isPreviewEnabled() {
|
||||
t.pwindow.Erase()
|
||||
currentFocus = previewRequest{false, ""}
|
||||
}
|
||||
if currentFocus != focused {
|
||||
focused = currentFocus
|
||||
if t.isPreviewEnabled() {
|
||||
t.previewBox.Set(reqPreviewEnqueue, focused)
|
||||
}
|
||||
focused = ""
|
||||
}
|
||||
case reqJump:
|
||||
if t.merger.Length() == 0 {
|
||||
@ -1076,7 +1081,7 @@ func (t *Terminal) Loop() {
|
||||
t.resizeWindows()
|
||||
cnt := t.merger.Length()
|
||||
if t.previewing && cnt > 0 && cnt > t.cy {
|
||||
t.previewBox.Set(reqPreviewEnqueue, t.current())
|
||||
t.previewBox.Set(reqPreviewEnqueue, previewRequest{true, t.current()})
|
||||
}
|
||||
req(reqList, reqInfo)
|
||||
}
|
||||
|
@ -1229,14 +1229,20 @@ class TestGoFZF < TestBase
|
||||
end
|
||||
|
||||
def test_preview
|
||||
tmux.send_keys %[seq 1000 | #{FZF} --preview 'echo {{}-{}}' --bind ?:toggle-preview], :Enter
|
||||
tmux.send_keys %[seq 1000 | sed s/^2$// | #{FZF} --preview 'sleep 0.2; echo {{}-{}}' --bind ?:toggle-preview], :Enter
|
||||
tmux.until { |lines| lines[1].include?(' {1-1}') }
|
||||
tmux.send_keys :Up
|
||||
tmux.until { |lines| lines[1].include?(' {-}') }
|
||||
tmux.send_keys '555'
|
||||
tmux.until { |lines| lines[1].include?(' {555-555}') }
|
||||
tmux.send_keys '?'
|
||||
tmux.until { |lines| !lines[1].include?(' {555-555}') }
|
||||
tmux.send_keys '?'
|
||||
tmux.until { |lines| lines[1].include?(' {555-555}') }
|
||||
tmux.send_keys :BSpace
|
||||
tmux.until { |lines| lines[-2].start_with? ' 28/1000' }
|
||||
tmux.send_keys 'foobar'
|
||||
tmux.until { |lines| !lines[1].include?('{') }
|
||||
end
|
||||
|
||||
def test_preview_hidden
|
||||
|
Loading…
Reference in New Issue
Block a user