2

如果我使用例如

  echo 'test' | xclip -i -selection primary -loops 1 -quiet

并粘贴到另一个终端窗口,它按预期工作,即粘贴“测试”,然后主要选择返回到前一个客户端,“测试”消失了。但是,如果我粘贴到 X 程序中,这将不起作用。如果我使用-loops 10,我可以看到“测试”被粘贴到应用程序的第四个循环中,例如 gedit 和 webkit 浏览器,在 Firefox 中它甚至是第七个循环。如果我xsel改用,我会得到以下行为:

echo 'test' | xsel -i -p -n -vvvv
xsel: Window id: 0x2e00001 (unmapped)
xsel: Timestamp: 2495171514
xsel: Maximum request size: 4000 bytes
xsel: Accumulated 5 bytes input
xsel: handle_selection_request, property=0x1ca (<unknown atom>), target=0x23d (<unknown atom>)
xsel: Refusing conversion
xsel: handle_selection_request, property=0x1ca (<unknown atom>), target=0x1a9 (TARGETS)
xsel: change_property ()
xsel: data within maximum request size
xsel: Confirming conversion
xsel: handle_selection_request, property=0x1ca (<unknown atom>), target=0x121 (UTF8_STRING)
xsel: change_property ()
xsel: data within maximum request size
xsel: Confirming conversion

如果我使用clipboard而不是primary. 前几个循环会发生什么,数据去哪里了?

注意:这很有趣,因为在密码管理器中,您可能希望只粘贴一次密码...

另一个注意事项:我记得这曾经在过去的某个时候工作过,可能在旧的 Ubuntu 版本上。现在我可以在 Ubuntu 12.04 和 Debian 测试上重现这种行为。

4

1 回答 1

3

请参阅以下 Debian 错误

xclip -l 1过去常常将东西粘贴到 Iceweasel。这曾经工作得很好,但在 Iceweasel 26 中中断了。这是因为 Iceweasel 26 在实际请求 UTF8_STRING 内容之前多次探测 PRIMARY 剪贴板的 TARGETS,这导致 xclip 过早退出。Upstream 对此行为进行了修复:http:
//sourceforge.net/p/xclip/code/85/
如果您为 Debian 挑选了补丁,我将不胜感激。感谢您考虑。

要解决应用以下补丁并重新编译:

-- a/trunk/xclib.c
+++ b/trunk/xclib.c
@@ -411,6 +411,10 @@
    XSendEvent(dpy, evt.xselectionrequest.requestor, 0, 0, &res);
    XFlush(dpy);

+   /* don't treat TARGETS request as contents request */
+   if (evt.xselectionrequest.target == targets)
+       return 0;
+
    /* if len < chunk_size, then the data was sent all at
     * once and the transfer is now complete, return 1
     */

http://anonscm.debian.org/gitweb/?p=collab-maint/xclip.git;a=blob_plain;f=debian/patches/01_dont-treat-TARGETS-as-contents.patch;h=1fe637d7ca9ee6ac1dbf8ea4b68ae0381e7558e2;hb =ba750dfa3a9527aede5ac1d8ebc9b98979433b87

于 2014-06-20T16:48:22.200 回答