Glfw: 添加对增量选择转移的支持

创建于 2014-04-15  ·  5评论  ·  资料来源: glfw/glfw

您可以从测试文件夹使用剪贴板应用程序对此进行复制,这是一个26214 字节的垃圾文件,将其全部复制并粘贴到窗口中,您将获得:

Error: X11: Failed to convert selection to string
Clipboard does not contain a string
X11 bug verified

最有用的评论

我一直在自己研究这个问题,但是我无法完成它的实现。 希望一些尝试实现它的经验可能对其他尝试这样做的人有用。 简而言之,这是发生的事情,ICCCM希望我们为处理该INCR原子做些什么:

下面,当调用_glfwPlatformGetClipboardString ,X11变得非常难过:

if (_glfwGetWindowPropertyX11(event.xselection.requestor,
                              event.xselection.property,
                              event.xselection.target,
                              (unsigned char**) &data))
    _glfw.x11.clipboardString = strdup(data);

其原因是因为我们正在请求event.xselection.targetUTF8_STRING ,这将工作的大部分时间,当我们通过选择所有者的最大允许除单批量传输大小(262146个字节这个案例)。 相反,选择所有者将给我们actualTypeINCR ,这与请求的类型UTF8_STRING 。 所有者想要增量发送数据,即以包含UTF8_STRING的几个XGetWindowProperty s的块的形式发送。

为了解决这个问题,我们需要遵循ICCCM建议“ INCR属性”。 简而言之:

  1. 使用XInternAtom获取INCR -atom的句柄,例如,名称INCR_STRING
  2. _glfwGetWindowPropertyX11如果我们收到actualTypeINCR_STRING ,如果是这样:
    a)使用XGetWindowProperty获取INCR_STRING XGetWindowProperty ,它包含一个较低的传输限制。
    b)删除此INCR_STRING属性,以便所有者可以开始向我们发送好东西。
    c)等待PropertyNotify事件,表示一部分完整数据到达。
    d)使用XGetWindowProperty检索块数据,并将其附加到缓冲区。
    e)删除属性,向所有者发送信号以发送其他块。
    f)检查数据大小是否为零,否则返回c。
    g)传输完成,您现在拥有了所有数据!

如果您有兴趣,这里是我编写的增量选择的半成品实现要点
这是我发现问题时有用的几个链接:

希望这对某人有用,不幸的是我无法自己弄清楚。

所有5条评论

GLFW目前还不支持增量剪贴板数据传输。

自我注意事项: UTF8_STRING

我一直在自己研究这个问题,但是我无法完成它的实现。 希望一些尝试实现它的经验可能对其他尝试这样做的人有用。 简而言之,这是发生的事情,ICCCM希望我们为处理该INCR原子做些什么:

下面,当调用_glfwPlatformGetClipboardString ,X11变得非常难过:

if (_glfwGetWindowPropertyX11(event.xselection.requestor,
                              event.xselection.property,
                              event.xselection.target,
                              (unsigned char**) &data))
    _glfw.x11.clipboardString = strdup(data);

其原因是因为我们正在请求event.xselection.targetUTF8_STRING ,这将工作的大部分时间,当我们通过选择所有者的最大允许除单批量传输大小(262146个字节这个案例)。 相反,选择所有者将给我们actualTypeINCR ,这与请求的类型UTF8_STRING 。 所有者想要增量发送数据,即以包含UTF8_STRING的几个XGetWindowProperty s的块的形式发送。

为了解决这个问题,我们需要遵循ICCCM建议“ INCR属性”。 简而言之:

  1. 使用XInternAtom获取INCR -atom的句柄,例如,名称INCR_STRING
  2. _glfwGetWindowPropertyX11如果我们收到actualTypeINCR_STRING ,如果是这样:
    a)使用XGetWindowProperty获取INCR_STRING XGetWindowProperty ,它包含一个较低的传输限制。
    b)删除此INCR_STRING属性,以便所有者可以开始向我们发送好东西。
    c)等待PropertyNotify事件,表示一部分完整数据到达。
    d)使用XGetWindowProperty检索块数据,并将其附加到缓冲区。
    e)删除属性,向所有者发送信号以发送其他块。
    f)检查数据大小是否为零,否则返回c。
    g)传输完成,您现在拥有了所有数据!

如果您有兴趣,这里是我编写的增量选择的半成品实现要点
这是我发现问题时有用的几个链接:

希望这对某人有用,不幸的是我无法自己弄清楚。

谢谢,这是一个很好的描述! 客户需要做些什么来完成其他平台上的几个函数调用,这有点荒谬。

我两天前开始实施INCR。 我已经读过书,也有从STRING / Latin-1转换的书,但是当我意识到INCR,MULTIPLE和STRING可以组合写作时,我感到一阵绝望。 在可以完全实施之前,需要进行一些重组。

如果有人想要窥视,则将其立即推送到selection-fixes分支。

我需要专注于请求请求审核一段时间。 我保留了很多精美的代码,等待可耻的时间。 如果有人希望同时根据以上代码继续进行此工作,请这样做。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

ocornut picture ocornut  ·  3评论

ifschleife picture ifschleife  ·  5评论

aleck099 picture aleck099  ·  3评论

voxelv picture voxelv  ·  4评论

Itanq picture Itanq  ·  5评论