summaryrefslogtreecommitdiff
path: root/lib/reline/windows.rb
diff options
context:
space:
mode:
authorYO4 <ysno@ac.auone-net.jp>2021-12-06 23:01:50 +0900
committergit <svn-admin@ruby-lang.org>2021-12-10 22:16:46 +0900
commitaed21d6574e1c18d64d446cf3709545aa7a608c2 (patch)
tree09e64d32bdc4f17fe92bcb4506a4210fcbdf5f1f /lib/reline/windows.rb
parent66e14e2076ce08c5425b3000a164a5c62a10b106 (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.rb21
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) }