1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 03:27:45 +00:00

LibLine: Redraw the suggestions when terminal size changes

This commit is contained in:
Ali Mohammad Pur 2021-04-19 12:43:36 +04:30 committed by Linus Groh
parent 3cfab83e7e
commit e1e84fe0fe
4 changed files with 34 additions and 9 deletions

View file

@ -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() void Editor::really_quit_event_loop()
{ {
m_finish = false; m_finish = false;

View file

@ -189,15 +189,7 @@ public:
#undef __ENUMERATE_EDITOR_INTERNAL_FUNCTION #undef __ENUMERATE_EDITOR_INTERNAL_FUNCTION
void interrupted(); void interrupted();
void resized() 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();
}
size_t cursor() const { return m_cursor; } size_t cursor() const { return m_cursor; }
void set_cursor(size_t cursor) void set_cursor(size_t cursor)

View file

@ -44,6 +44,17 @@ public:
virtual void finish() = 0; virtual void finish() = 0;
virtual void set_initial_prompt_lines(size_t) = 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; virtual void set_vt_size(size_t lines, size_t columns) = 0;
size_t origin_row() const { return m_origin_row; } size_t origin_row() const { return m_origin_row; }
@ -56,8 +67,12 @@ public:
} }
protected: 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_row { 0 };
int m_origin_column { 0 }; int m_origin_column { 0 };
bool m_is_showing_suggestions { false };
}; };
class XtermSuggestionDisplay : public SuggestionDisplay { class XtermSuggestionDisplay : public SuggestionDisplay {

View file

@ -35,6 +35,8 @@ namespace Line {
void XtermSuggestionDisplay::display(const SuggestionManager& manager) void XtermSuggestionDisplay::display(const SuggestionManager& manager)
{ {
did_display();
size_t longest_suggestion_length = 0; size_t longest_suggestion_length = 0;
size_t longest_suggestion_byte_length = 0; size_t longest_suggestion_byte_length = 0;
@ -172,6 +174,8 @@ void XtermSuggestionDisplay::display(const SuggestionManager& manager)
bool XtermSuggestionDisplay::cleanup() bool XtermSuggestionDisplay::cleanup()
{ {
did_cleanup();
if (m_lines_used_for_last_suggestions) { if (m_lines_used_for_last_suggestions) {
VT::clear_lines(0, m_lines_used_for_last_suggestions); VT::clear_lines(0, m_lines_used_for_last_suggestions);
m_lines_used_for_last_suggestions = 0; m_lines_used_for_last_suggestions = 0;