summaryrefslogtreecommitdiff
path: root/lib/reline/windows.rb
diff options
context:
space:
mode:
authorYO4 <ysno@ac.auone-net.jp>2021-12-09 22:36:18 +0900
committergit <svn-admin@ruby-lang.org>2021-12-10 22:18:26 +0900
commit3a2ae5bb19a653ac131136c6bf9a7550f64804f6 (patch)
treec5a235122a58841038ab319eb83a31a69680a688 /lib/reline/windows.rb
parent74765a5a36da70b0cc5c66ec71283819ef1160aa (diff)
[ruby/reline] unleash real pasting speed
2700msec -> 410msec read 80 console inputs at once https://github.com/ruby/reline/commit/eb3ef7af98
Diffstat (limited to 'lib/reline/windows.rb')
-rw-r--r--lib/reline/windows.rb36
1 files changed, 20 insertions, 16 deletions
diff --git a/lib/reline/windows.rb b/lib/reline/windows.rb
index 950d0cf0ca..32d93a1ca9 100644
--- a/lib/reline/windows.rb
+++ b/lib/reline/windows.rb
@@ -262,23 +262,27 @@ class Reline::Windows
next
end
next if @@GetNumberOfConsoleInputEvents.(@@hConsoleInputHandle, num_of_events) == 0 or num_of_events.unpack1('L') == 0
- input_record = 0.chr * 18
+ input_records = 0.chr * 20 * 80
read_event = 0.chr * 4
- if @@ReadConsoleInputW.(@@hConsoleInputHandle, input_record, 1, read_event) != 0
- event = input_record[0, 2].unpack1('s*')
- case event
- when WINDOW_BUFFER_SIZE_EVENT
- @@winch_handler.()
- when KEY_EVENT
- key_down = input_record[4, 4].unpack1('l*')
- repeat_count = input_record[8, 2].unpack1('s*')
- virtual_key_code = input_record[10, 2].unpack1('s*')
- virtual_scan_code = input_record[12, 2].unpack1('s*')
- char_code = input_record[14, 2].unpack1('S*')
- control_key_state = input_record[16, 2].unpack1('S*')
- is_key_down = key_down.zero? ? false : true
- if is_key_down
- process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state)
+ if @@ReadConsoleInputW.(@@hConsoleInputHandle, input_records, 80, read_event) != 0
+ read_events = read_event.unpack1('L')
+ 0.upto(read_events) do |idx|
+ input_record = input_records[idx * 20, 20]
+ event = input_record[0, 2].unpack1('s*')
+ case event
+ when WINDOW_BUFFER_SIZE_EVENT
+ @@winch_handler.()
+ when KEY_EVENT
+ key_down = input_record[4, 4].unpack1('l*')
+ repeat_count = input_record[8, 2].unpack1('s*')
+ virtual_key_code = input_record[10, 2].unpack1('s*')
+ virtual_scan_code = input_record[12, 2].unpack1('s*')
+ char_code = input_record[14, 2].unpack1('S*')
+ control_key_state = input_record[16, 2].unpack1('S*')
+ is_key_down = key_down.zero? ? false : true
+ if is_key_down
+ process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state)
+ end
end
end
end