mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-27 23:09:08 +00:00
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:
parent
8b195d1211
commit
7ecf29f206
Notes:
sideshowbarker
2024-07-19 07:12:33 +09:00
Author: https://github.com/alimpfard
Commit: 7ecf29f206
Pull-request: https://github.com/SerenityOS/serenity/pull/2009
Issue: https://github.com/SerenityOS/serenity/issues/2008
3 changed files with 14 additions and 2 deletions
|
@ -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];
|
||||||
|
|
|
@ -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 };
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue