summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authortomoya ishida <tomoyapenguin@gmail.com>2023-05-07 22:18:09 +0900
committergit <svn-admin@ruby-lang.org>2023-05-07 13:18:13 +0000
commit5eca327fc50bebb06c6af103d109a1fef0895605 (patch)
tree7183f994cef98b7b19317891142c552d119aa2a1 /lib
parent8b2884c0b51e4733c09ecbb388ca1b236bad738b (diff)
downloadruby-5eca327fc50bebb06c6af103d109a1fef0895605.tar.gz
[ruby/reline] Fix dialog corrupts rendering by pushing up input line
too much (https://github.com/ruby/reline/pull/524) * Do not render dialog where it overflows screen * Dialog rendering should Scroll down only when needed * Refactor screen_y_range calculation Co-authored-by: Stan Lo <stan001212@gmail.com> --------- https://github.com/ruby/reline/commit/bc0e3d1310 Co-authored-by: Stan Lo <stan001212@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/reline/line_editor.rb10
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
index 15c3e0b1bf..b6304bc040 100644
--- a/lib/reline/line_editor.rb
+++ b/lib/reline/line_editor.rb
@@ -708,10 +708,16 @@ class Reline::LineEditor
# Clear and rerender all dialogs line by line
Reline::IOGate.hide_cursor
ymin, ymax = (ranges_to_restore.keys + new_dialog_ranges.keys).minmax
+ scroll_partial_screen = @scroll_partial_screen || 0
+ screen_y_range = scroll_partial_screen..(scroll_partial_screen + @screen_height - 1)
+ ymin = ymin.clamp(screen_y_range.begin, screen_y_range.end)
+ ymax = ymax.clamp(screen_y_range.begin, screen_y_range.end)
dialog_y = @first_line_started_from + @started_from
cursor_y = dialog_y
- scroll_down(ymax - cursor_y)
- move_cursor_up(ymax - cursor_y)
+ if @highest_in_all < ymax
+ scroll_down(ymax - cursor_y)
+ move_cursor_up(ymax - cursor_y)
+ end
(ymin..ymax).each do |y|
move_cursor_down(y - cursor_y)
cursor_y = y