-
Notifications
You must be signed in to change notification settings - Fork 0
/
XClipboard.hpp
64 lines (55 loc) · 1.64 KB
/
XClipboard.hpp
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
#pragma once
#include <string>
#include <cstdint>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
class XClipboard {
Display* dpy;
Window root, win;
const struct Atoms {
Atom clipboard, utf8str, targets;
Atoms(Display* dpy) :
clipboard(XInternAtom(dpy, "CLIPBOARD", false)),
utf8str(XInternAtom(dpy, "UTF8_STRING", false)),
targets(XInternAtom(dpy, "TARGETS", false))
{}
} atoms;
public:
XClipboard() :
dpy(XOpenDisplay(nullptr)),
root(XDefaultRootWindow(dpy)),
win(XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0)),
atoms(dpy)
{}
~XClipboard() { XCloseDisplay(dpy); }
bool waitPaste(std::string clipboard) {
const Atom targets[2] = { atoms.targets, atoms.utf8str };
XSetSelectionOwner(dpy, atoms.clipboard, win, CurrentTime);
bool pasteDone = false;
XEvent ev;
while (!pasteDone) {
XNextEvent(dpy, &ev);
if (ev.type == SelectionClear) return false;
if (ev.type != SelectionRequest) continue;
XSelectionRequestEvent selev = ev.xselectionrequest;
if (selev.target == atoms.targets)
XChangeProperty(dpy, selev.requestor, selev.property, XA_ATOM, 32, PropModeReplace, (uint8_t*)targets, 2);
else {
XChangeProperty(dpy, selev.requestor, selev.property, selev.target, 8, PropModeReplace, (uint8_t*)clipboard.c_str(), clipboard.length());
pasteDone = true;
}
XSelectionEvent response = {
.type = SelectionNotify,
.display = dpy,
.requestor = selev.requestor,
.selection = selev.selection,
.target = selev.target,
.property = selev.property,
.time = selev.time
};
XSendEvent(dpy, selev.requestor, 0, 0, (XEvent*)&response);
XFlush(dpy);
}
return true;
}
};