Как выбор и атомы БУФЕРА ОБМЕНА работают в X11/XLib?Linux

Ответить
Anonymous
 Как выбор и атомы БУФЕРА ОБМЕНА работают в X11/XLib?

Сообщение Anonymous »

Я пытаюсь понять, как на самом деле работают выборки в X11, например, первичные выборки и выборки из буфера обмена.

В этом вопросе будет несколько вопросов, поэтому мне очень жаль.
Я провел собственное исследование и обнаружил, что мы используем атомы и выборки для чтения свойств буфера обмена.
Для контекста я хочу, чтобы вы знали, что я говорю только о 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);
Вы можете видеть, что я написал случайную строку в целевом атоме, но она будет работать отлично. Даже если я напишу случайную строку в propatom, это сработает. Но почему?
Извините, что я тупой и не совсем понятно объясняю, надеюсь, кто-нибудь поправит мою грамматику.

Подробнее здесь: https://stackoverflow.com/questions/798 ... n-x11-xlib
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»