summaryrefslogtreecommitdiff
path: root/lib/reline/windows.rb
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-10-12 10:42:53 +0900
committergit <svn-admin@ruby-lang.org>2021-10-12 13:19:25 +0900
commita48dc89547e3c235350394b4a735c9d50892c152 (patch)
tree84c1bf8419834289109fea017195d263b7f888ed /lib/reline/windows.rb
parent1009fd7ee3d04c5cc4ca4a8b523a6d4d56a0da88 (diff)
[ruby/reline] Check the result of GetConsoleScreenBufferInfo
https://github.com/ruby/reline/commit/42edf7b3aa
Diffstat (limited to 'lib/reline/windows.rb')
-rw-r--r--lib/reline/windows.rb23
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/reline/windows.rb b/lib/reline/windows.rb
index e72e571a13..73653b2de2 100644
--- a/lib/reline/windows.rb
+++ b/lib/reline/windows.rb
@@ -283,15 +283,23 @@ class Reline::Windows
end
end
- def self.get_screen_size
+ def self.get_console_screen_buffer_info
csbi = 0.chr * 22
- @@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi)
+ return if @@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi) == 0
+ csbi
+ end
+
+ def self.get_screen_size
+ unless csbi = get_console_screen_buffer_info
+ return [1, 1]
+ end
csbi[0, 4].unpack('SS').reverse
end
def self.cursor_pos
- csbi = 0.chr * 22
- @@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi)
+ unless csbi = get_console_screen_buffer_info
+ return Reline::CursorPos.new(0, 0)
+ end
x = csbi[4, 2].unpack1('s*')
y = csbi[6, 2].unpack1('s*')
Reline::CursorPos.new(x, y)
@@ -313,6 +321,7 @@ class Reline::Windows
def self.move_cursor_down(val)
if val > 0
+ return unless csbi = get_console_screen_buffer_info
screen_height = get_screen_size.first
y = cursor_pos.y + val
y = screen_height - 1 if y > (screen_height - 1)
@@ -323,8 +332,7 @@ class Reline::Windows
end
def self.erase_after_cursor
- csbi = 0.chr * 22
- @@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi)
+ return unless csbi = get_console_screen_buffer_info
attributes = csbi[8, 2].unpack1('S')
cursor = csbi[4, 4].unpack1('L')
written = 0.chr * 4
@@ -343,8 +351,7 @@ class Reline::Windows
end
def self.clear_screen
- csbi = 0.chr * 22
- return if @@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi) == 0
+ return unless csbi = get_console_screen_buffer_info
buffer_width = csbi[0, 2].unpack1('S')
attributes = csbi[8, 2].unpack1('S')
_window_left, window_top, _window_right, window_bottom = *csbi[10,8].unpack('S*')