我最近阅读有关 Xorg 如何应对此负责的文章为了臭名昭著的漏洞用户关闭窗口后无法复制粘贴。我还知道计划最终切换到Wayland 作为 X 的替代品。
如果这个错误是 X 造成的,而 X 将被 Wayland 取代,那么是否有可能在那时修复?我很好奇这在技术上是否可行,以及它是否在目前的计划中。
答案1
嗯,我不认为这是一个错误,而是一个具有一些意想不到的后果的功能:)此外,我的理解是其他“剪贴板管理器”,即视窗和苹果系统,工作方式非常相似 - 当执行复制操作时,应用程序只会通知剪贴板管理器 - “嘿,我有东西”,而不传递实际数据(尽管在上述操作系统中,应用程序能将数据存储在剪贴板中 - XWindow 将此工作留给“剪贴板管理器”,这是一个单独的应用程序)。
如果您考虑到复制的数据在粘贴之前通常需要从一种格式转换为另一种格式,那么原因就变得很清楚了。例如:您从发布程序复制文本框并将其粘贴到同一程序中 - 结果保留了文本框的大小、边框、变换等。然后您将相同内容粘贴到文本处理器中 - 结果是一些具有丰富格式的文本,但显然文本框属性会丢失,因为文本处理器对此一无所知。然后您将相同内容粘贴到文本编辑器中 - 结果只是没有任何格式的纯文本。
那么,它是如何工作的呢?发布程序的专有数据格式如何转换为文本处理器可以理解的格式,或者只是纯文本?显然,X 服务器无法完成转换,因为它对所有可能的数据格式一无所知,而且,接收由于同样的原因,应用程序无法进行转换。
我对这个过程的理解是,当复制某些内容时,应用程序会通知剪贴板管理器它可以提供数据的格式:“嘿,我有一些东西可以转换为我的专有格式、富文本或纯文本”。
然后,其他应用程序检查剪贴板中是否有它能理解的格式的内容:
if (clipboad.contains_data_in_formats("image", "rich text", "plain text")) {
enable_Paste_menu_item();
}
然后,当选择粘贴操作时,最终结果是来源要求应用程序以所需的格式提供数据。
当应用程序退出时,标准说它可以将数据保存在剪贴板管理器中:
If a client needs to exit while owning the CLIPBOARD selection,
it should request the clipboard manager to take over the ownership
of the clipboard, using the SAVE_TARGETS mechanism. If there is no
clipboard manager, or if the SAVE_TARGETS conversion fails, the
application should simply exit.
因此,我的理解是,保存数据是应用程序的责任。因此,Wayland 不太可能在这方面做出任何改进 :)