diff options
author | aycabta <aycabta@gmail.com> | 2019-09-01 11:02:14 +0900 |
---|---|---|
committer | aycabta <aycabta@gmail.com> | 2019-09-01 11:02:58 +0900 |
commit | c5bb074fe731832b64143372986197c83201d2f3 (patch) | |
tree | 5b9f40fd13d49533eafaf492ebd0e5a9486df269 /lib | |
parent | 1756ec2065d5219659b585f3fe3ce666861acd3a (diff) | |
download | ruby-c5bb074fe731832b64143372986197c83201d2f3.tar.gz |
Re-calculate state variables of screen when screen size changes
Diffstat (limited to 'lib')
-rw-r--r-- | lib/reline/line_editor.rb | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index a1ec01d3c1..597a39107b 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -71,7 +71,60 @@ class Reline::LineEditor } Reline::IOGate.set_winch_handler do @rest_height = (Reline::IOGate.get_screen_size.first - 1) - Reline::IOGate.cursor_pos.y + old_screen_size = @screen_size @screen_size = Reline::IOGate.get_screen_size + if old_screen_size.last < @screen_size.last # columns increase + @rerender_all = true + rerender + else + special_prompt = nil + if @vi_arg + prompt = "(arg: #{@vi_arg}) " + prompt_width = calculate_width(prompt) + special_prompt = prompt + elsif @searching_prompt + prompt = @searching_prompt + prompt_width = calculate_width(prompt) + special_prompt = prompt + else + prompt = @prompt + prompt_width = calculate_width(prompt, true) + end + back = 0 + new_buffer = whole_lines + prompt_list = nil + if @prompt_proc + prompt_list = @prompt_proc.(new_buffer) + prompt_list[@line_index] = special_prompt if special_prompt + prompt = prompt_list[@line_index] + prompt_width = calculate_width(prompt, true) + end + new_buffer.each_with_index do |line, index| + prompt_width = calculate_width(prompt_list[index], true) if @prompt_proc + width = prompt_width + calculate_width(line) + height = calculate_height_by_width(width) + back += height + end + @highest_in_all = back + @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max) + @first_line_started_from = + if @line_index.zero? + 0 + else + @buffer_of_lines[0..(@line_index - 1)].inject(0) { |result, line| + result + calculate_height_by_width(prompt_width + calculate_width(line)) # TODO prompt_list + } + end + if @prompt_proc + prompt = prompt_list[@line_index] + prompt_width = calculate_width(prompt, true) + end + calculate_nearest_cursor + @started_from = calculate_height_by_width(prompt_width + @cursor) - 1 + Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last) + @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max) + @rerender_all = true + end end end |