我使用
"WM_NAME"
window 属性在 Xlib 中获取窗口标题,并且我发现该属性返回不同的字符串类型。对于字符串类型,有 "UTF8_STRING"
原子、XA_STRING
(ISO-8859-1),以及一些 "COMPOUND_TEXT"
原子。虽然 "UTF8_STRING"
和 XA_STRING
看起来使用起来很简单,但我发现 "COMPOUND_TEXT"
使用起来有点复杂。
这是我在网上找到的唯一信息:https://www.x.org/releases/X11R7.7-RC1/doc/xorg-docs/ctext/ctext.html
最终目标是解析复合文本或至少将其转换为有效的 UTF-8 字符串。
可以通过XGetTextProperty获取wm名称,然后获取编码。这样做:
char *get_wm_name(Window win, Atom atom)
{
int n;
char **list=NULL, *result=NULL;
XTextProperty name;
if(!XGetTextProperty(display, win, &name, atom))
return NULL;
if(name.encoding == XA_STRING)
//((char *)name.value) is wm name;
else if(name.encoding == UTF8_STRING))
Xutf8TextPropertyToTextList(xinfo.display, &name, &list, &n);
//(*list) is wm name
else // use iconv() or other API to get wm name
...
}