Skip to main content

DataControl

Struct DataControl 

Source
pub struct DataControl { /* private fields */ }
Expand description

A connection to the Wayland compositor’s clipboard.

Connecting spawns one thread that owns the Wayland connection. Dropping the handle stops and joins it.

use lamco_data_control::{Content, DataControl};

let clipboard = DataControl::connect()?;
clipboard.set_selection(Content::new().data("text/plain;charset=utf-8", "hello"))?;

Implementations§

Source§

impl DataControl

Source

pub fn connect() -> Result<Self>

Connect with the default Options.

§Errors

See Error: no compositor, no data-control protocol, or no seat.

Examples found in repository?
examples/paste.rs (line 6)
5fn main() -> lamco_data_control::Result<()> {
6    let clipboard = DataControl::connect()?;
7    println!("protocol: {}", clipboard.protocol());
8    println!("offered: {:?}", clipboard.selection_mime_types());
9    match clipboard.read("text/plain;charset=utf-8")? {
10        Some(bytes) => println!("{}", String::from_utf8_lossy(&bytes)),
11        None => println!("no text on the clipboard"),
12    }
13    Ok(())
14}
More examples
Hide additional examples
examples/copy.rs (line 9)
5fn main() -> lamco_data_control::Result<()> {
6    let text = std::env::args()
7        .nth(1)
8        .unwrap_or_else(|| "hello".to_owned());
9    let clipboard = DataControl::connect()?;
10    clipboard.set_selection(
11        Content::new()
12            .data("text/plain;charset=utf-8", text.clone())
13            .data("text/plain", text),
14    )?;
15    println!("clipboard set; press Ctrl-C to release it");
16    std::thread::park();
17    Ok(())
18}
Source

pub fn connect_with(options: &Options) -> Result<Self>

Connect with explicit options.

§Errors

See Error: no compositor, no data-control protocol, or no seat.

Source

pub fn protocol(&self) -> Protocol

The protocol the compositor is speaking.

Examples found in repository?
examples/paste.rs (line 7)
5fn main() -> lamco_data_control::Result<()> {
6    let clipboard = DataControl::connect()?;
7    println!("protocol: {}", clipboard.protocol());
8    println!("offered: {:?}", clipboard.selection_mime_types());
9    match clipboard.read("text/plain;charset=utf-8")? {
10        Some(bytes) => println!("{}", String::from_utf8_lossy(&bytes)),
11        None => println!("no text on the clipboard"),
12    }
13    Ok(())
14}
Source

pub fn selection_mime_types(&self) -> Vec<String>

MIME types the current selection offers; empty if there is none.

Examples found in repository?
examples/paste.rs (line 8)
5fn main() -> lamco_data_control::Result<()> {
6    let clipboard = DataControl::connect()?;
7    println!("protocol: {}", clipboard.protocol());
8    println!("offered: {:?}", clipboard.selection_mime_types());
9    match clipboard.read("text/plain;charset=utf-8")? {
10        Some(bytes) => println!("{}", String::from_utf8_lossy(&bytes)),
11        None => println!("no text on the clipboard"),
12    }
13    Ok(())
14}
Source

pub fn serial(&self) -> u32

A counter that increases on every selection change.

Source

pub fn on_change(&self, callback: impl Fn(Vec<String>) + Send + Sync + 'static)

Call callback with the offered MIME types whenever another client changes the selection.

A selection this handle set itself is not reported; it still advances serial and updates selection_mime_types.

The callback runs on the worker thread and must not block.

Source

pub fn on_transfer( &self, callback: impl Fn(TransferRequest) + Send + Sync + 'static, )

Call callback when something pastes a type that was advertised without data.

The callback runs on the worker thread and must not block; hand the request to another thread and answer it there.

Source

pub fn set_selection(&self, content: Content) -> Result<()>

Become the clipboard owner and offer content.

§Errors

Error::Stopped if the worker has shut down.

Examples found in repository?
examples/copy.rs (lines 10-14)
5fn main() -> lamco_data_control::Result<()> {
6    let text = std::env::args()
7        .nth(1)
8        .unwrap_or_else(|| "hello".to_owned());
9    let clipboard = DataControl::connect()?;
10    clipboard.set_selection(
11        Content::new()
12            .data("text/plain;charset=utf-8", text.clone())
13            .data("text/plain", text),
14    )?;
15    println!("clipboard set; press Ctrl-C to release it");
16    std::thread::park();
17    Ok(())
18}
Source

pub fn update_data( &self, mime_type: impl Into<String>, data: impl Into<Vec<u8>>, ) -> Result<()>

Add data for a type after set_selection, without replacing the selection.

§Errors

Error::Stopped if the worker has shut down.

Source

pub fn clear_selection(&self) -> Result<()>

Give up the selection if this handle still owns it.

§Errors

Error::Stopped if the worker has shut down.

Source

pub fn read(&self, mime_type: &str) -> Result<Option<Vec<u8>>>

Read the current selection as mime_type.

Charset differences are tolerated, see find_mime_match. Returns Ok(None) when there is no selection or it does not offer the type.

§Errors

Error::TooLarge past the size limit, Error::Timeout if the source stalls for five seconds, Error::Stopped if the worker has shut down, Error::Io for pipe failures.

Examples found in repository?
examples/paste.rs (line 9)
5fn main() -> lamco_data_control::Result<()> {
6    let clipboard = DataControl::connect()?;
7    println!("protocol: {}", clipboard.protocol());
8    println!("offered: {:?}", clipboard.selection_mime_types());
9    match clipboard.read("text/plain;charset=utf-8")? {
10        Some(bytes) => println!("{}", String::from_utf8_lossy(&bytes)),
11        None => println!("no text on the clipboard"),
12    }
13    Ok(())
14}

Trait Implementations§

Source§

impl Debug for DataControl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for DataControl

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more