Skip to content

Sending multiple messages to ExternalPrinter causes full screen wipes #1005

@wtfbbqhax

Description

@wtfbbqhax

I've been encountering this issue in my own application for some time, and thought it was just a mistake in my implementation.

What follows is my minimal reproduction.

ExternalPrint.fullscreen.wipes.mov
use std::sync::{
    Arc,
    atomic::{AtomicBool, Ordering},
};
use std::thread;
use std::time::Duration;

use reedline::ExternalPrinter;
use reedline::{DefaultPrompt, Reedline, Signal};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let printer = ExternalPrinter::default();
    let printer_tx = printer.sender();
    let running = Arc::new(AtomicBool::new(true));

    let sync_thread = {
        let printer_tx = printer_tx.clone();
        let running = running.clone();
        thread::spawn(move || {
            while running.load(Ordering::Relaxed) {
                thread::sleep(Duration::from_secs(1));
                let _ = printer_tx.send("event1".to_string());
                let _ = printer_tx.send("event2".to_string()); // Tends to trigger the issue.
            }
        })
    };

    let mut line_editor = Reedline::create().with_external_printer(printer);
    let prompt = DefaultPrompt::default();

    loop {
        match line_editor.read_line(&prompt) {
            Ok(Signal::Success(line)) => {
                if matches!(line.trim(), "exit" | "quit") {
                    break;
                }
            }
            Ok(Signal::CtrlD) | Ok(Signal::CtrlC) => break,
            _ => break,
        }
    }

    running.store(false, Ordering::Relaxed);
    let _ = sync_thread.join();
    Ok(())
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions