diff --git a/Cargo.lock b/Cargo.lock index 631bcbe..1d9a712 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -33,9 +33,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" @@ -428,9 +428,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" [[package]] name = "log" diff --git a/src/commands/play.rs b/src/commands/play.rs index 5a7e473..bf86b3a 100644 --- a/src/commands/play.rs +++ b/src/commands/play.rs @@ -4,6 +4,7 @@ use std::fs::File; use std::io; use std::io::{BufRead, Write}; + use std::path::Path; use std::process::exit; use std::sync::{Condvar, Mutex}; diff --git a/src/commands/record.rs b/src/commands/record.rs index 2a390bd..ff94c56 100644 --- a/src/commands/record.rs +++ b/src/commands/record.rs @@ -112,6 +112,7 @@ impl Record { let output_writer = self.output_writer.clone(); let filename = self.filename.clone(); + let mut left: Vec = vec![]; thread::spawn(move || loop { let mut stdout = std::io::stdout(); @@ -125,6 +126,19 @@ impl Record { break; } + let buf_with_left = &[&left, &buf[..len]].concat(); + let to_write = match std::str::from_utf8(&buf_with_left) { + Ok(_) => buf_with_left, + Err(err) => { + let bad_bytes = buf_with_left.len() - err.valid_up_to(); + left.resize(bad_bytes, 0); + left.clone_from_slice( + &buf_with_left[buf_with_left.len() - bad_bytes..], + ); + &buf_with_left[..err.valid_up_to()] + } + }; + let now = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .expect("check your machine time"); @@ -132,7 +146,7 @@ impl Record { let ts = now.as_secs() as f64 + now.subsec_nanos() as f64 * 1e-9 - record_start_time; // https://github.com/asciinema/asciinema/blob/5a385765f050e04523c9d74fbf98d5afaa2deff0/asciinema/asciicast/v2.py#L119 - let chars = String::from_utf8_lossy(&buf[..len]).to_string(); + let chars = String::from_utf8_lossy(&to_write).to_string(); let data = vec![ LineItem::F64(ts), LineItem::String("o".to_string()), @@ -145,7 +159,7 @@ impl Record { .write(line.as_bytes()) .unwrap(); - stdout.write(&buf[..len]).expect("failed to write stdout"); + stdout.write(&to_write).expect("failed to write stdout"); stdout.flush().expect("failed to flush stdout"); } diff --git a/src/terminal/impl_win/terminal.rs b/src/terminal/impl_win/terminal.rs index e707649..8b9ad6d 100644 --- a/src/terminal/impl_win/terminal.rs +++ b/src/terminal/impl_win/terminal.rs @@ -19,9 +19,9 @@ use windows::Win32::Storage::FileSystem::{ }; use windows::Win32::System::Console::{ ClosePseudoConsole, CreatePseudoConsole, GetConsoleMode, GetConsoleScreenBufferInfo, - SetConsoleMode, CONSOLE_MODE, CONSOLE_SCREEN_BUFFER_INFO, COORD, ENABLE_ECHO_INPUT, - ENABLE_LINE_INPUT, ENABLE_PROCESSED_INPUT, ENABLE_PROCESSED_OUTPUT, - ENABLE_VIRTUAL_TERMINAL_INPUT, ENABLE_VIRTUAL_TERMINAL_PROCESSING, HPCON, + SetConsoleMode, CONSOLE_MODE, CONSOLE_SCREEN_BUFFER_INFO, COORD, + ENABLE_ECHO_INPUT, ENABLE_LINE_INPUT, ENABLE_PROCESSED_INPUT, + ENABLE_PROCESSED_OUTPUT, ENABLE_VIRTUAL_TERMINAL_INPUT, ENABLE_VIRTUAL_TERMINAL_PROCESSING, HPCON, }; use windows::Win32::System::Pipes::CreatePipe; use windows::Win32::System::Threading::{ @@ -160,6 +160,8 @@ impl WindowsTerminal { console_mode |= ENABLE_PROCESSED_OUTPUT; console_mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + //console_mode |= DISABLE_NEWLINE_AUTO_RETURN; + //console_mode &= !ENABLE_WRAP_AT_EOL_OUTPUT; SetConsoleMode(handle, console_mode).expect("set console mode");