aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorYoshinao Muramatu <ysno@ac.auone-net.jp>2021-02-17 23:56:34 +0900
committeraycabta <aycabta@gmail.com>2021-02-21 06:43:52 +0900
commit38d30a6942babb815bcd05b035fc58a7e13dd717 (patch)
tree43b5f2db1b54cfb8aa117c39c990c842e8c3c4d2 /lib
parent38cefac7ce277d8ea41c600e67a2046da3715ac3 (diff)
downloadruby-38d30a6942babb815bcd05b035fc58a7e13dd717.tar.gz
[ruby/reline] check ENABLE_VIRTUAL_TERMINAL_PROCESSING flag and switch eof processing
https://github.com/ruby/reline/commit/3535676689
Diffstat (limited to 'lib')
-rw-r--r--lib/reline/line_editor.rb4
-rw-r--r--lib/reline/windows.rb24
2 files changed, 26 insertions, 2 deletions
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
index 99877329af..0adda72b23 100644
--- a/lib/reline/line_editor.rb
+++ b/lib/reline/line_editor.rb
@@ -726,7 +726,7 @@ class Reline::LineEditor
if line.nil?
if calculate_width(visual_lines[index - 1], true) == Reline::IOGate.get_screen_size.last
# reaches the end of line
- if Reline::IOGate.win?
+ if Reline::IOGate.win? and Reline::IOGate.win_legacy_console?
# A newline is automatically inserted if a character is rendered at
# eol on command prompt.
else
@@ -744,7 +744,7 @@ class Reline::LineEditor
next
end
@output.write line
- if Reline::IOGate.win? and calculate_width(line, true) == Reline::IOGate.get_screen_size.last
+ if Reline::IOGate.win? and Reline::IOGate.win_legacy_console? and calculate_width(line, true) == Reline::IOGate.get_screen_size.last
# A newline is automatically inserted if a character is rendered at eol on command prompt.
@rest_height -= 1 if @rest_height > 0
end
diff --git a/lib/reline/windows.rb b/lib/reline/windows.rb
index 4f5fcb74bc..88f841c6a8 100644
--- a/lib/reline/windows.rb
+++ b/lib/reline/windows.rb
@@ -9,6 +9,10 @@ class Reline::Windows
true
end
+ def self.win_legacy_console?
+ @@legacy_console
+ end
+
RAW_KEYSTROKE_CONFIG = {
[224, 72] => :ed_prev_history, # ↑
[224, 80] => :ed_next_history, # ↓
@@ -94,6 +98,26 @@ class Reline::Windows
@@GetFileInformationByHandleEx = Win32API.new('kernel32', 'GetFileInformationByHandleEx', ['L', 'I', 'P', 'L'], 'I')
@@FillConsoleOutputAttribute = Win32API.new('kernel32', 'FillConsoleOutputAttribute', ['L', 'L', 'L', 'L', 'P'], 'L')
+ @@GetConsoleMode = Win32API.new('kernel32', 'GetConsoleMode', ['L', 'P'], 'L')
+ @@SetConsoleMode = Win32API.new('kernel32', 'SetConsoleMode', ['L', 'L'], 'L')
+ ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4
+
+ private_class_method def self.getconsolemode
+ mode = '\000\000\000\000'
+ @@GetConsoleMode.call(@@hConsoleHandle, mode)
+ mode.unpack1('L')
+ end
+
+ private_class_method def self.setconsolemode(mode)
+ @@SetConsoleMode.call(@@hConsoleHandle, mode)
+ end
+
+ @@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0)
+ #if @@legacy_console
+ # setconsolemode(getconsolemode() | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
+ # @@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0)
+ #end
+
@@input_buf = []
@@output_buf = []