如何在 X11 Windows 中监控剪贴板的变化?

How to monitor clipboard changes in X11 Windows?

我几乎已经用尽了寻找 X11 API 来执行以下操作的所有可能性。

我有一个线程正在尝试监视事件或通知以了解任何 X11 client 何时将任何内容复制到剪贴板。我不想监视特定的 Atom Target(剪贴板格式),但通常会在剪贴板中查找变化。

有一次,我知道剪贴板中发生了一些变化,我可以深入研究并在所有目标格式上执行 XConvertSelection()(我想请求 server 给我所有可能的方法转换复制的数据),并将它们进一步处理为 SelectionRequest 事件。

同样,我通常希望获得所有格式的请求(考虑枚举 1 到 1000 之间以检查目标 Atom),而不是为一种特定格式注册更改。根据服务器的响应,如果不存在特定原子,我可以将 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 允许应用程序使用可以由任意原子标记的“选择”,而不是“the”剪贴板。其中 CLIPBOARD 是主要兴趣,但 PRIMARY 和(很少使用)SECONDARY 也在那里,以及“私人通信”的任意选择。

参考:https://www.x.org/releases/X11R7.7/doc/xorg-docs/icccm/icccm.html#Use_of_Selection_Atoms