您可以从测试文件夹使用剪贴板应用程序对此进行复制,这是一个26214 字节的垃圾文件,将其全部复制并粘贴到窗口中,您将获得:
Error: X11: Failed to convert selection to string
Clipboard does not contain a string
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.target
型UTF8_STRING
,这将工作的大部分时间,当我们通过选择所有者的最大允许除单批量传输大小(262146个字节这个案例)。 相反,选择所有者将给我们actualType
的INCR
,这与请求的类型UTF8_STRING
。 所有者想要增量发送数据,即以包含UTF8_STRING
的几个XGetWindowProperty
s的块的形式发送。
为了解决这个问题,我们需要遵循ICCCM建议“ INCR属性”。 简而言之:
XInternAtom
获取INCR
-atom的句柄,例如,名称INCR_STRING
。_glfwGetWindowPropertyX11
如果我们收到actualType
的INCR_STRING
,如果是这样:XGetWindowProperty
获取INCR_STRING
XGetWindowProperty
,它包含一个较低的传输限制。INCR_STRING
属性,以便所有者可以开始向我们发送好东西。PropertyNotify
事件,表示一部分完整数据到达。XGetWindowProperty
检索块数据,并将其附加到缓冲区。如果您有兴趣,这里是我编写的增量选择的半成品实现要点。
这是我发现问题时有用的几个链接:
希望这对某人有用,不幸的是我无法自己弄清楚。
谢谢,这是一个很好的描述! 客户需要做些什么来完成其他平台上的几个函数调用,这有点荒谬。
我两天前开始实施INCR。 我已经读过书,也有从STRING / Latin-1转换的书,但是当我意识到INCR,MULTIPLE和STRING可以组合写作时,我感到一阵绝望。 在可以完全实施之前,需要进行一些重组。
如果有人想要窥视,则将其立即推送到selection-fixes
分支。
我需要专注于请求请求审核一段时间。 我保留了很多精美的代码,等待可耻的时间。 如果有人希望同时根据以上代码继续进行此工作,请这样做。
最有用的评论
我一直在自己研究这个问题,但是我无法完成它的实现。 希望一些尝试实现它的经验可能对其他尝试这样做的人有用。 简而言之,这是发生的事情,ICCCM希望我们为处理该INCR原子做些什么:
下面,当调用
_glfwPlatformGetClipboardString
,X11变得非常难过:其原因是因为我们正在请求
event.xselection.target
型UTF8_STRING
,这将工作的大部分时间,当我们通过选择所有者的最大允许除单批量传输大小(262146个字节这个案例)。 相反,选择所有者将给我们actualType
的INCR
,这与请求的类型UTF8_STRING
。 所有者想要增量发送数据,即以包含UTF8_STRING
的几个XGetWindowProperty
s的块的形式发送。为了解决这个问题,我们需要遵循ICCCM建议“ INCR属性”。 简而言之:
XInternAtom
获取INCR
-atom的句柄,例如,名称INCR_STRING
。_glfwGetWindowPropertyX11
如果我们收到actualType
的INCR_STRING
,如果是这样:a)使用
XGetWindowProperty
获取INCR_STRING
XGetWindowProperty
,它包含一个较低的传输限制。b)删除此
INCR_STRING
属性,以便所有者可以开始向我们发送好东西。c)等待
PropertyNotify
事件,表示一部分完整数据到达。d)使用
XGetWindowProperty
检索块数据,并将其附加到缓冲区。e)删除属性,向所有者发送信号以发送其他块。
f)检查数据大小是否为零,否则返回c。
g)传输完成,您现在拥有了所有数据!
如果您有兴趣,这里是我编写的增量选择的半成品实现要点。
这是我发现问题时有用的几个链接:
希望这对某人有用,不幸的是我无法自己弄清楚。