From 35356766891bd664df8e0b43cf9113c38ebfe9de Mon Sep 17 00:00:00 2001 From: Yoshinao Muramatu Date: Wed, 17 Feb 2021 23:56:34 +0900 Subject: [PATCH] check ENABLE_VIRTUAL_TERMINAL_PROCESSING flag and switch eof processing --- lib/reline/line_editor.rb | 4 ++-- lib/reline/windows.rb | 24 ++++++++++++++++++++++++ 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 @@ def just_move_cursor 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 @@ def just_move_cursor 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 @@ def self.win? 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 @@ def call(*args) @@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 = []