Достать выделенный текст с помощью X11
С помощью https://stackoverflow.com/questions/27378318/c-get-string-from-clipboard-on-l... я создал прототип, который достаёт мне выделенный мышкой текст:
Bool PrintSelection(Display *display, Window window, const char *bufname, const char *fmtname)
{
char *result;
unsigned long ressize, restail;
int resbits;
Atom bufid = XInternAtom(display, bufname, False),
fmtid = XInternAtom(display, fmtname, False),
propid = XInternAtom(display, "XSEL_DATA", False),
incrid = XInternAtom(display, "INCR", False);
XEvent event;
XConvertSelection(display, bufid, fmtid, propid, window, CurrentTime);
do {
XNextEvent(display, &event);
if (event.type == SelectionNotify && event.xselection.selection == bufid)
{
if (event.xselection.property) {
XGetWindowProperty(display, window, propid, 0, LONG_MAX/4, False, AnyPropertyType,
&fmtid, &resbits, &ressize, &restail, (unsigned char**)&result);
if (fmtid == incrid) {
printf("Buffer is too large and INCR reading is not implemented yet.\n");
} else {
printf("%s\n", result);
XConvertSelection(display, bufid, fmtid, propid, window, CurrentTime);
}
XFree(result);
}
}
} while (1);
}
Но код выше не работает по событию «выделил текст - достал актуальный текст», вместо этого в переменной result всегда лежит текст последнего выделения. То есть XNextEvent всегда ловит последнее событие «выделение», даже когда оно уже случилось. Я же хочу:
- 1. Выделить текст
- 2. Достать выделенный текст и сделать
result = NULL
- 3. Когда нет выделений, то
result = NULL
Как это можно сделать на базе X11?