Open Source › Lamco RDP › Clipboard-core
lamco-clipboard-core
Protocol-agnostic clipboard utilities — the sink trait, format conversion, and loop detection
One clipboard trait, any backend
Clipboard integration on Linux means bridging several backends: XDG Desktop Portal, X11, Wayland wl-data-device, or a headless/memory implementation for tests. lamco-clipboard-core factors out the protocol-agnostic core so any backend can implement the same ClipboardSink trait, while consumer code (like the IronRDP CLIPRDR integration) stays backend-agnostic.
What’s inside
ClipboardSink traitAbstract clipboard backend interface — 7 async methods
FormatConverterMIME ↔ Windows clipboard format conversion
LoopDetectorPrevent bidirectional sync loops via SHA256 content hashing
TransferEngineChunked transfer for large clipboard payloads with progress tracking
Quick start
[dependencies]
lamco-clipboard-core = "0.6"
# For PNG/JPEG/BMP ↔ DIB conversion:
lamco-clipboard-core = { version = "0.6", features = ["image"] }
use lamco_clipboard_core::{FormatConverter, LoopDetector};
use lamco_clipboard_core::formats::{mime_to_rdp_formats, rdp_format_to_mime, CF_UNICODETEXT};
// Convert MIME types to RDP clipboard formats
let formats = mime_to_rdp_formats(&["text/plain", "text/html"]);
// Convert RDP format back to MIME
let mime = rdp_format_to_mime(CF_UNICODETEXT);
assert_eq!(mime, Some("text/plain;charset=utf-8"));
// Prevent sync loops
let mut detector = LoopDetector::new();
if !detector.would_cause_loop(&formats) {
// Safe to sync clipboard content
}
use lamco_clipboard_core::FormatConverter;
let converter = FormatConverter::new();
let unicode = converter.text_to_unicode("Hello, World!").unwrap();
let text = converter.unicode_to_text(&unicode).unwrap();
assert_eq!(text, "Hello, World!");
Feature flags
| Feature | Description |
|---|---|
| (default) | Text conversion, loop detection, transfer engine |
| image | PNG / JPEG / BMP / GIF ↔ Windows DIB for clipboard image sync |