#![cfg(windows)]
extern crate winapi;
extern crate user32;
extern crate kernel32;
use std::io;
use std::slice;
use std::mem;
use std::os::windows::ffi::OsStrExt;
mod utils;
pub mod formats;
pub mod raw;
pub use raw::{
register_format
};
pub struct Clipboard {
inner: ()
}
impl Clipboard {
#[inline]
pub fn new() -> io::Result<Clipboard> {
raw::open().map(|_| Clipboard {inner: ()})
}
#[inline]
pub fn empty(&self) -> io::Result<&Clipboard> {
raw::empty().map(|_| self)
}
#[inline]
pub fn size(&self, format: u32) -> Option<usize> {
raw::size(format)
}
#[inline]
pub fn set(&self, format: u32, data: &[u8]) -> io::Result<()> {
raw::set(format, data)
}
#[inline]
pub fn set_string<T: ?Sized + AsRef<std::ffi::OsStr>>(&self, data: &T) -> io::Result<()> {
let data = data.as_ref();
let mut utf16_buff = data.encode_wide().collect::<Vec<u16>>();
utf16_buff.push(0);
let data = unsafe { slice::from_raw_parts(utf16_buff.as_ptr() as *const u8,
utf16_buff.len() * mem::size_of::<u16>()) };
raw::set(formats::CF_UNICODETEXT, data)
}
#[inline]
pub fn get(&self, format: u32, data: &mut [u8]) -> io::Result<usize> {
raw::get(format, data)
}
#[inline]
pub fn get_string(&self) -> io::Result<String> {
raw::get_string()
}
#[inline]
pub fn enum_formats(&self) -> raw::EnumFormats {
raw::EnumFormats::new()
}
#[inline]
pub fn seq_num() -> Option<u32> {
raw::seq_num()
}
#[inline]
pub fn is_format_avail(format: u32) -> bool {
raw::is_format_avail(format)
}
#[inline]
pub fn count_formats() -> io::Result<i32> {
raw::count_formats()
}
}
impl Drop for Clipboard {
fn drop(&mut self) {
let _ = raw::close();
self.inner
}
}
#[inline]
pub fn get_clipboard_string() -> io::Result<String> {
Clipboard::new()?.get_string()
}
#[inline]
pub fn set_clipboard_string<T: ?Sized + AsRef<std::ffi::OsStr>>(data: &T) -> io::Result<()> {
Clipboard::new()?.set_string(data)
}