Skip to content

Commit

Permalink
add get_html support for Wayland (#2)
Browse files Browse the repository at this point in the history
  • Loading branch information
acarl005 authored Feb 29, 2024
1 parent ab5d827 commit ed3b752
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 31 deletions.
101 changes: 84 additions & 17 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ image = { version = "0.24", optional = true, default-features = false, features
log = "0.4"
x11rb = { version = "0.12" }
wl-clipboard-rs = { version = "0.8", optional = true }
os_pipe = { version = "1.1.5" }
image = { version = "0.24", optional = true, default-features = false, features = ["png"] }
parking_lot = "0.12"

Expand Down
2 changes: 1 addition & 1 deletion src/platform/linux/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ impl<'clipboard> Get<'clipboard> {
match self.clipboard {
Clipboard::X11(clipboard) => clipboard.get_html(self.selection),
#[cfg(feature = "wayland-data-control")]
Clipboard::WlDataControl(clipboard) => Err("not implemented"),
Clipboard::WlDataControl(clipboard) => clipboard.get_html(self.selection),
}
}

Expand Down
43 changes: 30 additions & 13 deletions src/platform/linux/wayland.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ use wl_clipboard_rs::{
#[cfg(feature = "image-data")]
use super::encode_as_png;
use super::{into_unknown, LinuxClipboardKind};
use crate::common::Error;
#[cfg(feature = "image-data")]
use crate::common::ImageData;
use crate::common::{Error, HTMLData};

#[cfg(feature = "image-data")]
const MIME_PNG: &str = "image/png";
Expand Down Expand Up @@ -58,21 +58,18 @@ impl Clipboard {
use wl_clipboard_rs::paste::MimeType;

let result = get_contents(selection.try_into()?, Seat::Unspecified, MimeType::Text);
match result {
Ok((mut pipe, _)) => {
let mut contents = vec![];
pipe.read_to_end(&mut contents).map_err(into_unknown)?;
String::from_utf8(contents).map_err(|_| Error::ConversionFailure)
}
process_result(result)
}

Err(PasteError::ClipboardEmpty) | Err(PasteError::NoMimeType) => {
Err(Error::ContentNotAvailable)
}
pub(crate) fn get_html(&mut self, selection: LinuxClipboardKind) -> Result<HTMLData, Error> {
use wl_clipboard_rs::paste::MimeType;

Err(PasteError::PrimarySelectionUnsupported) => Err(Error::ClipboardNotSupported),
let html_result =
get_contents(selection.try_into()?, Seat::Unspecified, MimeType::Specific("text/html"));
let mut result = HTMLData::from_html(process_result(html_result)?);

Err(err) => Err(Error::Unknown { description: err.to_string() }),
}
result.alt_text = self.get_text(selection)?;
Ok(result)
}

pub(crate) fn set_text(
Expand Down Expand Up @@ -174,3 +171,23 @@ impl Clipboard {
Ok(())
}
}

fn process_result(
result: Result<(os_pipe::PipeReader, String), wl_clipboard_rs::paste::Error>,
) -> Result<String, Error> {
match result {
Ok((mut pipe, _)) => {
let mut contents = vec![];
pipe.read_to_end(&mut contents).map_err(into_unknown)?;
String::from_utf8(contents).map_err(|_| Error::ConversionFailure)
}

Err(PasteError::ClipboardEmpty) | Err(PasteError::NoMimeType) => {
Err(Error::ContentNotAvailable)
}

Err(PasteError::PrimarySelectionUnsupported) => Err(Error::ClipboardNotSupported),

Err(err) => Err(Error::Unknown { description: err.to_string() }),
}
}

0 comments on commit ed3b752

Please sign in to comment.