В этом вопросе будет несколько вопросов, поэтому мне очень жаль.
Я провел собственное исследование и обнаружил, что мы используем атомы и выборки для чтения свойств буфера обмена.
Для контекста я хочу, чтобы вы знали, что я говорю только о Linux System (Arch) + Window Manager (Bspwm), а не полноценный рабочий стол, такой как Gnome или KDE.
Теперь я хочу знать следующее:
- Как такие приложения, как Firefox и другие приложения с графическим интерфейсом, копируют текст в буфер обмена X11? Например, я знаю, что они используют свой собственный внутренний буфер для копирования текста, но берут ли они также на себя ответственность за выделение БУФЕРА ОБМЕНА и копирование текста в БУФЕР ОБМЕНА?
- А если они не берут на себя ответственность за БУФЕР ОБМЕНА, то как они помещают скопированные данные в буфер БУФЕРА ОБМЕНА X11? Если они даже не помещают скопированные данные в БУФЕР ОБМЕНА X11, то как такие инструменты, как Xclip, работающие с выборками X11, могут получить эти скопированные данные? потому что я могу распечатать текст, скопированный из Firefox, на терминале с помощью команды `xclip -selection clipboard -o`
Следующее, что я хочу знать:
- мы можем использовать Atoms и такие функции, как XConvertSelection и `XGetWindowProperty`, для получения данных из CLIPBOARD. Вот пример -
Код: Выделить всё
Display *d = XOpenDisplay(NULL);
if (d == NULL) return 1;
Window w = XCreateSimpleWindow(d, DefaultRootWindow(d), 0, 0, 100, 100, 0, 0, 0);
Atom clip = XInternAtom(d, "CLIPBOARD", True);
Atom target = XInternAtom(d, "UTF8_STRING", True);
Atom prop = XInternAtom(d, "MY_PROP", True);
XConvertSelection(d, clip, str, prop, w, CurrentTime);
XEvent ev;
int quit = 0;
while (!quit) {
XNextEvent(d, &ev);
if (ev.type == SelectionNotify) {
if (ev.xselection.property) {
Atom type;
int fmt;
unsigned long nitmes, bytes_rem;
unsigned char *data;
XGetWindowProperty(d, w, prop, 0, ~0, False, AnyPropertyType,
&type, &fmt, &nitmes, &bytes_rem, &data);
printf("%s\n", data);
quit = 1;
}
}
}
XDestroyWindow(d, w);
XCloseDisplay(d);
Код: Выделить всё
Atom clip = XInternAtom(d, "CLIPBOARD", True);
Atom target = XInternAtom(d, "slajdfas", True);
Atom prop = XInternAtom(d, "MY_PROP", True);
Извините, что я тупой и не совсем понятно объясняю, надеюсь, кто-нибудь поправит мою грамматику.
Подробнее здесь: https://stackoverflow.com/questions/798 ... n-x11-xlib
Мобильная версия