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.
This commit is contained in:
AnotherTest 2020-04-29 00:31:22 +04:30 committed by Andreas Kling
parent 8b195d1211
commit 7ecf29f206
Notes: sideshowbarker 2024-07-19 07:12:33 +09:00
3 changed files with 14 additions and 2 deletions

View file

@ -124,6 +124,8 @@ void Editor::stylize(const Span& span, const Style& style)
String Editor::get_line(const String& prompt) String Editor::get_line(const String& prompt)
{ {
m_is_editing = true;
set_prompt(prompt); set_prompt(prompt);
reset(); reset();
set_origin(); set_origin();
@ -139,6 +141,7 @@ String Editor::get_line(const String& prompt)
fflush(stdout); fflush(stdout);
auto string = String::copy(m_buffer); auto string = String::copy(m_buffer);
m_buffer.clear(); m_buffer.clear();
m_is_editing = false;
return string; return string;
} }
char keybuf[16]; char keybuf[16];

View file

@ -107,7 +107,11 @@ public:
// FIXME: we will have to kindly ask our instantiators to set our signal handlers // 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) // 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; } void resized() { m_was_resized = true; }
size_t cursor() const { return m_cursor; } size_t cursor() const { return m_cursor; }
@ -148,6 +152,8 @@ public:
m_finish = true; m_finish = true;
} }
bool is_editing() const { return m_is_editing; }
private: private:
void vt_save_cursor(); void vt_save_cursor();
void vt_restore_cursor(); void vt_restore_cursor();
@ -291,6 +297,8 @@ private:
bool m_initialized { false }; bool m_initialized { false };
bool m_refresh_needed { false }; bool m_refresh_needed { false };
bool m_is_editing { false };
}; };
} }

View file

@ -421,7 +421,8 @@ int main(int argc, char** argv)
s_editor = make<Line::Editor>(); s_editor = make<Line::Editor>();
signal(SIGINT, [](int) { signal(SIGINT, [](int) {
sigint_handler(); if (!s_editor->is_editing())
sigint_handler();
s_editor->interrupted(); s_editor->interrupted();
}); });