diff options
author | AnotherTest <ali.mpfard@gmail.com> | 2020-06-01 16:26:31 +0430 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-06-01 19:52:20 +0200 |
commit | 889a8e7d0fb5bc6556daa6fffdc55aed74f0e60a (patch) | |
tree | 1f3c89ffa668e01758d56577196702cbee75b94b /Libraries/LibLine | |
parent | 29029568ee5d52f67a639d93ed71bdc56033342b (diff) | |
download | serenity-889a8e7d0fb5bc6556daa6fffdc55aed74f0e60a.zip |
LibLine: Handle interrupts again
This commit makes LibLine handle interrupts (as reported via
interrupted() and resized()) again.
There is a little catch with the shell:
```
$ ls |
pipe> <C-c> (prompt stays here until a key is pressed)
```
Diffstat (limited to 'Libraries/LibLine')
-rw-r--r-- | Libraries/LibLine/Editor.cpp | 33 | ||||
-rw-r--r-- | Libraries/LibLine/Editor.h | 11 |
2 files changed, 30 insertions, 14 deletions
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<String, Editor::Error> 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<u32, 1024>& buffer() const { return m_buffer; } @@ -176,6 +182,7 @@ private: Function<bool(Editor&)> callback; }; + void handle_interrupt_event(); void handle_read_event(); Vector<size_t, 2> vt_dsr(); |