#clipboard #wayland #wayland-client #terminal #applications #communication #utilities

wl-clipboard-rs

为终端和其他无窗口应用程序提供对Wayland剪贴板的访问

12个版本 (破坏性)

0.9.0 2024年6月19日
0.8.1 2024年3月7日
0.8.0 2023年10月3日
0.7.0 2022年9月24日
0.2.0 2019年2月17日

#34操作系统

Download history 23743/week @ 2024-04-30 22221/week @ 2024-05-07 25022/week @ 2024-05-14 21765/week @ 2024-05-21 20330/week @ 2024-05-28 20059/week @ 2024-06-04 18607/week @ 2024-06-11 19327/week @ 2024-06-18 17328/week @ 2024-06-25 19256/week @ 2024-07-02 17003/week @ 2024-07-09 18543/week @ 2024-07-16 18173/week @ 2024-07-23 18343/week @ 2024-07-30 19697/week @ 2024-08-06 17112/week @ 2024-08-13

每月76,380 次下载
用于 87 个crate(14个直接使用)

MIT/Apache

125KB
2.5K SLoC

wl-clipboard-rs

crates.io Build Status Documentation

文档(master)

一个用于与Wayland剪贴板一起工作的安全Rust包。

此包旨在由终端应用程序、剪贴板管理器和其他不创建Wayland表面(窗口)的实用程序使用。如果您的应用程序有窗口,请使用适当的Wayland协议与Wayland剪贴板进行交互(来自核心Wayland协议的wl_data_device,用于主选择的primary_selection协议),例如通过smithay-clipboard crate。

用于剪贴板交互的协议是来自wlrootsdata-control。当使用常规剪贴板时,合成器必须支持协议的第一版。当使用“主”剪贴板时,合成器必须支持协议的第二版(或更高版)。

例如,使用这些功能的示例应用程序请参阅wl-clipboard-rs-tools/src/bin/wl_copy.rswl-clipboard-rs-tools/src/bin/wl_paste.rs,它们实现了类似于wl-clipboard的终端应用程序,或者wl-clipboard-rs-tools/src/bin/wl_clip.rs,它实现了xclip的Wayland版本。

默认情况下使用Rust客户端的实现;使用native_lib功能将libwayland-client.so链接到用于通信。还提供了一个dlopen功能,用于在运行时动态加载而不是链接到libwayland-client.so

包本身的代码(以及示例实用程序的代码)是100%安全Rust。不包括依赖项。

示例

复制到常规剪贴板

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)?;

从常规剪贴板粘贴纯文本

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)?
}

检查是否支持“主要”剪贴板(注意,这可能取决于你的crate使用情况,常规的复制和粘贴函数在请求时会报告主要选择是否不受支持)

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.
    }
}

包含的终端实用程序

  • wl-paste:实现了来自wl-clipboardwl-paste
  • wl-copy:实现了来自wl-clipboardwl-copy
  • wl-clip:是xclip的Wayland版本。

想要添加的功能

  • 模仿xsel命令行标志的实用程序。

许可证:MIT/Apache-2.0

依赖项

~7–16MB
~215K SLoC