Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在X11中获取窗口属性长度的惯用方法?_C_Utf 8_X11 - Fatal编程技术网

C 在X11中获取窗口属性长度的惯用方法?

C 在X11中获取窗口属性长度的惯用方法?,c,utf-8,x11,C,Utf 8,X11,我昨天刚开始学习X11,我很难找到关于它的信息 我希望能够检索X11窗口的UTF-8标题\u NET\u WM\u名称。问题是你应该用一个长度参数来调用它。我目前的解决方案是首先使用XGetWindowProperty和0长度参数来检索字符串的长度,然后在返回长度的信息后再次调用XGetWindowProperty 问题是,这涉及到两次分配和释放。我不是一个超级高级程序员,但这可能不好,对吧?虽然在实践中,两次分配给一些小的和不常见的东西,如获得一个窗口标题,可能不会有太大的区别,但我到处都听到

我昨天刚开始学习X11,我很难找到关于它的信息

我希望能够检索X11窗口的UTF-8标题\u NET\u WM\u名称。问题是你应该用一个长度参数来调用它。我目前的解决方案是首先使用
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属性,这尤其正确,因为这意味着需要显示服务器发送大量数据