summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2016-06-15 13:03:42 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2016-06-15 13:15:17 +0900
commite455836cc98770df01e9cfb406795c868a266173 (patch)
treef24a0a5f5857e8b881b8172457b7330b6b111e6c
parent8a90f26c8a4ac34517eeed9f3498dd790d255474 (diff)
Fix race condition where preview window is not properly cleared
-rw-r--r--src/terminal.go37
-rw-r--r--test/test_go.rb8
2 files changed, 28 insertions, 17 deletions
diff --git a/src/terminal.go b/src/terminal.go
index 18d5f0c5..213d3b06 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -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)
}
diff --git a/test/test_go.rb b/test/test_go.rb
index a6d67190..c375fac1 100644
--- a/test/test_go.rb
+++ b/test/test_go.rb
@@ -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