From e1e84fe0fef8a844bb54d07258c32e24ef1f96d5 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Mon, 19 Apr 2021 12:43:36 +0430 Subject: [PATCH] LibLine: Redraw the suggestions when terminal size changes --- Userland/Libraries/LibLine/Editor.cpp | 14 ++++++++++++++ Userland/Libraries/LibLine/Editor.h | 10 +--------- Userland/Libraries/LibLine/SuggestionDisplay.h | 15 +++++++++++++++ .../Libraries/LibLine/XtermSuggestionDisplay.cpp | 4 ++++ 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Userland/Libraries/LibLine/Editor.cpp b/Userland/Libraries/LibLine/Editor.cpp index d66cfde642b..0f0a12b1841 100644 --- a/Userland/Libraries/LibLine/Editor.cpp +++ b/Userland/Libraries/LibLine/Editor.cpp @@ -576,6 +576,20 @@ void Editor::interrupted() }); } +void Editor::resized() +{ + m_was_resized = true; + m_previous_num_columns = m_num_columns; + get_terminal_size(); + + reposition_cursor(true); + m_suggestion_display->redisplay(m_suggestion_manager, m_num_lines, m_num_columns); + reposition_cursor(); + + if (m_is_searching) + m_search_editor->resized(); +} + void Editor::really_quit_event_loop() { m_finish = false; diff --git a/Userland/Libraries/LibLine/Editor.h b/Userland/Libraries/LibLine/Editor.h index 23aea8d3c78..27d2ba265d5 100644 --- a/Userland/Libraries/LibLine/Editor.h +++ b/Userland/Libraries/LibLine/Editor.h @@ -189,15 +189,7 @@ public: #undef __ENUMERATE_EDITOR_INTERNAL_FUNCTION void interrupted(); - void resized() - { - m_was_resized = true; - m_previous_num_columns = m_num_columns; - get_terminal_size(); - m_suggestion_display->set_vt_size(m_num_lines, m_num_columns); - if (m_is_searching) - m_search_editor->resized(); - } + void resized(); size_t cursor() const { return m_cursor; } void set_cursor(size_t cursor) diff --git a/Userland/Libraries/LibLine/SuggestionDisplay.h b/Userland/Libraries/LibLine/SuggestionDisplay.h index 434b0ee3a20..2dc24be2ade 100644 --- a/Userland/Libraries/LibLine/SuggestionDisplay.h +++ b/Userland/Libraries/LibLine/SuggestionDisplay.h @@ -44,6 +44,17 @@ public: virtual void finish() = 0; virtual void set_initial_prompt_lines(size_t) = 0; + void redisplay(const SuggestionManager& manager, size_t lines, size_t columns) + { + if (m_is_showing_suggestions) { + cleanup(); + set_vt_size(lines, columns); + display(manager); + } else { + set_vt_size(lines, columns); + } + } + virtual void set_vt_size(size_t lines, size_t columns) = 0; size_t origin_row() const { return m_origin_row; } @@ -56,8 +67,12 @@ public: } protected: + void did_display() { m_is_showing_suggestions = true; } + void did_cleanup() { m_is_showing_suggestions = false; } + int m_origin_row { 0 }; int m_origin_column { 0 }; + bool m_is_showing_suggestions { false }; }; class XtermSuggestionDisplay : public SuggestionDisplay { diff --git a/Userland/Libraries/LibLine/XtermSuggestionDisplay.cpp b/Userland/Libraries/LibLine/XtermSuggestionDisplay.cpp index 03b52434162..e10f7369efc 100644 --- a/Userland/Libraries/LibLine/XtermSuggestionDisplay.cpp +++ b/Userland/Libraries/LibLine/XtermSuggestionDisplay.cpp @@ -35,6 +35,8 @@ namespace Line { void XtermSuggestionDisplay::display(const SuggestionManager& manager) { + did_display(); + size_t longest_suggestion_length = 0; size_t longest_suggestion_byte_length = 0; @@ -172,6 +174,8 @@ void XtermSuggestionDisplay::display(const SuggestionManager& manager) bool XtermSuggestionDisplay::cleanup() { + did_cleanup(); + if (m_lines_used_for_last_suggestions) { VT::clear_lines(0, m_lines_used_for_last_suggestions); m_lines_used_for_last_suggestions = 0;