summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2014-03-05 19:07:59 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2014-03-05 19:07:59 +0900
commit86a66da04d7a8911c1b4dffb12a7c1cd066a88d9 (patch)
tree7370ceeb0afe90e2a189732381fa1988eb0f117a
parentd66b02b0cd5c575357157f98292731511a609230 (diff)
Synchronize getch calls to reduce screen glitches
-rwxr-xr-xfzf23
1 files 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)