在 X (*nix) 上实现剪贴板功能而不访问事件循环?

发布于 2024-12-11 11:29:11 字数 171 浏览 0 评论 0原文

如果你有一个窗口但无法访问事件循环,并且只能对 X 进行函数调用,是否可以实现文本的复制粘贴。我已经在 Windows 和 OSX 上实现了剪贴板,只需要 API 函数调用。在 *nix 上用 X 也可能有同样的情况吗?有人告诉我您绝对需要访问 X 事件循环。有没有一种方法可以仅通过 api 调用来实现基本的字符串剪贴板功能?

Is it possible to implement copy-paste of text if you have a window but no access to the event loop, and can only make function calls to X. I've implemented clipboard on Windows and OSX with nothing but API function calls. Is the same possible on *nix with X? I was told you absolutely need access to the X event loop. Is there a way to implement basic string clipboard functionality with only api calls?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瞎闹 2024-12-18 11:29:12

简短的回答是“不”。

下面是长答案...

Windows 和 X 剪贴板(不知道 OSX)之间的主要区别是:

  • 在 Windows 中,当用户执行 COPY 操作时,数据会被复制到共享内存块中,并且可以在其中进行任何操作。执行 PASTE 操作的应用程序。
  • 在 X 中,当应用程序执行 COPY 操作时,它只是拥有剪贴板。然后,当另一个应用程序(或相同的应用程序)执行粘贴时,数据将从一个应用程序传输到另一个应用程序。

因此,为了在 X 客户端中实现 COPY,您必须首先拥有剪贴板,然后监听并回复获取剪贴板内容消息。要实现 PASTE,您必须发送获取剪贴板内容消息并等待回复。这两个操作都需要您扰乱事件循环。

这就是为什么在 X 中,在终止源应用程序后复制的数据不可用。除非您使用某种剪贴板服务器,即侦听事件剪贴板所有者即将死亡并保存数据副本以供将来粘贴的应用程序。

公平地说,Windows 剪贴板也可以在直接传输模式下工作,但据我所知很少使用,并且仅适用于非常大的数据。

Short answer is "no".

Long answer following...

The main difference between Windows and X clipboard (don't know about OSX) is that:

  • In Windows the data is is copied into a chunk of shared memory when the user does COPY and it is available there for any application that does PASTE.
  • In X, when an application does COPY it just owns the clipboard. Then, when another application (or the same) does a PASTE the data is transferred from one application to the other.

So, in order to implement COPY in an X client, you have to own the clipboard first, and then listen and reply to the get clipboard contents messages. And to implement PASTE you have to send the get clipboard contents message and wait for the reply. Both of these operations require you to mess with the event loop.

That's why in X the copied data is not available after you kill the source application. Unless you use some kind of clipboard server, that is, an application that listens to the event owner of clipboard is dying and saves a copy of the data for future pastes.

To be fair, Windows clipboard can work also in the direct transfer mode, but it is rarely used, AFAIK, and only for very big pieces of data.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文