X11协议将一个原子定义为一个32位整数,但在我的系统中,Atom类型是一个unsigned long的typedef,它是一个64位整数。 Xlib的手册说,属性类型的最大大小为32位。这里似乎有一些冲突。我可以想到三种可能的解决方案。
如果Xlib将XA_ATOM类型的属性视为一种特殊情况,那么您可以简单地为'format'传递32,为'data'传递一个原子数组。这似乎是不洁净和黑客,我非常怀疑这是正确的。
Xlib手册似乎很古老。由于Atom在我的系统上长64位,我应该为'format'参数传递64,即使64没有被列为允许值吗?
我应该为'data'参数传递一个uint32_t值数组,而不是Atoms数组吗?这似乎对我来说很可能是正确的解决方案,但这不是他们在我查找过的使用XChangeProperty的一些来源中所做的,例如SDL。
SDL在设置_NET_WM_WINDOW_TYPE属性时似乎使用解决方案1,但我怀疑这可能是一个错误。在具有小端字节顺序(LSB优先)的系统上,如果属性只有一个元素,这似乎有效。
还有其他人遇到过这个问题吗?任何帮助表示赞赏。
答案 0 :(得分:5)
对于属性例程,您总是希望传递一个长','短'或者' char'。这始终是真实的,与实际位宽无关。因此,即使您的long或atom是64位,它也将在后台转换为32位。
格式是使用的服务器端位数,而不是客户端。因此,对于格式8,您必须传递一个char数组,对于格式16,您总是使用一个短数组,对于格式32,您总是使用一个长数组。这完全独立于给定机器上的短或长的实际长度。 32位值(如Atom或Window)始终位于“长”中。
这可能看起来很奇怪,但这是有充分理由的,C标准并不保证存在与服务器上的宽度完全相同的类型。例如,没有本机16位类型的机器。然而,短暂的'保证至少 16位,并保证long 至少 32位。因此,通过简短的'来制作客户端API。而且' long'你可以编写可移植代码,并且总是有空间容纳C类型中的完整X id。