XGetWindowProperty

时间:2017-05-17 09:20:42

标签: c x11 xlib

我正在使用以下代码从根窗口中读取_NET_ACTIVE_WINDOW原子:

Atom actualType;
int actualFormat;
unsigned long nItems, bytesAfter;
unsigned char * value;

if (XGetWindowProperty(display, window, atom, 0, LONG_MAX / 4,
                       False, XA_WINDOW,
                       &actualType, &actualFormat,
                       &nItems, &bytesAfter, &value) != Success ||
    actualType != XA_WINDOW) {
    return NULL;
}

Window result = *(Window*)value;    /*  <=== this line seems dubious */
XFree(value);
return result;

然而,尽管它有效,但我很确定它有问题,因为添加一些printfs会显示:

  • sizeof(Window)是8
  • actualFormat是32
  • nItems是1

因此,根据文档,为属性分配的缓冲区长度为4个字节。从中读取一个窗口是一个明显的溢出。

那是什么处理?是否有一些我想念的标志Window只有4个字节?我应该将该值读作uint32_t并将其投放到Window之后吗?还有什么吗?

1 个答案:

答案 0 :(得分:2)

文档(XGetWindowProperty(3))声明:

  

如果指定的格式为32,则属性数据必须是长数组。

包含文件将XID显示为unsigned long的typedef,这是unsigned long的typedef。

我猜想32的使用是不合时宜的并且用来表示32位,但现在意味着编译器选择用于FormEvents的任何内容。