剪贴板是由Xlib实现还是由各个应用程序实现?

4
ICCCM定义了三种选择方式:1)主要选择 2)次要选择 3)剪贴板。但是在xlib中,xatom.h仅定义了XA_PRIMARY和XA_SECONDARY,而剪贴板没有这样的原子。因此,我的疑问是剪贴板是由xlib实现还是必须由各个应用程序单独实现,就像主要和次要选择一样?
如果必须由各个应用程序实现,那么不同的应用程序如何交互剪贴板,例如从一个应用程序的窗口复制并粘贴到另一个应用程序的窗口?不同应用程序如何共享一个公共缓冲区?有人能帮忙解决Linux中剪贴板的实际实现吗?我已经阅读了这个 link。但是我没有找到关于实现的更多信息。

为什么这么问?不使用现有的工具包是浪费时间的巨大损失;你需要多年的工作才能制作自己的工具包,而且它不会比现有的更好。如果现有的工具包不能满足您的需求,最好通过编写一些附加小部件来扩展它,而不是从头开始重写一个! - Basile Starynkevitch
1
我不是在制作自己的剪贴板,我只是想了解剪贴板的实现方式。我需要开发一个小应用程序。@BasileStarynkevitch - santosh kumar
然后,看看现有的实现。所以,如果使用Qt,查看Qt的源代码(以及示例的源代码)。大多数工具包都提供了处理剪贴板的API,例如QClipboard,而这些API才是真正重要的。 - Basile Starynkevitch
如果你没有实现自己的工具包,那么你使用的是哪个工具包呢?这很重要,因为答案取决于实际使用的工具包。请查看我的更新答案以获取更多信息... - Basile Starynkevitch
2个回答

4
bash $ xlsatoms | fgrep CLIPBOARD
231     CLIPBOARD
bash $ fgrep -r XA_CLIPBOARD /usr/include/X11
/usr/include/X11/Xmu/Atoms.h:    _XA_CLIPBOARD,
/usr/include/X11/Xmu/Atoms.h:#define XA_CLIPBOARD(d)            XmuInternAtom(d, _XA_CLIPBOARD)

所以我们有一个原子,没有任何问题。您还可以通过名称将其内部化。

CLIPBOARD选择与其他选择完全相同。唯一的区别是断言选择所有权的时刻。对于PRIMARY,它在用户选择某些内容时被断言;对于CLIPBOARD,它在用户剪切或复制时被断言。


谢谢您的回答。您可以帮助我设置GCC的Xmu编译器和链接器选项吗?我已经包含了X11/Xmu/Atoms.h文件,但它显示未定义对_XA_CLIPBOARD @n.m的引用。 - santosh kumar

3
剪贴板必须在X11服务器内部实现(伴随着大量工具包内的支持代码),因为它是所有X11客户端共享的数据。
它由ICCCMEWMH约定定义,并与桌面环境相关。它可能使用一些非预定义但按照惯例命名的X11原子(在xatom.h中没有预定义的许多这样的惯例原子)。
你最好使用一些现有的工具包,比如Qt或Gtk(或FOX或FLTK)。它们都是免费软件,如果您真的想了解,可以查看内部。对于Qt,请查看QClipboard,对于GTK,请查看GtkClipboard。因此,您不需要关心实现它们所使用的原子和X11协议。 freedesktop.org有很多资源,例如this,或者wm-spec等等等等...

另请参阅有关X Windows选择, X Windows系统协议和架构, XDND以及阅读X11协议规范的维基页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接