XChangeProperty用于Atom为64位的系统上的atom属性

4 x11 xlib

X11协议将一个原子定义为一个32位整数,但在我的系统中,Atom类型是一个unsigned long的typedef,它是一个64位整数.Xlib的手册说,属性类型的最大大小为32位.这里似乎有一些冲突.我可以想到三种可能的解决方案.

  1. 如果Xlib将XA_ATOM类型的属性视为一种特殊情况,那么您可以简单地为'format'传递32,为'data'传递一个原子数组.这似乎是不洁净和黑客,我非常怀疑这是正确的.

  2. Xlib的手册看起来很古老.由于Atom在我的系统上长64位,我应该为'format'参数传递64,即使64没有被列为允许值吗?

  3. 我应该为'data'参数传递一个uint32_t值数组,而不是Atoms数组吗?这似乎对我来说很可能是正确的解决方案,但这不是他们在我查找过的使用XChangeProperty的一些来源中所做的,例如SDL.

在设置_NET_WM_WINDOW_TYPE属性时,SDL似乎使用解决方案1,但我怀疑这可能是一个错误.在具有小端字节顺序(LSB优先)的系统上,如果属性只有一个元素,这似乎有效.

还有其他人遇到过这个问题吗?任何帮助表示赞赏.

Joh*_*ham 5

对于属性例程,您总是希望传递一个"long","short"或"char"数组.这始终是真实的,与实际位宽无关.因此,即使您的long或atom是64位,它也将在后台转换为32位.

格式是使用的服务器端位数,而不是客户端.因此,对于格式8,您必须传递一个char数组,对于格式16,您总是使用一个短数组,对于格式32,您总是使用一个长数组.这完全独立于给定机器上的短或长的实际长度.32位值(如Atom或Window)总是处于"长"状态.

这可能看起来很奇怪,但是有充分的理由,C标准并不保证存在与服务器上的宽度完全相同的类型.例如,没有本机16位类型的机器.但是,"short"保证至少有 16位,而long保证至少有 32位.因此,通过使用'short'和'long'来创建客户端API,您既可以编写可移植代码,也可以在C类型中为完整的X id留出空间.