mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
Switch the input interrupt function to return maybe_t
Allow returning none() to mean do nothing.
This commit is contained in:
parent
1e5c1c82c7
commit
46dfad52d9
3 changed files with 17 additions and 9 deletions
|
@ -249,14 +249,18 @@ void input_mapping_add(const wchar_t *sequence, const wchar_t *command, const wc
|
|||
|
||||
/// Handle interruptions to key reading by reaping finshed jobs and propagating the interrupt to the
|
||||
/// reader.
|
||||
static int interrupt_handler() {
|
||||
static maybe_t<int> interrupt_handler() {
|
||||
// Fire any pending events.
|
||||
event_fire_delayed();
|
||||
// Reap stray processes, including printing exit status messages.
|
||||
if (job_reap(true)) reader_repaint_needed();
|
||||
// Tell the reader an event occured.
|
||||
if (reader_reading_interrupted()) {
|
||||
return shell_modes.c_cc[VINTR];
|
||||
auto vintr = shell_modes.c_cc[VINTR];
|
||||
if (vintr == 0) {
|
||||
return none();
|
||||
}
|
||||
return vintr;
|
||||
}
|
||||
|
||||
return R_NULL;
|
||||
|
|
|
@ -63,9 +63,9 @@ static void lookahead_push_back(char_event_t c) { lookahead_list.push_back(c); }
|
|||
static void lookahead_push_front(char_event_t c) { lookahead_list.push_front(c); }
|
||||
|
||||
/// Callback function for handling interrupts on reading.
|
||||
static int (*interrupt_handler)();
|
||||
static interrupt_func_t interrupt_handler;
|
||||
|
||||
void input_common_init(int (*ih)()) { interrupt_handler = ih; }
|
||||
void input_common_init(interrupt_func_t func) { interrupt_handler = func; }
|
||||
|
||||
/// Internal function used by input_common_readch to read one byte from fd 0. This function should
|
||||
/// only be called by input_common_readch().
|
||||
|
@ -115,9 +115,9 @@ static maybe_t<wint_t> readb() {
|
|||
if (res == -1) {
|
||||
if (errno == EINTR || errno == EAGAIN) {
|
||||
if (interrupt_handler) {
|
||||
int res = interrupt_handler();
|
||||
if (res) return res;
|
||||
if (auto mc = lookahead_pop_char()) {
|
||||
if (auto interrupt_evt = interrupt_handler()) {
|
||||
return *interrupt_evt;
|
||||
} else if (auto mc = lookahead_pop_char()) {
|
||||
return *mc;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -122,8 +122,12 @@ class char_event_t {
|
|||
}
|
||||
};
|
||||
|
||||
/// Init the library.
|
||||
void input_common_init(int (*ih)());
|
||||
/// A type of function invoked on interrupt.
|
||||
/// \return the event which is to be returned to the reader loop, or none if VINTR is 0.
|
||||
using interrupt_func_t = maybe_t<int> (*)();
|
||||
|
||||
/// Init the library with an interrupt function.
|
||||
void input_common_init(interrupt_func_t func);
|
||||
|
||||
/// Adjust the escape timeout.
|
||||
class environment_t;
|
||||
|
|
Loading…
Reference in a new issue