diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2014-03-05 19:07:59 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2014-03-05 19:07:59 +0900 |
commit | 86a66da04d7a8911c1b4dffb12a7c1cd066a88d9 (patch) | |
tree | 7370ceeb0afe90e2a189732381fa1988eb0f117a | |
parent | d66b02b0cd5c575357157f98292731511a609230 (diff) |
Synchronize getch calls to reduce screen glitches
-rwxr-xr-x | fzf | 23 |
1 files changed, 15 insertions, 8 deletions
@@ -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) |