#![allow(dead_code)]
use crate::{SysResult, Getter, Setter};
use crate::types::c_uint;
use core::num::NonZeroU32;
pub trait Format {
fn is_format_avail(&self) -> bool;
}
macro_rules! impl_format {
($($format:ident),+) => {
$(
impl From<$format> for u32 {
#[inline(always)]
fn from(value: $format) -> Self {
(&value).into()
}
}
impl Format for $format {
#[inline(always)]
fn is_format_avail(&self) -> bool {
crate::raw::is_format_avail(self.into())
}
}
)+
};
}
pub const CF_BITMAP: c_uint = 2;
pub const CF_DIB: c_uint = 8;
pub const CF_DIBV5: c_uint = 17;
pub const CF_DIF: c_uint = 5;
pub const CF_DSPBITMAP: c_uint = 0x0082;
pub const CF_DSPENHMETAFILE: c_uint = 0x008E;
pub const CF_DSPMETAFILEPICT: c_uint = 0x0083;
pub const CF_DSPTEXT: c_uint = 0x0081;
pub const CF_ENHMETAFILE: c_uint = 14;
pub const CF_GDIOBJFIRST: c_uint = 0x0300;
pub const CF_GDIOBJLAST: c_uint = 0x03FF;
pub const CF_HDROP: c_uint = 15;
pub const CF_LOCALE: c_uint = 16;
pub const CF_METAFILEPICT: c_uint = 3;
pub const CF_OEMTEXT: c_uint = 7;
pub const CF_OWNERDISPLAY: c_uint = 0x0080;
pub const CF_PALETTE: c_uint = 9;
pub const CF_PENDATA: c_uint = 10;
pub const CF_PRIVATEFIRST: c_uint = 0x0200;
pub const CF_PRIVATELAST: c_uint = 0x02FF;
pub const CF_RIFF: c_uint = 11;
pub const CF_SYLK: c_uint = 4;
pub const CF_TEXT: c_uint = 1;
pub const CF_TIFF: c_uint = 6;
pub const CF_UNICODETEXT: c_uint = 13;
pub const CF_WAVE: c_uint = 12;
#[derive(Copy, Clone)]
pub struct RawData(pub c_uint);
impl<T: AsRef<[u8]>> Setter<T> for RawData {
#[inline(always)]
fn write_clipboard(&self, data: &T) -> SysResult<()> {
crate::raw::set(self.0, data.as_ref())
}
}
impl Getter<alloc::vec::Vec<u8>> for RawData {
#[inline(always)]
fn read_clipboard(&self, out: &mut alloc::vec::Vec<u8>) -> SysResult<usize> {
crate::raw::get_vec(self.0, out)
}
}
impl From<&RawData> for u32 {
#[inline(always)]
fn from(value: &RawData) -> Self {
value.0 as _
}
}
#[derive(Copy, Clone)]
pub struct Unicode;
impl Getter<alloc::vec::Vec<u8>> for Unicode {
#[inline(always)]
fn read_clipboard(&self, out: &mut alloc::vec::Vec<u8>) -> SysResult<usize> {
crate::raw::get_string(out)
}
}
impl Getter<alloc::string::String> for Unicode {
#[inline(always)]
fn read_clipboard(&self, out: &mut alloc::string::String) -> SysResult<usize> {
self.read_clipboard(unsafe { out.as_mut_vec() })
}
}
impl<T: AsRef<str>> Setter<T> for Unicode {
#[inline(always)]
fn write_clipboard(&self, data: &T) -> SysResult<()> {
crate::raw::set_string(data.as_ref())
}
}
impl From<&Unicode> for u32 {
#[inline(always)]
fn from(_: &Unicode) -> Self {
CF_UNICODETEXT
}
}
#[derive(Copy, Clone)]
pub struct FileList;
impl Getter<alloc::vec::Vec<alloc::string::String>> for FileList {
#[inline(always)]
fn read_clipboard(&self, out: &mut alloc::vec::Vec<alloc::string::String>) -> SysResult<usize> {
crate::raw::get_file_list(out)
}
}
#[cfg(feature = "std")]
impl Getter<alloc::vec::Vec<std::path::PathBuf>> for FileList {
#[inline(always)]
fn read_clipboard(&self, out: &mut alloc::vec::Vec<std::path::PathBuf>) -> SysResult<usize> {
crate::raw::get_file_list_path(out)
}
}
impl<T: AsRef<str>> Setter<[T]> for FileList {
#[inline(always)]
fn write_clipboard(&self, data: &[T]) -> SysResult<()> {
crate::raw::set_file_list(data)
}
}
impl From<&FileList> for u32 {
#[inline(always)]
fn from(_: &FileList) -> Self {
CF_HDROP
}
}
#[derive(Copy, Clone)]
pub struct Bitmap;
impl Getter<alloc::vec::Vec<u8>> for Bitmap {
#[inline(always)]
fn read_clipboard(&self, out: &mut alloc::vec::Vec<u8>) -> SysResult<usize> {
crate::raw::get_bitmap(out)
}
}
impl<T: AsRef<[u8]>> Setter<T> for Bitmap {
#[inline(always)]
fn write_clipboard(&self, data: &T) -> SysResult<()> {
crate::raw::set_bitmap(data.as_ref())
}
}
impl From<&Bitmap> for u32 {
#[inline(always)]
fn from(_: &Bitmap) -> Self {
CF_BITMAP
}
}
#[derive(Copy, Clone)]
pub struct Html(NonZeroU32);
impl Html {
#[inline(always)]
pub fn new() -> Option<Self> {
const NAME: [u16; 12] = [72, 84, 77, 76, 32, 70, 111, 114, 109, 97, 116, 0];
unsafe {
crate::raw::register_raw_format(&NAME).map(Self)
}
}
#[inline(always)]
pub fn code(&self) -> u32 {
self.0.get()
}
}
impl Getter<alloc::vec::Vec<u8>> for Html {
#[inline(always)]
fn read_clipboard(&self, out: &mut alloc::vec::Vec<u8>) -> SysResult<usize> {
crate::raw::get_html(self.0.get(), out)
}
}
impl Getter<alloc::string::String> for Html {
#[inline(always)]
fn read_clipboard(&self, out: &mut alloc::string::String) -> SysResult<usize> {
crate::raw::get_html(self.0.get(), unsafe { out.as_mut_vec() })
}
}
impl<T: AsRef<str>> Setter<T> for Html {
#[inline(always)]
fn write_clipboard(&self, data: &T) -> SysResult<()> {
crate::raw::set_html(self.code(), data.as_ref())
}
}
impl From<&Html> for u32 {
#[inline(always)]
fn from(value: &Html) -> Self {
value.code()
}
}
impl_format!(Html, Bitmap, RawData, Unicode, FileList);