diff --git a/Userland/Libraries/LibLine/Editor.cpp b/Userland/Libraries/LibLine/Editor.cpp index bbf67088393..35ac6170428 100644 --- a/Userland/Libraries/LibLine/Editor.cpp +++ b/Userland/Libraries/LibLine/Editor.cpp @@ -791,6 +791,13 @@ void Editor::handle_interrupt_event() void Editor::handle_read_event() { + if (m_prohibit_input_processing) { + m_have_unprocessed_read_event = true; + return; + } + + auto prohibit_scope = prohibit_input(); + char keybuf[16]; ssize_t nread = 0; diff --git a/Userland/Libraries/LibLine/Editor.h b/Userland/Libraries/LibLine/Editor.h index 5215505a4e1..bc835398e33 100644 --- a/Userland/Libraries/LibLine/Editor.h +++ b/Userland/Libraries/LibLine/Editor.h @@ -241,6 +241,20 @@ public: const Utf32View buffer_view() const { return { m_buffer.data(), m_buffer.size() }; } + auto prohibit_input() + { + auto previous_value = m_prohibit_input_processing; + m_prohibit_input_processing = true; + m_have_unprocessed_read_event = false; + return ScopeGuard { + [this, previous_value] { + m_prohibit_input_processing = previous_value; + if (!m_prohibit_input_processing && m_have_unprocessed_read_event) + handle_read_event(); + } + }; + } + private: explicit Editor(Configuration configuration = Configuration::from_config()); @@ -500,6 +514,8 @@ private: Vector m_signal_handlers; bool m_is_editing { false }; + bool m_prohibit_input_processing { false }; + bool m_have_unprocessed_read_event { false }; Configuration m_configuration; };