Deskflow 1.22.0.197
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
XWindowsClipboard.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
4 * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
5 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
6 */
7
8#pragma once
9
11#include "deskflow/IClipboard.h"
12
13#include <list>
14#include <map>
15#include <vector>
16
17#include <X11/Xlib.h>
18
20
23{
24public:
29 XWindowsClipboard(Display *, Window window, ClipboardID id);
32 ~XWindowsClipboard() override;
33
36
38
41 void lost(Time);
42
44
49 void addRequest(Window owner, Window requestor, Atom target, ::Time time, Atom property);
50
52
56 bool processRequest(Window requestor, ::Time time, Atom property);
57
59
63 bool destroyRequest(Window requestor);
64
66
69 Window getWindow() const;
70
72
76 Atom getSelection() const;
77
78 // IClipboard overrides
79 bool empty() override;
80 void add(EFormat, const std::string &data) override;
81 bool open(Time) const override;
82 void close() const override;
83 Time getTime() const override;
84 bool has(EFormat) const override;
85 std::string get(EFormat) const override;
86
87private:
88 // remove all converters from our list
89 void clearConverters();
90
91 // get the converter for a clipboard format. returns nullptr if no
92 // suitable converter. iff onlyIfNotAdded is true then also
93 // return nullptr if a suitable converter was found but we already
94 // have data of the converter's clipboard format.
95 IXWindowsClipboardConverter *getConverter(Atom target, bool onlyIfNotAdded = false) const;
96
97 // convert target atom to clipboard format
98 EFormat getFormat(Atom target) const;
99
100 // add a non-MULTIPLE request. does not verify that the selection
101 // was owned at the given time. returns true if the conversion
102 // could be performed, false otherwise. in either case, the
103 // reply is inserted.
104 bool addSimpleRequest(Window requestor, Atom target, ::Time time, Atom property);
105
106 // if not already checked then see if the cache is stale and, if so,
107 // clear it. this has the side effect of updating m_timeOwned.
108 void checkCache() const;
109
110 // clear the cache, resetting the cached flag and the added flag for
111 // each format.
112 void clearCache() const;
113 void doClearCache();
114
115 // cache all formats of the selection
116 void fillCache() const;
117 void doFillCache();
118
119protected:
120 //
121 // helper classes
122 //
123
124 // read an ICCCM conforming selection
126 {
127 public:
128 CICCCMGetClipboard(Window requestor, Time time, Atom property);
130
131 // convert the given selection to the given type. returns
132 // true iff the conversion was successful or the conversion
133 // cannot be performed (in which case *actualTarget == None).
134 bool readClipboard(Display *display, Atom selection, Atom target, Atom *actualTarget, std::string *data);
135
136 private:
137 bool processEvent(Display *display, const XEvent *event);
138
139 private:
140 Window m_requestor;
141 Time m_time;
142 Atom m_property;
143 bool m_incr = false;
144 bool m_failed = false;
145 bool m_done = false;
146
147 // atoms needed for the protocol
148 Atom m_atomNone = None;
149 Atom m_atomIncr = None;
150
151 // true iff we've received the selection notify
152 bool m_reading = false;
153
154 // the converted selection data
155 std::string *m_data = nullptr;
156
157 // the actual type of the data. if this is None then the
158 // selection owner cannot convert to the requested type.
159 Atom *m_actualTarget = nullptr;
160
161 // true iff the selection owner didn't follow ICCCM conventions
162 bool m_error = false;
163
164 public:
165 bool error() const
166 {
167 return m_error;
168 }
169 };
170
171 // Motif structure IDs
172 enum class MotifClip : int32_t
173 {
175 Item = 2,
177 };
178
179 // _MOTIF_CLIP_HEADER structure
181 {
182 public:
184 int32_t m_pad1[3];
185 int32_t m_item;
186 int32_t m_pad2[4];
187 int32_t m_numItems;
188 int32_t m_pad3[3];
189 int32_t m_selectionOwner; // a Window
190 int32_t m_pad4[2];
191 };
192
193 // Motif clip item structure
195 {
196 public:
198 int32_t m_pad1[5];
199 int32_t m_size;
202 int32_t m_pad2[6];
203 };
204
205 // Motif clip format structure
207 {
208 public:
210 int32_t m_pad1[6];
211 int32_t m_length;
212 int32_t m_data;
213 int32_t m_type; // an Atom
214 int32_t m_pad2[1];
215 int32_t m_deleted;
216 int32_t m_pad3[4];
217 };
218
219 // stores data needed to respond to a selection request
220 class Reply
221 {
222 public:
223 Reply(Window, Atom target, ::Time);
224 Reply(Window, Atom target, ::Time, Atom property, const std::string &data, Atom type, int format);
225
226 public:
227 // information about the request
232
233 // true iff we've sent the notification for this reply
234 bool m_replied = false;
235
236 // true iff the reply has sent its last message
237 bool m_done = false;
238
239 // the data to send and its type and format
240 std::string m_data;
241 Atom m_type;
243
244 // index of next byte in m_data to send
245 uint32_t m_ptr = 0;
246 };
247 using ReplyList = std::list<Reply *>;
248 using ReplyMap = std::map<Window, ReplyList>;
249 using ReplyEventMask = std::map<Window, long>;
250
251 // ICCCM interoperability methods
252 void icccmFillCache();
253 bool icccmGetSelection(Atom target, Atom *actualTarget, std::string *data) const;
254 Time icccmGetTime() const;
255
256 // motif interoperability methods
257 bool motifLockClipboard() const;
258 void motifUnlockClipboard() const;
259 bool motifOwnsClipboard() const;
260 void motifFillCache();
261 bool motifGetSelection(const MotifClipFormat *, Atom *actualTarget, std::string *data) const;
262 Time motifGetTime() const;
263
264 // reply methods
265 bool insertMultipleReply(Window, ::Time, Atom);
266 void insertReply(Reply *);
267 void pushReplies();
268 void pushReplies(ReplyMap::iterator &, ReplyList &, ReplyList::iterator);
269 bool sendReply(Reply *);
270 void clearReplies();
271 void clearReplies(ReplyList &);
272 void sendNotify(Window requestor, Atom selection, Atom target, Atom property, Time time);
273 bool wasOwnedAtTime(::Time) const;
274
275 // data conversion methods
276 Atom getTargetsData(std::string &, int *format) const;
277 Atom getTimestampData(std::string &, int *format) const;
278
279private:
280 using ConverterList = std::vector<IXWindowsClipboardConverter *>;
281
282 Display *m_display;
283 Window m_window;
284 ClipboardID m_id;
285 Atom m_selection;
286 mutable bool m_open = false;
287 mutable Time m_time = 0;
288 bool m_owner = false;
289 mutable Time m_timeOwned = 0;
290 Time m_timeLost = 0;
291
292 // true iff open and clipboard owned by a motif app
293 mutable bool m_motif;
294
295 // the added/cached clipboard data
296 mutable bool m_checkCache;
297 bool m_cached;
298 Time m_cacheTime;
299 bool m_added[kNumFormats];
300 std::string m_data[kNumFormats];
301
302 // conversion request replies
303 ReplyMap m_replies;
304 ReplyEventMask m_eventMasks;
305
306 // clipboard format converters
307 ConverterList m_converters;
308
309 // atoms we'll need
310 Atom m_atomTargets;
311 Atom m_atomMultiple;
312 Atom m_atomTimestamp;
313 Atom m_atomInteger;
314 Atom m_atomAtom;
315 Atom m_atomAtomPair;
316 Atom m_atomData;
317 Atom m_atomINCR;
318 Atom m_atomMotifClipLock;
319 Atom m_atomMotifClipHeader;
320 Atom m_atomMotifClipAccess;
321 Atom m_atomGDKSelection;
322};
323
325
330{
331public:
333
334
336
339 virtual IClipboard::EFormat getFormat() const = 0;
340
342
346 virtual Atom getAtom() const = 0;
347
349
353 virtual int getDataSize() const = 0;
354
356
362 virtual std::string fromIClipboard(const std::string &) const = 0;
363
365
369 virtual std::string toIClipboard(const std::string &) const = 0;
370
372};
static int void FAR * data
Definition ArchNetworkWinsock.cpp:34
static int type
Definition ArchNetworkWinsock.cpp:44
uint8_t ClipboardID
Clipboard ID.
Definition ClipboardTypes.h:16
Clipboard interface.
Definition IClipboard.h:20
EFormat
Clipboard formats.
Definition IClipboard.h:50
@ kNumFormats
The number of clipboard formats.
Definition IClipboard.h:54
uint32_t Time
Timestamp type.
Definition IClipboard.h:28
Base class of interfaces.
Definition IInterface.h:18
Clipboard format converter interface.
Definition XWindowsClipboard.h:330
virtual std::string fromIClipboard(const std::string &) const =0
Convert from IClipboard format.
virtual std::string toIClipboard(const std::string &) const =0
Convert to IClipboard format.
virtual int getDataSize() const =0
Get X11 property datum size.
virtual IClipboard::EFormat getFormat() const =0
Get clipboard format.
virtual Atom getAtom() const =0
Get X11 format atom.
CICCCMGetClipboard(Window requestor, Time time, Atom property)
Definition XWindowsClipboard.cpp:1149
bool readClipboard(Display *display, Atom selection, Atom target, Atom *actualTarget, std::string *data)
Definition XWindowsClipboard.cpp:1156
bool error() const
Definition XWindowsClipboard.h:165
Definition XWindowsClipboard.h:207
MotifClip m_id
Definition XWindowsClipboard.h:209
int32_t m_length
Definition XWindowsClipboard.h:211
int32_t m_type
Definition XWindowsClipboard.h:213
int32_t m_deleted
Definition XWindowsClipboard.h:215
int32_t m_pad3[4]
Definition XWindowsClipboard.h:216
int32_t m_pad2[1]
Definition XWindowsClipboard.h:214
int32_t m_data
Definition XWindowsClipboard.h:212
int32_t m_pad1[6]
Definition XWindowsClipboard.h:210
Definition XWindowsClipboard.h:181
int32_t m_pad3[3]
Definition XWindowsClipboard.h:188
int32_t m_pad2[4]
Definition XWindowsClipboard.h:186
int32_t m_numItems
Definition XWindowsClipboard.h:187
int32_t m_selectionOwner
Definition XWindowsClipboard.h:189
MotifClip m_id
Definition XWindowsClipboard.h:183
int32_t m_pad4[2]
Definition XWindowsClipboard.h:190
int32_t m_item
Definition XWindowsClipboard.h:185
int32_t m_pad1[3]
Definition XWindowsClipboard.h:184
Definition XWindowsClipboard.h:195
int32_t m_numFormats
Definition XWindowsClipboard.h:200
int32_t m_pad2[6]
Definition XWindowsClipboard.h:202
int32_t m_numDeletedFormats
Definition XWindowsClipboard.h:201
int32_t m_size
Definition XWindowsClipboard.h:199
MotifClip m_id
Definition XWindowsClipboard.h:197
int32_t m_pad1[5]
Definition XWindowsClipboard.h:198
Definition XWindowsClipboard.h:221
bool m_replied
Definition XWindowsClipboard.h:234
Atom m_property
Definition XWindowsClipboard.h:231
Atom m_type
Definition XWindowsClipboard.h:241
int m_format
Definition XWindowsClipboard.h:242
Atom m_target
Definition XWindowsClipboard.h:229
Reply(Window, Atom target, ::Time)
Definition XWindowsClipboard.cpp:1366
::Time m_time
Definition XWindowsClipboard.h:230
uint32_t m_ptr
Definition XWindowsClipboard.h:245
std::string m_data
Definition XWindowsClipboard.h:240
Window m_requestor
Definition XWindowsClipboard.h:228
bool m_done
Definition XWindowsClipboard.h:237
bool empty() override
Empty clipboard.
Definition XWindowsClipboard.cpp:233
bool insertMultipleReply(Window, ::Time, Atom)
Definition XWindowsClipboard.cpp:756
bool sendReply(Reply *)
Definition XWindowsClipboard.cpp:893
XWindowsClipboard & operator=(XWindowsClipboard const &)=delete
bool motifGetSelection(const MotifClipFormat *, Atom *actualTarget, std::string *data) const
Definition XWindowsClipboard.cpp:729
bool motifOwnsClipboard() const
Definition XWindowsClipboard.cpp:588
Time icccmGetTime() const
Definition XWindowsClipboard.cpp:534
void clearReplies()
Definition XWindowsClipboard.cpp:1050
XWindowsClipboard & operator=(XWindowsClipboard &&)=delete
void addRequest(Window owner, Window requestor, Atom target, ::Time time, Atom property)
Add clipboard request.
Definition XWindowsClipboard.cpp:93
void motifFillCache()
Definition XWindowsClipboard.cpp:620
Atom getSelection() const
Get selection atom.
Definition XWindowsClipboard.cpp:228
Time motifGetTime() const
Definition XWindowsClipboard.cpp:751
Window getWindow() const
Get window.
Definition XWindowsClipboard.cpp:223
std::map< Window, long > ReplyEventMask
Definition XWindowsClipboard.h:249
bool processRequest(Window requestor, ::Time time, Atom property)
Process clipboard request.
Definition XWindowsClipboard.cpp:177
void motifUnlockClipboard() const
Definition XWindowsClipboard.cpp:574
std::string get(EFormat) const override
Get data.
Definition XWindowsClipboard.cpp:344
void icccmFillCache()
Definition XWindowsClipboard.cpp:445
void pushReplies()
Definition XWindowsClipboard.cpp:846
Atom getTargetsData(std::string &, int *format) const
Definition XWindowsClipboard.cpp:1112
MotifClip
Definition XWindowsClipboard.h:173
@ Format
Definition XWindowsClipboard.h:174
@ Item
Definition XWindowsClipboard.h:175
@ Header
Definition XWindowsClipboard.h:176
~XWindowsClipboard() override
Definition XWindowsClipboard.cpp:77
void insertReply(Reply *)
Definition XWindowsClipboard.cpp:800
Time getTime() const override
Get time.
Definition XWindowsClipboard.cpp:330
bool motifLockClipboard() const
Definition XWindowsClipboard.cpp:549
bool destroyRequest(Window requestor)
Cancel clipboard request.
Definition XWindowsClipboard.cpp:205
void close() const override
Close clipboard.
Definition XWindowsClipboard.cpp:315
std::map< Window, ReplyList > ReplyMap
Definition XWindowsClipboard.h:248
Atom getTimestampData(std::string &, int *format) const
Definition XWindowsClipboard.cpp:1135
bool has(EFormat) const override
Check for data.
Definition XWindowsClipboard.cpp:336
void sendNotify(Window requestor, Atom selection, Atom target, Atom property, Time time)
Definition XWindowsClipboard.cpp:1067
void lost(Time)
Notify clipboard was lost.
Definition XWindowsClipboard.cpp:83
bool icccmGetSelection(Atom target, Atom *actualTarget, std::string *data) const
Definition XWindowsClipboard.cpp:515
XWindowsClipboard(XWindowsClipboard &&)=delete
bool open(Time) const override
Open clipboard.
Definition XWindowsClipboard.cpp:278
XWindowsClipboard(Display *, Window window, ClipboardID id)
Definition XWindowsClipboard.cpp:31
void add(EFormat, const std::string &data) override
Add data.
Definition XWindowsClipboard.cpp:265
std::list< Reply * > ReplyList
Definition XWindowsClipboard.h:247
XWindowsClipboard(XWindowsClipboard const &)=delete
bool wasOwnedAtTime(::Time) const
Definition XWindowsClipboard.cpp:1081