Skip to content

Commit

Permalink
Merge pull request #3 from waycrate/freeze-feat-andreas
Browse files Browse the repository at this point in the history
fix: Clipboard flag ignored if path is qualified to file (waycrate#108)
  • Loading branch information
Gigas002 authored Mar 26, 2024
2 parents c9e14cc + 7381159 commit 0faca2f
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 32 deletions.
4 changes: 2 additions & 2 deletions wayshot/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ pub struct Cli {
#[arg(value_name = "OUTPUT", verbatim_doc_comment)]
pub file: Option<PathBuf>,

/// Copy image to clipboard along with [OUTPUT] or stdout.
/// Wayshot persists in the background to offer the image till the clipboard is overwritten.
/// Copy image to clipboard. Can be used simultaneously with [OUTPUT] or stdout.
/// Wayshot persists in the background offering the image till the clipboard is overwritten.
#[arg(long, verbatim_doc_comment)]
pub clipboard: bool,

Expand Down
76 changes: 46 additions & 30 deletions wayshot/src/wayshot.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use std::{
fs::File,
io::{stdout, BufWriter, Cursor, Write},
process::Command,
};
Expand Down Expand Up @@ -126,43 +127,58 @@ fn main() -> Result<()> {
}
};

let mut image_buf: Option<Cursor<Vec<u8>>> = None;
if let Some(file) = file {
image_buffer.save(file)?;
} else {
} else if stdout_print {
let mut buffer = Cursor::new(Vec::new());
image_buffer.write_to(&mut buffer, requested_encoding)?;
let stdout = stdout();
let mut writer = BufWriter::new(stdout.lock());
writer.write_all(buffer.get_ref())?;
image_buf = Some(buffer);
}

if stdout_print {
let stdout = stdout();
let mut writer = BufWriter::new(stdout.lock());
writer.write_all(buffer.get_ref())?;
}
if cli.clipboard {
let mut opts = Options::new();
match unsafe { fork() } {
// Having the image persistently available on the clipboard requires a wayshot process to be alive.
// Fork the process with a child detached from the main process and have the parent exit
Ok(ForkResult::Parent { .. }) => {
return Ok(());
}
Ok(ForkResult::Child) => {
opts.foreground(true); // Offer the image till something else is available on the clipboard
opts.copy(
Source::Bytes(buffer.into_inner().into()),
MimeType::Autodetect,
)?;
}
Err(e) => {
tracing::warn!("Fork failed with error: {e}, couldn't offer image on the clipboard persistently.
Use a clipboard manager to record screenshot.");
opts.copy(
Source::Bytes(buffer.into_inner().into()),
MimeType::Autodetect,
)?;
}
if cli.clipboard {
clipboard_daemonize(match image_buf {
Some(buf) => buf,
None => {
let mut buffer = Cursor::new(Vec::new());
image_buffer.write_to(&mut buffer, requested_encoding)?;
buffer
}
}
})?;
}

Ok(())
}

/// Daemonize and copy the given buffer containing the encoded image to the clipboard
fn clipboard_daemonize(buffer: Cursor<Vec<u8>>) -> Result<()> {
let mut opts = Options::new();
match unsafe { fork() } {
// Having the image persistently available on the clipboard requires a wayshot process to be alive.
// Fork the process with a child detached from the main process and have the parent exit
Ok(ForkResult::Parent { .. }) => {
return Ok(());
}
Ok(ForkResult::Child) => {
opts.foreground(true); // Offer the image till something else is available on the clipboard
opts.copy(
Source::Bytes(buffer.into_inner().into()),
MimeType::Autodetect,
)?;
}
Err(e) => {
tracing::warn!(
"Fork failed with error: {e}, couldn't offer image on the clipboard persistently.
Use a clipboard manager to record screenshot."
);
opts.copy(
Source::Bytes(buffer.into_inner().into()),
MimeType::Autodetect,
)?;
}
}
Ok(())
}

0 comments on commit 0faca2f

Please sign in to comment.