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
Notes: sideshowbarker 2024-07-18 19:24:10 +09:00
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()
{
m_finish = false;

View file

@ -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)

View file

@ -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 {

View file

@ -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;