use super::{reader_reading_interrupted, reader_schedule_prompt_repaint, Reader};
use crate::{
event,
input_common::{CharEvent, InputData, InputEventQueuer, ReadlineCmd},
proc::job_reap,
signal::signal_clear_cancel,
};
use fish_common::escape;
use fish_widestring::bytes2wcstring;
use std::os::fd::RawFd;
impl<'a> InputEventQueuer for Reader<'a> {
fn get_input_data(&self) -> &InputData {
&self.input_data
}
fn get_input_data_mut(&mut self) -> &mut InputData {
&mut self.input_data
}
fn get_ioport_fd(&self) -> RawFd {
self.debouncers.event_signaller_read_fd()
}
fn prepare_to_select(&mut self) {
event::fire_delayed(self.parser);
if job_reap(self.parser, true, None) {
reader_schedule_prompt_repaint();
}
}
fn select_interrupted(&mut self) {
signal_clear_cancel();
let parser = self.parser;
event::fire_delayed(parser);
if job_reap(parser, true, None) {
reader_schedule_prompt_repaint();
}
if reader_reading_interrupted(self) != 0 {
self.enqueue_interrupt_key();
return;
}
self.push_front(CharEvent::from_check_exit());
}
fn uvar_change_notified(&mut self) {
self.parser.sync_uvars_and_fire(true );
}
fn ioport_notified(&mut self) {
self.debouncers.event_signaller.try_consume();
self.service_debounced_results();
}
fn paste_start_buffering(&mut self) {
self.input_data.paste_buffer = Some(vec![]);
self.push_front(CharEvent::from_readline(ReadlineCmd::BeginUndoGroup));
}
fn paste_commit(&mut self) {
self.push_front(CharEvent::from_readline(ReadlineCmd::EndUndoGroup));
let Some(buffer) = self.input_data.paste_buffer.take() else {
return;
};
self.push_front(CharEvent::Command(sprintf!(
"__fish_paste %s",
escape(&bytes2wcstring(&buffer))
)));
}
}