diff --git a/Libraries/LibLine/Editor.cpp b/Libraries/LibLine/Editor.cpp index 2fe2900429..697f6f3634 100644 --- a/Libraries/LibLine/Editor.cpp +++ b/Libraries/LibLine/Editor.cpp @@ -292,6 +292,9 @@ auto Editor::get_line(const String& prompt) -> Result add_child(*m_notifier); m_notifier->on_ready_to_read = [&] { + if (m_was_interrupted) + handle_interrupt_event(); + handle_read_event(); if (m_always_refresh) @@ -342,6 +345,23 @@ void Editor::save_to(JsonObject& object) object.set("used_display_area", move(display_area)); } +void Editor::handle_interrupt_event() +{ + m_was_interrupted = false; + + if (!m_buffer.is_empty()) + printf("^C"); + + m_buffer.clear(); + m_cursor = 0; + + if (on_interrupt_handled) + on_interrupt_handled(); + + m_refresh_needed = true; + refresh_display(); +} + void Editor::handle_read_event() { char keybuf[16]; @@ -360,18 +380,7 @@ void Editor::handle_read_event() return; } - m_was_interrupted = false; - - if (!m_buffer.is_empty()) - printf("^C"); - - m_buffer.clear(); - m_cursor = 0; - - if (on_interrupt_handled) - on_interrupt_handled(); - - m_refresh_needed = true; + handle_interrupt_event(); return; } diff --git a/Libraries/LibLine/Editor.h b/Libraries/LibLine/Editor.h index c3f8db1cb7..3ebb9e1d52 100644 --- a/Libraries/LibLine/Editor.h +++ b/Libraries/LibLine/Editor.h @@ -114,10 +114,16 @@ public: // since we can not do this cleanly ourselves. (signal() limitation: cannot give member functions) void interrupted() { - if (m_is_editing) + if (m_is_editing) { m_was_interrupted = true; + handle_interrupt_event(); + } + } + void resized() + { + m_was_resized = true; + refresh_display(); } - void resized() { m_was_resized = true; } size_t cursor() const { return m_cursor; } const Vector& buffer() const { return m_buffer; } @@ -176,6 +182,7 @@ private: Function callback; }; + void handle_interrupt_event(); void handle_read_event(); Vector vt_dsr(); diff --git a/Shell/main.cpp b/Shell/main.cpp index 28c97cbb19..d6f6f7c436 100644 --- a/Shell/main.cpp +++ b/Shell/main.cpp @@ -133,7 +133,7 @@ int main(int argc, char** argv) } editor->on_interrupt_handled = [&] { - if (!shell->should_read_more()) { + if (shell->should_read_more()) { shell->finish_command(); editor->finish(); }