mirror of
https://github.com/wez/wezterm.git
synced 2024-11-26 08:25:50 +03:00
term: hook flush up to ThreadedWriter
I'd forgotten that this was in here. The recentish fixes to flush for various terminal queries likely need this to be 100% good. Surprised this hasn't come up as a bug already :-/
This commit is contained in:
parent
4e0c7771bb
commit
259210dc2d
@ -436,17 +436,31 @@ fn default_color_map() -> HashMap<u16, RgbColor> {
|
|||||||
/// and we're in control of the write side, which represents
|
/// and we're in control of the write side, which represents
|
||||||
/// input from the interactive user, or pastes.
|
/// input from the interactive user, or pastes.
|
||||||
struct ThreadedWriter {
|
struct ThreadedWriter {
|
||||||
sender: Sender<Vec<u8>>,
|
sender: Sender<WriterMessage>,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum WriterMessage {
|
||||||
|
Data(Vec<u8>),
|
||||||
|
Flush,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ThreadedWriter {
|
impl ThreadedWriter {
|
||||||
fn new(mut writer: Box<dyn std::io::Write + Send>) -> Self {
|
fn new(mut writer: Box<dyn std::io::Write + Send>) -> Self {
|
||||||
let (sender, receiver) = channel::<Vec<u8>>();
|
let (sender, receiver) = channel::<WriterMessage>();
|
||||||
|
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
while let Ok(buf) = receiver.recv() {
|
while let Ok(msg) = receiver.recv() {
|
||||||
if writer.write(&buf).is_err() {
|
match msg {
|
||||||
break;
|
WriterMessage::Data(buf) => {
|
||||||
|
if writer.write(&buf).is_err() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WriterMessage::Flush => {
|
||||||
|
if writer.flush().is_err() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -458,11 +472,15 @@ impl ThreadedWriter {
|
|||||||
impl std::io::Write for ThreadedWriter {
|
impl std::io::Write for ThreadedWriter {
|
||||||
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
|
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
|
||||||
self.sender
|
self.sender
|
||||||
.send(buf.to_vec())
|
.send(WriterMessage::Data(buf.to_vec()))
|
||||||
.map_err(|err| std::io::Error::new(std::io::ErrorKind::BrokenPipe, err))?;
|
.map_err(|err| std::io::Error::new(std::io::ErrorKind::BrokenPipe, err))?;
|
||||||
Ok(buf.len())
|
Ok(buf.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn flush(&mut self) -> std::io::Result<()> {
|
fn flush(&mut self) -> std::io::Result<()> {
|
||||||
|
self.sender
|
||||||
|
.send(WriterMessage::Flush)
|
||||||
|
.map_err(|err| std::io::Error::new(std::io::ErrorKind::BrokenPipe, err))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user