diff options
author | YO4 <ysno@ac.auone-net.jp> | 2021-12-06 23:01:50 +0900 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2021-12-10 22:16:46 +0900 |
commit | aed21d6574e1c18d64d446cf3709545aa7a608c2 (patch) | |
tree | 09e64d32bdc4f17fe92bcb4506a4210fcbdf5f1f /lib/reline/windows.rb | |
parent | 66e14e2076ce08c5425b3000a164a5c62a10b106 (diff) |
[ruby/reline] support input surrogate paird codepoint
support surrogate pair input
https://github.com/ruby/reline/commit/0b4acedc6a
Diffstat (limited to 'lib/reline/windows.rb')
-rw-r--r-- | lib/reline/windows.rb | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/reline/windows.rb b/lib/reline/windows.rb index 08ab3f2610..297713b44e 100644 --- a/lib/reline/windows.rb +++ b/lib/reline/windows.rb @@ -213,8 +213,29 @@ class Reline::Windows [ { control_keys: :SHIFT, virtual_key_code: VK_TAB }, [27, 91, 90] ], ] + @@hsg = nil + def self.process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state) + # high-surrogate + if char_code & 0xDC00 == 0xD800 + @@hsg = char_code + return + end + # low-surrogate + if char_code & 0xDC00 == 0xDC00 + if @@hsg + char_code = 0x10000 + (@@hsg - 0xD800) * 0x400 + char_code - 0xDC00 + @@hsg = nil + else + # no high-surrogate. ignored. + return + end + else + # ignore high-surrogate without low-surrogate if there + @@hsg = nil + end + key = KeyEventRecord.new(virtual_key_code, char_code, control_key_state) match = KEY_MAP.find { |args,| key.matches?(**args) } |