Я почти исчерпал все возможности найти API X11 для выполнения следующих действий.
У меня есть поток, который пытается отслеживать событие или уведомление, чтобы знать, когда что-либо копируется в буфер обмена любым X11 client
. Я не хочу отслеживать конкретную цель Atom Target (формат буфера обмена), но обычно ищу изменения в буфере обмена.
Как только я знаю, что в буфере обмена что-то изменилось, я могу погрузиться и выполнить XConvertSelection()
все целевые форматы (я хочу попросить server
предоставить мне все возможные способы преобразования скопированных данных), а затем обработать их в SelectionRequest
событие.
Опять же, я хочу, как правило, получать запросы для всех форматов (думая о перечислении от 1 до 1000 для проверки целевых атомов), а не регистрировать изменения для одного конкретного формата. На основе ответа сервера, если конкретный атом отсутствует, я могу проверить его None
как член свойства или сохранить другие целевые имена атомов в списке.
Может ли кто-нибудь помочь мне с отслеживанием изменений в буфере обмена? Кроме того, гарантирует ли итерация от 1 до 1000 исчерпывающий поиск всех возможных форматов? Или есть лучший способ сделать это?
Для отслеживания изменений используйте XFixes . С XCB он используется как:
// Enable XFixes
auto xfixes = xcb_get_extension_data(connection, &xcb_xfixes_id); // do not free!
ev_selection_change_notify = xfixes->first_event + XCB_XFIXES_SELECTION_NOTIFY;
auto *version = xcb_xfixes_query_version_reply(xcb_xfixes_query_version(connection, XCB_XFIXES_MAJOR_VERSION, XCB_XFIXES_MINOR_VERSION));
// Subscribe to clipboard notifications
xcb_xfixes_select_selection_input(connection, root, clipboard, XCB_XFIXES_SELECTION_EVENT_MASK_SET_SELECTION_OWNER);
// Event loop:
auto *event = xcb_poll_for_event(connection);
int etype = event->response_type & 0x7f;
if (etype == ev_selection_change_notify) {
auto *notification = reinterpret_cast<xcb_xfixes_selection_notify_event_t *>(event);
...
}
...
В Xlib должно быть аналогично.
Чтобы проверить список доступных целей, не возвращайтесь к 1000! Просто запросите TARGETS
цель, она должна предоставить вам список допустимых целей для содержимого буфера обмена.
Однако есть предостережение: вместо «буфера обмена» X11 позволяет приложениям использовать «выборки», которые могут быть помечены произвольными атомами. Из них CLIPBOARD
представляет первостепенный интерес, но они PRIMARY
(редко используются) SECONDARY
также присутствуют, как и произвольный выбор для «частного общения».
Ссылка: https://www.x.org/releases/X11R7.7/doc/xorg-docs/icccm/icccm.html#Use_of_Selection_Atoms
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения