【问题标题】:Picture format for _NET_WM_ICON_NET_WM_ICON 的图片格式
【发布时间】:2017-04-05 16:47:29
【问题描述】:

环境:Ubuntu 16.04

在我的应用程序中,我通过调用 XGetWindowProperty_NET_WM_ICON atom 来获取应用程序的图标。

unsigned char* data;
XGetWindowProperty(..., &data);
unsigned long* data1 = (unsigned long*) data;
long width = *data1;
long height = *(data1 + 1)
unsigned char* imageData = (unsigned char*) (data1 + 2);

这里是返回数据的规格:

https://specifications.freedesktop.org/wm-spec/wm-spec-1.3.html#idm140130317554480

根据规范,返回的图像必须是打包的 32 ARGB 格式。但是,我得到的图像似乎不正确。我终于用自己的图标创建了一个测试应用程序。它是一个实心图标,RGB 值分别为 0x20、0x40 和 0x80。

当我在调试器中检查我的变量 imageData 时,我看到的是:

0x80, 0x40, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff (repeat the pattern)

格式似乎是 BGRA,带有额外的四个字节的填充。

如果有人能解释这种差异,我将不胜感激。问候。

【问题讨论】:

    标签: c x11 xlib


    【解决方案1】:

    我已经确认该格式确实是带有四个额外字节填充的 BGRA。我枚举了所有正在运行的应用程序,并且能够正确提取图标。

    【讨论】:

      【解决方案2】:

      在 CentOS 7 上的 XGetWindowProperty(3) 手册页中,这是指您要为其传递参数 data 的参数:

      prop_return 返回指定格式的数据。如果返回 格式为8,返回的数据以char表示 大批。如果返回格式为16,则返回数据为 表示为 short int 类型的数组,应强制转换 到该类型以获取元素。如果返回格式 为 32,属性数据将存储为 longs 数组 (在 64 位应用程序中将是 64 位值,即 填充高 4 个字节)。

      我假设您会发现 actual_format_return 是 32(因为规范似乎表明这是 _NET_WM_ICON 的唯一有效格式),并且您的应用程序可能是 64 位的,这意味着您的 @987654325 @type 是 64 位长,因此是填充。

      至于为什么填充位都设置为1而不是0,我不太确定。手册页中的函数签名显示unsigned char **prop_return,但上面引用的文本说它是“长数组”,而不是“无符号长数组”,所以这可能是为了按字面意思理解(或被采取字面意思是您正在检索其图标的应用程序的作者),并且在您的应用程序接收数据之前某处发生了一些符号扩展。

      【讨论】:

        猜你喜欢
        • 2019-09-10
        • 1970-01-01
        • 2022-11-05
        • 2019-06-19
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        • 2011-08-07
        相关资源
        最近更新 更多