gpt4 book ai didi

XGetWindowProperty 的窗口类型的正确大小

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:39 26 4
gpt4 key购买 nike

我正在使用以下代码从根窗口读取 _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 吗?还有什么吗?

最佳答案

文档 (XGetWindowProperty(3)) 指出:

If the specified format is 32, the property data must be a long array.

包含文件将 Window 显示为 XID 的类型定义,它是 unsigned long 的类型定义。

我猜 32 的使用是不合时宜的,过去表示 32 位,但现在表示您的编译器选择用于 unsigned long 的任何内容。

关于XGetWindowProperty 的窗口类型的正确大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44020616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com