【问题标题】:How to monitor clipboard changes in X11 Windows?如何监控 X11 Windows 中剪贴板的变化?
【发布时间】:2021-11-18 16:20:36
【问题描述】:

我几乎用尽了所有可能找到 X11 API 来执行以下操作。

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

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

再次,我想获得所有格式的请求(考虑在 1 到 1000 之间枚举以检查目标 Atom),而不是为一种特定格式注册更改。根据服务器的响应,如果某个特定原子不存在,我可以检查None 作为属性成员,或者将其他目标原子名称存储在列表中。

谁能帮助我了解如何监控剪贴板中的变化?另外,迭代 1 到 1000 是否可以保证对所有可能的格式进行详尽的搜索?还是有更好的方法来做到这一点?

【问题讨论】:

标签: c++ c linux clipboard x11


【解决方案1】:

要监控更改,请使用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

【讨论】:

  • 查询TARGETS目标,获取有效目标列表。您指的是哪个 API?
  • XConvertSelection。 TARGETS 是您可以请求的目标(格式)之一,例如 STRING 或其他。详情请见this section
猜你喜欢
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2012-04-28
  • 2010-11-02
  • 1970-01-01
相关资源
最近更新 更多