[英]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.