Giter Site home page Giter Site logo

wl-clipboard-rs's Introduction

wl-clipboard-rs

crates.io Build Status Documentation

Documentation (master)

A safe Rust crate for working with the Wayland clipboard.

This crate is intended to be used by terminal applications, clipboard managers and other utilities which don't spawn Wayland surfaces (windows). If your application has a window, please use the appropriate Wayland protocols for interacting with the Wayland clipboard (wl_data_device from the core Wayland protocol, the primary_selection protocol for the primary selection), for example via the smithay-clipboard crate.

The protocol used for clipboard interaction is data-control from wlroots. When using the regular clipboard, the compositor must support the first version of the protocol. When using the "primary" clipboard, the compositor must support the second version of the protocol (or higher).

For example applications using these features, see wl-clipboard-rs-tools/src/bin/wl_copy.rs and wl-clipboard-rs-tools/src/bin/wl_paste.rs which implement terminal apps similar to wl-clipboard or wl-clipboard-rs-tools/src/bin/wl_clip.rs which implements a Wayland version of xclip.

The Rust implementation of the Wayland client is used by default; use the native_lib feature to link to libwayland-client.so for communication instead. A dlopen feature is also available for loading libwayland-client.so dynamically at runtime rather than linking to it.

The code of the crate itself (and the code of the example utilities) is 100% safe Rust. This doesn't include the dependencies.

Examples

Copying to the regular clipboard:

use wl_clipboard_rs::copy::{MimeType, Options, Source};

let opts = Options::new();
opts.copy(Source::Bytes("Hello world!".to_string().into_bytes().into()), MimeType::Autodetect)?;

Pasting plain text from the regular clipboard:

use std::io::Read;
use wl_clipboard_rs::{paste::{get_contents, ClipboardType, Error, MimeType, Seat}};

let result = get_contents(ClipboardType::Regular, Seat::Unspecified, MimeType::Text);
match result {
    Ok((mut pipe, _)) => {
        let mut contents = vec![];
        pipe.read_to_end(&mut contents)?;
        println!("Pasted: {}", String::from_utf8_lossy(&contents));
    }

    Err(Error::NoSeats) | Err(Error::ClipboardEmpty) | Err(Error::NoMimeType) => {
        // The clipboard is empty or doesn't contain text, nothing to worry about.
    }

    Err(err) => Err(err)?
}

Checking if the "primary" clipboard is supported (note that this might be unnecessary depending on your crate usage, the regular copying and pasting functions do report if the primary selection is unsupported when it is requested):

use wl_clipboard_rs::utils::{is_primary_selection_supported, PrimarySelectionCheckError};

match is_primary_selection_supported() {
    Ok(supported) => {
        // We have our definitive result. False means that either data-control version 1
        // is present (which does not support the primary selection), or that data-control
        // version 2 is present and it did not signal the primary selection support.
    },
    Err(PrimarySelectionCheckError::NoSeats) => {
        // Impossible to give a definitive result. Primary selection may or may not be
        // supported.

        // The required protocol (data-control version 2) is there, but there are no seats.
        // Unfortunately, at least one seat is needed to check for the primary clipboard
        // support.
    },
    Err(PrimarySelectionCheckError::MissingProtocol { .. }) => {
        // The data-control protocol (required for wl-clipboard-rs operation) is not
        // supported by the compositor.
    },
    Err(_) => {
        // Some communication error occurred.
    }
}

Included terminal utilities

  • wl-paste: implements wl-paste from wl-clipboard.
  • wl-copy: implements wl-copy from wl-clipboard.
  • wl-clip: a Wayland version of xclip.

Stuff that would be neat to add:

  • Utility that mimics xsel commandline flags.

License: MIT/Apache-2.0

wl-clipboard-rs's People

Contributors

yalter avatar piegamesde avatar bugaevc avatar alexanderkjall avatar dnut avatar 7b4software avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.