1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#![allow(dead_code)]

pub enum ClipboardContentType {
    #[cfg(any(target_os = "linux", target_os = "openbsd"))]
    X11ContentType(X11ContentType),
    #[cfg(target_os = "windows")]
    WinContentType(WinContentType),
    #[cfg(target_os = "macos")]
    MacContent,
}

/// See: https://tronche.com/gui/x/icccm/sec-2.html#s-2
#[cfg(any(target_os = "linux", target_os = "openbsd"))]
pub enum X11ContentType {
    AdobePortableDocumentFormat,
    ApplePict,
    /// A list of pixel values
    Background,
    /// A list of bitmap IDs
    Bitmap,
    /// The start and end of the selection in bytes
    CharacterPosition,
    Class,
    /// Any top-level window owned by the selection owner
    ClientWindow,
    /// A list of colormap IDs
    Colormap,
    /// The start and end column numbers
    ColumnNumber,
    /// Compound Text
    CompoundText,
    Delete,
    /// A list of drawable IDs
    Drawable,
    Eps,
    EpsInterchange,
    /// The full path name of a file
    FileName,
    /// A list of pixel values
    Foreground,
    HostName,
    InsertProperty,
    InsertSelection,
    /// The number of bytes in the selection
    Length,
    /// The start and end line numbers
    LineNumber,
    /// The number of disjoint parts of the selection
    ListLength,
    /// The name of the selected procedure
    Module,
    Multiple,
    Name,
    /// ISO Office Document Interchange Format
    Odif,
    /// The operating system of the owner client
    OwnerOs,
    /// A list of pixmap IDs
    Pixmap,
    Postscript,
    /// The name of the selected procedure
    Procedure,
    /// The process ID of the owner
    Process,
    /// ISO Latin-1 (+TAB+NEWLINE) text
    String,
    /// A list of valid target atoms
    Targets,
    /// The task ID of the owner
    Task,
    /// The text in the owner's choice of encoding
    Text,
    /// The timestamp used to acquire the selection
    Timestamp,
    /// The name of the user running the owner
    User,
}

/// See https://msdn.microsoft.com/en-us/library/windows/desktop/ff729168%28v=vs.85%29.aspx
#[cfg(target_os = "windows")]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum WinContentType {
    ///  A handle to a bitmap (HBITMAP)
    Bitmap,
    /// A memory object containing a BITMAPINFO structure followed by the bitmap bits.
    Dib,
    /// A memory object containing a BITMAPV5HEADER structure followed by
    /// the bitmap color space information and the bitmap bits.
    Dib5,
    /// Software Arts' Data Interchange Format.
    Dif,
    /// Bitmap display format associated with a private format. The hMem parameter must be a
    /// handle to data that can be displayed in bitmap format in lieu of the privately
    /// formatted data.
    DspBitmap,
    /// CF_DSPENHMETAFILE: Enhanced metafile display format associated with a private
    /// format. The hMem parameter must be a handle to data that can be displayed in
    /// enhanced metafile format in lieu of the privately formatted data.
    DspEnhancedMetaFile,
    /// CF_DSPMETAFILEPICT: Metafile-picture display format associated with a private
    /// format. The hMem parameter must be a handle to data that can be displayed in
    /// metafile-picture format in lieu of the privately formatted data.
    DspMetaFilePict,
    /// Text display format associated with a private format. The hMem parameter must
    /// be a handle to data that can be displayed in text format in lieu of the
    /// privately formatted data.
    DspText,
    /// A handle to an enhanced metafile (HENHMETAFILE).
    EnhancedMetaFile,
    /// Start of a range of integer values for application-defined
    /// GDI object clipboard formats.
    GdiObjectFirst,
    /// End of a range of integer values for application-defined GDI
    /// object clipboard formats.
    GdiObjectLast,
    /// A handle to type HDROP that identifies a list of files.
    HDrop,
    /// The data is a handle to the locale identifier associated
    /// with text in the clipboard.
    Locale,
    /// Handle to a metafile picture format as defined by the METAFILEPICT structure.
    MetaFilePict,
    /// Text format containing characters in the OEM character set.
    OemText,
    /// Owner-display format
    OwnerDisplay,
    /// Handle to a color palette
    Palette,
    /// Data for the pen extensions to the Microsoft Windows for Pen Computing
    PenData,
    /// Start of a range of integer values for private clipboard formats
    PrivateFirst,
    /// End of a range of integer values for private clipboard formats
    PrivateLast,
    /// Represents audio data more complex than can be represented in a CF_WAVE standard wave format
    Riff,
    /// Microsoft Symbolic Link (SYLK) format
    Sylk,
    /// ANSI text format
    Text,
    /// Tagged-image file format
    Tiff,
    /// UTF16 text format
    UnicodeText,
    /// Represents audio data in one of the standard wave formats
    Wave,
    /// Custom content type, used as backup if none of the formats are known
    Custom(u32),
}

#[cfg(target_os = "windows")]
impl WinContentType {
    /// Toggles through the clipboard types
    pub(crate) fn next(&self) -> Option<Self> {
        use self::WinContentType::*;
        match self {
            Bitmap => Some(Dib),
            Dib => Some(Dib5),
            Dib5 => Some(Dif),
            Dif => Some(DspBitmap),
            DspBitmap => Some(DspEnhancedMetaFile),
            DspEnhancedMetaFile => Some(DspMetaFilePict),
            DspMetaFilePict => Some(DspText),
            DspText => Some(EnhancedMetaFile),
            EnhancedMetaFile => Some(GdiObjectFirst),
            GdiObjectFirst => Some(GdiObjectLast),
            GdiObjectLast => Some(HDrop),
            HDrop => Some(Locale),
            Locale => Some(MetaFilePict),
            MetaFilePict => Some(OemText),
            OemText => Some(OwnerDisplay),
            OwnerDisplay => Some(Palette),
            Palette => Some(PenData),
            PenData => Some(PrivateFirst),
            PrivateFirst => Some(PrivateLast),
            PrivateLast => Some(Riff),
            Riff => Some(Sylk),
            Sylk => Some(Text),
            Text => Some(Tiff),
            Tiff => Some(UnicodeText),
            UnicodeText => Some(Wave),
            Wave => Some(Custom((*self).into())),
            Custom(_) => None,
        }
    }
}

#[cfg(target_os = "windows")]
impl Into<u32> for WinContentType {
    fn into(self) -> u32 {
        use self::WinContentType::*;
        use clipboard_win::formats::*;
        match self {
            Bitmap => CF_BITMAP,
            Custom(a) => a,
            Dib => CF_DIB,
            Dib5 => CF_DIBV5,
            Dif => CF_DIF,
            DspBitmap => CF_DSPBITMAP,
            DspEnhancedMetaFile => CF_DSPENHMETAFILE,
            DspMetaFilePict => CF_DSPMETAFILEPICT,
            DspText => CF_DSPTEXT,
            EnhancedMetaFile => CF_ENHMETAFILE,
            GdiObjectFirst => CF_GDIOBJFIRST,
            GdiObjectLast => CF_GDIOBJLAST,
            HDrop => CF_HDROP,
            Locale => CF_LOCALE,
            MetaFilePict => CF_METAFILEPICT,
            OemText => CF_OEMTEXT,
            OwnerDisplay => CF_OWNERDISPLAY,
            Palette => CF_PALETTE,
            PenData => CF_PENDATA,
            PrivateFirst => CF_PRIVATEFIRST,
            PrivateLast => CF_PRIVATELAST,
            Riff => CF_RIFF,
            Sylk => CF_SYLK,
            Text => CF_TEXT,
            Tiff => CF_TIFF,
            UnicodeText => CF_UNICODETEXT,
            Wave => CF_WAVE,
        }
    }
}