繁体   English   中英

如何监控 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM