use eyre::Result;
use rustix::runtime::{self, Fork};
use wl_clipboard_rs::copy::{MimeType, Options, Source};
use crate::utils::EncodingFormat;
fn mime_type_for_encoding(encoding: EncodingFormat) -> MimeType {
let mime_str = match encoding {
#[cfg(feature = "jpeg")]
EncodingFormat::Jpg => "image/jpeg",
EncodingFormat::Png => "image/png",
#[cfg(feature = "pnm")]
EncodingFormat::Ppm => "image/x-portable-pixmap",
#[cfg(feature = "qoi")]
EncodingFormat::Qoi => "image/qoi",
#[cfg(feature = "webp")]
EncodingFormat::Webp => "image/webp",
#[cfg(feature = "avif")]
EncodingFormat::Avif => "image/avif",
#[cfg(feature = "jxl")]
EncodingFormat::Jxl => "image/jxl",
};
MimeType::Specific(mime_str.to_string())
}
pub fn copy_to_clipboard(data: Vec<u8>, encoding: EncodingFormat) -> Result<()> {
let mime = mime_type_for_encoding(encoding);
let mut opts = Options::new();
match unsafe { runtime::kernel_fork() } {
Ok(Fork::ParentOf(_)) => {
}
Ok(Fork::Child(_)) => {
opts.foreground(true);
opts.copy(Source::Bytes(data.into()), mime)?;
}
Err(e) => {
tracing::warn!(
"Fork failed ({e}): image will only be available on the clipboard \
until wayshot exits. Use a clipboard manager to persist it."
);
opts.copy(Source::Bytes(data.into()), mime)?;
}
}
Ok(())
}