Quellcode durchsuchen

LibLine: Redraw the suggestions when terminal size changes

Ali Mohammad Pur vor 4 Jahren
Ursprung
Commit
e1e84fe0fe

+ 14 - 0
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;

+ 1 - 9
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)

+ 15 - 0
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 {

+ 4 - 0
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;