C 在X11中获取窗口属性长度的惯用方法?
我昨天刚开始学习X11,我很难找到关于它的信息 我希望能够检索X11窗口的UTF-8标题\u NET\u WM\u名称。问题是你应该用一个长度参数来调用它。我目前的解决方案是首先使用C 在X11中获取窗口属性长度的惯用方法?,c,utf-8,x11,C,Utf 8,X11,我昨天刚开始学习X11,我很难找到关于它的信息 我希望能够检索X11窗口的UTF-8标题\u NET\u WM\u名称。问题是你应该用一个长度参数来调用它。我目前的解决方案是首先使用XGetWindowProperty和0长度参数来检索字符串的长度,然后在返回长度的信息后再次调用XGetWindowProperty 问题是,这涉及到两次分配和释放。我不是一个超级高级程序员,但这可能不好,对吧?虽然在实践中,两次分配给一些小的和不常见的东西,如获得一个窗口标题,可能不会有太大的区别,但我到处都听到
XGetWindowProperty
和0长度参数来检索字符串的长度,然后在返回长度的信息后再次调用XGetWindowProperty
问题是,这涉及到两次分配和释放。我不是一个超级高级程序员,但这可能不好,对吧?虽然在实践中,两次分配给一些小的和不常见的东西,如获得一个窗口标题,可能不会有太大的区别,但我到处都听到,不必要的分配和释放仍然应该避免
这是我的密码:
Atom actualType;
int actualFormat;
unsigned long nItems;
unsigned long bytesAfter;
unsigned char* prop;
XGetWindowProperty(
display,
window,
_NET_WM_NAME,
0UL,
0UL,
False,
UTF8_STRING,
&actualType,
&actualFormat,
&nItems,
&bytesAfter,
&prop
);
XFree(prop);
XGetWindowProperty(
display,
window,
_NET_WM_NAME,
0UL,
(bytesAfter + 3UL) / 4UL, // Divide by four and round up
False,
UTF8_STRING,
&actualType,
&actualFormat,
&nItems,
&bytesAfter,
&prop
);
printf("title: %s", prop);
XFree(prop);
有更好的方法吗
另一种解决方案是每次设置标题时都存储标题,但我不确定保存的标题和实际标题是否可以取消同步
感谢ppl如果无法避免多次分配,那么多次分配没有什么错,而且您可能需要为更大的数据量这样做。请求一个合理的字节数,并根据需要使用循环来处理传入的数据,利用offset参数指定继续读取的位置。如果4*length
大于要返回的数据量,则它将只返回必要的数据量,因此您无需担心使用bytesAfter
参数计算正确的长度:
Atom实际类型;
int实际格式;
无符号长nItems;
未签名的长bytesAfter;
无符号字符*prop;
//将长度指定为字节数除以4
#定义MB(1048576)
长长度=(64*MB)/4;
printf(“标题:”);
对于(长偏移=0;偏移+=长度){
XGetWindowProperty(
展示,,
窗口,
_网络名称,
抵消,
长度,
假,,
UTF8_字符串,
&实际类型,
&实际格式,
&尼特姆斯,
&过去之后,
&支柱
);
printf(“%s”,prop);
XFree(prop);
if(bytesAfter==0)
打破
}
当然,如果您愿意,您可以请求更多数据,根据需要在字节之后调整长度
,这样做确实更有效,因为需要更少的请求/响应周期,而无需进行任何分配。然而,有时有太多的数据需要处理,这就是为什么您可能仍然需要一个循环。如果您使用XConvertSelection
并需要处理INCR属性,这尤其正确,因为这意味着需要显示服务器发送大量数据