From 86a66da04d7a8911c1b4dffb12a7c1cd066a88d9 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Wed, 5 Mar 2014 19:07:59 +0900 Subject: [PATCH] Synchronize getch calls to reduce screen glitches --- fzf | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/fzf b/fzf index a8cf9dd8..1c34063c 100755 --- a/fzf +++ b/fzf @@ -82,6 +82,7 @@ class FZF @mouse = true @filter = nil @pending = nil + @mutex = Mutex.new argv = if opts = ENV['FZF_DEFAULT_OPTS'] @@ -721,8 +722,10 @@ class FZF Thread.new do begin while blk = @queue.shift - blk.call - refresh + @mutex.synchronize do + blk.call + refresh + end end rescue Exception => e @main.raise e @@ -766,7 +769,7 @@ class FZF elsif (nch = num_unicode_bytes(ch)) > 1 chs = [ch] (nch - 1).times do |i| - chs << C.getch + chs << getch_nb end # UTF-8 TODO Ruby 1.8 ch = chs.pack('C*').force_encoding('UTF-8') @@ -776,6 +779,10 @@ class FZF ch.is_a?(String) && ch =~ /[[:print:]]/ && ch end + def getch_nb + @mutex.synchronize { C.getch } + end + def getch if pending = @pending @pending = nil @@ -784,10 +791,10 @@ class FZF C.stdscr.timeout = -1 c = C.getch + C.stdscr.timeout = 0 if ch = to_printable(c) chs = [ch] - C.stdscr.timeout = 0 if AFTER_1_9 - while AFTER_1_9 && c = C.getch + while AFTER_1_9 && c = getch_nb if ch = to_printable(c) chs << ch else @@ -868,7 +875,7 @@ class FZF case ch = getch when C::KEY_MOUSE - if m = C.getmouse + if m = @mutex.synchronize { C.getmouse } st = m.bstate if test_mouse(st, C::BUTTON1_PRESSED, C::BUTTON1_RELEASED) if m.y == cursor_y @@ -897,9 +904,9 @@ class FZF when 27 C.stdscr.timeout = 0 ch = # Typeahead arrow keys - case ch2 = C.getch + case ch2 = getch_nb when '[', 91 - case ch3 = C.getch + case ch3 = getch_nb when 'D', 68 then ctrl(:b) when 'C', 67 then ctrl(:f) when 'B', 66 then ctrl(:j)