From 7ecf29f206eb8e471a9efc77b3356f4881fd635c Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Wed, 29 Apr 2020 00:31:22 +0430 Subject: [PATCH] LibLine: Ignore interrupts unless actively editing It does not make much sense to receive an interrupt and process it *much later*. Also patches Userland/js to only create exceptions while some code is actually running. --- Libraries/LibLine/Editor.cpp | 3 +++ Libraries/LibLine/Editor.h | 10 +++++++++- Userland/js.cpp | 3 ++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Libraries/LibLine/Editor.cpp b/Libraries/LibLine/Editor.cpp index f355c09417..28b236716d 100644 --- a/Libraries/LibLine/Editor.cpp +++ b/Libraries/LibLine/Editor.cpp @@ -124,6 +124,8 @@ void Editor::stylize(const Span& span, const Style& style) String Editor::get_line(const String& prompt) { + m_is_editing = true; + set_prompt(prompt); reset(); set_origin(); @@ -139,6 +141,7 @@ String Editor::get_line(const String& prompt) fflush(stdout); auto string = String::copy(m_buffer); m_buffer.clear(); + m_is_editing = false; return string; } char keybuf[16]; diff --git a/Libraries/LibLine/Editor.h b/Libraries/LibLine/Editor.h index e7d6271625..4569e95c79 100644 --- a/Libraries/LibLine/Editor.h +++ b/Libraries/LibLine/Editor.h @@ -107,7 +107,11 @@ public: // FIXME: we will have to kindly ask our instantiators to set our signal handlers // since we can not do this cleanly ourselves (signal() limitation: cannot give member functions) - void interrupted() { m_was_interrupted = true; } + void interrupted() + { + if (m_is_editing) + m_was_interrupted = true; + } void resized() { m_was_resized = true; } size_t cursor() const { return m_cursor; } @@ -148,6 +152,8 @@ public: m_finish = true; } + bool is_editing() const { return m_is_editing; } + private: void vt_save_cursor(); void vt_restore_cursor(); @@ -291,6 +297,8 @@ private: bool m_initialized { false }; bool m_refresh_needed { false }; + + bool m_is_editing { false }; }; } diff --git a/Userland/js.cpp b/Userland/js.cpp index 69923856b8..b20e12a4cf 100644 --- a/Userland/js.cpp +++ b/Userland/js.cpp @@ -421,7 +421,8 @@ int main(int argc, char** argv) s_editor = make(); signal(SIGINT, [](int) { - sigint_handler(); + if (!s_editor->is_editing()) + sigint_handler(); s_editor->interrupted(); });