mirror of
https://github.com/asciinema/asciinema.git
synced 2025-12-16 11:48:13 +01:00
Use blocking stdout instead of non-blocking tty for output in the player
Fixes `asciinema play` for some cases.
This commit is contained in:
@@ -3,7 +3,7 @@ use crate::tty::Tty;
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use nix::sys::select::{pselect, FdSet};
|
use nix::sys::select::{pselect, FdSet};
|
||||||
use nix::sys::time::{TimeSpec, TimeValLike};
|
use nix::sys::time::{TimeSpec, TimeValLike};
|
||||||
use std::io;
|
use std::io::{self, Write};
|
||||||
use std::os::unix::io::AsRawFd;
|
use std::os::unix::io::AsRawFd;
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
@@ -15,6 +15,7 @@ pub fn play(
|
|||||||
pause_on_markers: bool,
|
pause_on_markers: bool,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut events = open_recording(recording, speed, idle_time_limit)?;
|
let mut events = open_recording(recording, speed, idle_time_limit)?;
|
||||||
|
let mut stdout = io::stdout();
|
||||||
let mut epoch = Instant::now();
|
let mut epoch = Instant::now();
|
||||||
let mut pause_elapsed_time: Option<u64> = None;
|
let mut pause_elapsed_time: Option<u64> = None;
|
||||||
let mut next_event = events.next().transpose()?;
|
let mut next_event = events.next().transpose()?;
|
||||||
@@ -24,7 +25,7 @@ pub fn play(
|
|||||||
match read_key(&mut tty, 1_000_000)? {
|
match read_key(&mut tty, 1_000_000)? {
|
||||||
Some(0x03) => {
|
Some(0x03) => {
|
||||||
// ctrl+c - stop
|
// ctrl+c - stop
|
||||||
tty.write_all("\r\n".as_bytes())?;
|
stdout.write_all("\r\n".as_bytes())?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,8 +40,8 @@ pub fn play(
|
|||||||
pause_elapsed_time = Some(*time);
|
pause_elapsed_time = Some(*time);
|
||||||
|
|
||||||
if code == &EventCode::Output {
|
if code == &EventCode::Output {
|
||||||
tty.write_all(data.as_bytes())?;
|
stdout.write_all(data.as_bytes())?;
|
||||||
tty.flush()?;
|
stdout.flush()?;
|
||||||
}
|
}
|
||||||
|
|
||||||
next_event = events.next().transpose()?;
|
next_event = events.next().transpose()?;
|
||||||
@@ -53,7 +54,7 @@ pub fn play(
|
|||||||
|
|
||||||
match code {
|
match code {
|
||||||
EventCode::Output => {
|
EventCode::Output => {
|
||||||
tty.write_all(data.as_bytes())?;
|
stdout.write_all(data.as_bytes())?;
|
||||||
}
|
}
|
||||||
|
|
||||||
EventCode::Marker => {
|
EventCode::Marker => {
|
||||||
@@ -65,7 +66,7 @@ pub fn play(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tty.flush()?;
|
stdout.flush()?;
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => (),
|
_ => (),
|
||||||
@@ -75,12 +76,12 @@ pub fn play(
|
|||||||
let delay = *time as i64 - epoch.elapsed().as_micros() as i64;
|
let delay = *time as i64 - epoch.elapsed().as_micros() as i64;
|
||||||
|
|
||||||
if delay > 0 {
|
if delay > 0 {
|
||||||
tty.flush()?;
|
stdout.flush()?;
|
||||||
|
|
||||||
match read_key(&mut tty, delay)? {
|
match read_key(&mut tty, delay)? {
|
||||||
Some(0x03) => {
|
Some(0x03) => {
|
||||||
// ctrl+c - stop
|
// ctrl+c - stop
|
||||||
tty.write_all("\r\n".as_bytes())?;
|
stdout.write_all("\r\n".as_bytes())?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +101,7 @@ pub fn play(
|
|||||||
|
|
||||||
match code {
|
match code {
|
||||||
EventCode::Output => {
|
EventCode::Output => {
|
||||||
tty.write_all(data.as_bytes())?;
|
stdout.write_all(data.as_bytes())?;
|
||||||
}
|
}
|
||||||
|
|
||||||
EventCode::Marker => {
|
EventCode::Marker => {
|
||||||
|
|||||||
Reference in New Issue
Block a user