From e26ba5c49792d58f429bec7f8f99ec302cb0a02a Mon Sep 17 00:00:00 2001 From: Yuwei B Date: Sun, 28 Aug 2022 04:22:07 +1000 Subject: [PATCH 1/2] buff output --- Cargo.lock | 31 +++++++++++++++++++++++++++---- src/commands/play.rs | 1 + src/commands/record.rs | 20 +++++++++++++++++--- src/terminal/impl_win/terminal.rs | 9 ++++++--- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 631bcbe..c9bd5fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,7 @@ version = "0.1.7" dependencies = [ "base64", "clap", + "ctrlc", "fern", "log", "os_info", @@ -33,9 +34,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" @@ -125,6 +126,16 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +[[package]] +name = "ctrlc" +version = "3.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d91974fbbe88ec1df0c24a4f00f99583667a7e2e6272b2b92d294d81e462173" +dependencies = [ + "nix", + "winapi", +] + [[package]] name = "dirs-next" version = "1.0.2" @@ -428,9 +439,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" @@ -499,6 +510,18 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nix" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb" +dependencies = [ + "autocfg", + "bitflags", + "cfg-if", + "libc", +] + [[package]] name = "num_cpus" version = "1.13.1" diff --git a/src/commands/play.rs b/src/commands/play.rs index 5a7e473..ec25683 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 log::info; 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..43f4e87 100644 --- a/src/commands/record.rs +++ b/src/commands/record.rs @@ -1,7 +1,7 @@ use std::path::Path; use std::process::exit; -use log::{error, trace}; +use log::{debug, error, info, trace, warn}; use std::sync::mpsc::channel; use std::sync::Mutex; use std::time::SystemTime; @@ -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..82cfff6 100644 --- a/src/terminal/impl_win/terminal.rs +++ b/src/terminal/impl_win/terminal.rs @@ -19,9 +19,10 @@ 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, DISABLE_NEWLINE_AUTO_RETURN, + ENABLE_ECHO_INPUT, ENABLE_LINE_INPUT, ENABLE_LVB_GRID_WORLDWIDE, ENABLE_PROCESSED_INPUT, + ENABLE_PROCESSED_OUTPUT, ENABLE_VIRTUAL_TERMINAL_INPUT, ENABLE_VIRTUAL_TERMINAL_PROCESSING, + ENABLE_WRAP_AT_EOL_OUTPUT, HPCON, }; use windows::Win32::System::Pipes::CreatePipe; use windows::Win32::System::Threading::{ @@ -160,6 +161,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"); From e37cd14ac870aceb1ae80dfeff2de9fee35f868e Mon Sep 17 00:00:00 2001 From: Yuwei B Date: Sun, 28 Aug 2022 04:22:55 +1000 Subject: [PATCH 2/2] cargo fix --- Cargo.lock | 23 ----------------------- src/commands/play.rs | 2 +- src/commands/record.rs | 2 +- src/terminal/impl_win/terminal.rs | 7 +++---- 4 files changed, 5 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c9bd5fa..1d9a712 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,6 @@ version = "0.1.7" dependencies = [ "base64", "clap", - "ctrlc", "fern", "log", "os_info", @@ -126,16 +125,6 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" -[[package]] -name = "ctrlc" -version = "3.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d91974fbbe88ec1df0c24a4f00f99583667a7e2e6272b2b92d294d81e462173" -dependencies = [ - "nix", - "winapi", -] - [[package]] name = "dirs-next" version = "1.0.2" @@ -510,18 +499,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "nix" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb" -dependencies = [ - "autocfg", - "bitflags", - "cfg-if", - "libc", -] - [[package]] name = "num_cpus" version = "1.13.1" diff --git a/src/commands/play.rs b/src/commands/play.rs index ec25683..bf86b3a 100644 --- a/src/commands/play.rs +++ b/src/commands/play.rs @@ -4,7 +4,7 @@ use std::fs::File; use std::io; use std::io::{BufRead, Write}; -use log::info; + 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 43f4e87..ff94c56 100644 --- a/src/commands/record.rs +++ b/src/commands/record.rs @@ -1,7 +1,7 @@ use std::path::Path; use std::process::exit; -use log::{debug, error, info, trace, warn}; +use log::{error, trace}; use std::sync::mpsc::channel; use std::sync::Mutex; use std::time::SystemTime; diff --git a/src/terminal/impl_win/terminal.rs b/src/terminal/impl_win/terminal.rs index 82cfff6..8b9ad6d 100644 --- a/src/terminal/impl_win/terminal.rs +++ b/src/terminal/impl_win/terminal.rs @@ -19,10 +19,9 @@ use windows::Win32::Storage::FileSystem::{ }; use windows::Win32::System::Console::{ ClosePseudoConsole, CreatePseudoConsole, GetConsoleMode, GetConsoleScreenBufferInfo, - SetConsoleMode, CONSOLE_MODE, CONSOLE_SCREEN_BUFFER_INFO, COORD, DISABLE_NEWLINE_AUTO_RETURN, - ENABLE_ECHO_INPUT, ENABLE_LINE_INPUT, ENABLE_LVB_GRID_WORLDWIDE, ENABLE_PROCESSED_INPUT, - ENABLE_PROCESSED_OUTPUT, ENABLE_VIRTUAL_TERMINAL_INPUT, ENABLE_VIRTUAL_TERMINAL_PROCESSING, - ENABLE_WRAP_AT_EOL_OUTPUT, 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::{