From e455836cc98770df01e9cfb406795c868a266173 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Wed, 15 Jun 2016 13:03:42 +0900 Subject: [PATCH] Fix race condition where preview window is not properly cleared --- src/terminal.go | 37 +++++++++++++++++++++---------------- test/test_go.rb | 8 +++++++- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/terminal.go b/src/terminal.go index 18d5f0c..213d3b0 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 a6d6719..c375fac 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