X11:_NET_FRAME_EXTENTSwindow属性。与 XCB 不一致 return
X11: _NET_FRAME_EXTENTS window property. Not consistent return with XCB
有问题的代码类似于此 SO 主题:。 link 指向用 Xlib
代码回答。这个想法是获得 window 属性,即 _NET_FRAME_EXTENTS
。代码一直等到 window 管理器设置装饰尺寸。答案中的代码会跳过所有事件,直到 属性 返回。
基本上我对 XCB
做同样的事情。我想知道我刚刚创建的 window 的装饰尺寸。我用 XCB
:
做的伪代码
cookie = xcb_get_property(...)
reply = xcb_get_property_reply(..., cookie, ...)
if(NULL == reply){
/* fail */
}
if(reply->type != type){
/* fail */
}
prop_size = xcb_get_property_value_length(reply);
prop_val = xcb_get_property_value (reply);
if(0 == prop_size){
/* fail */
}
if(/* not failed */){
copy returned data here
print and return success.
}
if(/* failed */)
then wait for events and skip them
repeat the above untill success
问题是有时值返回为零,有时值是正确的。从上面的代码可以看出,成功条件只有在类型匹配并且有一些数据被读取时。使用 cookie 检查请求,因此据我了解,回复属于请求。在调用上述代码之前,我确实映射了 window 和刷新事件。
问题是,如何使用XCB
正确获得WM装饰?
我与链接的 SO 主题相关联。主题中的答案做了正确的事情并提供了很好的见解,但未能正确执行。
解决方案是等待 XCB_PROPERTY_NOTIFY
事件并将收到的原子与 _NET_FRAME_EXTENTS
原子进行比较。如果所有检查都顺利,则 WM 已设置 _NET_FRAME_EXTENTS
属性。在接收到特定事件之前,获取 属性 的值是有意义的。这就是为什么我在应用程序的某些调用中得到零的原因。我的原始解决方案可能会在 WM 设置 属性.
之前更早地获得 属性 值
一些伪代码:
loop:
ev = xcb_wait_for_event(...);
...error checks...
if((ev->response_type & ~0x80) == XCB_PROPERTY_NOTIFY){
xcb_property_notify_event_t *pe = (xcb_property_notify_event_t*)ev;
if(pe->atom == {_NET_FRAME_EXTENTS atom}){
...get the _NET_FRAME_EXTENTS property...
}
}
...
loop end;
有问题的代码类似于此 SO 主题:Xlib
代码回答。这个想法是获得 window 属性,即 _NET_FRAME_EXTENTS
。代码一直等到 window 管理器设置装饰尺寸。答案中的代码会跳过所有事件,直到 属性 返回。
基本上我对 XCB
做同样的事情。我想知道我刚刚创建的 window 的装饰尺寸。我用 XCB
:
cookie = xcb_get_property(...)
reply = xcb_get_property_reply(..., cookie, ...)
if(NULL == reply){
/* fail */
}
if(reply->type != type){
/* fail */
}
prop_size = xcb_get_property_value_length(reply);
prop_val = xcb_get_property_value (reply);
if(0 == prop_size){
/* fail */
}
if(/* not failed */){
copy returned data here
print and return success.
}
if(/* failed */)
then wait for events and skip them
repeat the above untill success
问题是有时值返回为零,有时值是正确的。从上面的代码可以看出,成功条件只有在类型匹配并且有一些数据被读取时。使用 cookie 检查请求,因此据我了解,回复属于请求。在调用上述代码之前,我确实映射了 window 和刷新事件。
问题是,如何使用XCB
正确获得WM装饰?
我与链接的 SO 主题相关联。主题中的答案做了正确的事情并提供了很好的见解,但未能正确执行。
解决方案是等待 XCB_PROPERTY_NOTIFY
事件并将收到的原子与 _NET_FRAME_EXTENTS
原子进行比较。如果所有检查都顺利,则 WM 已设置 _NET_FRAME_EXTENTS
属性。在接收到特定事件之前,获取 属性 的值是有意义的。这就是为什么我在应用程序的某些调用中得到零的原因。我的原始解决方案可能会在 WM 设置 属性.
一些伪代码:
loop:
ev = xcb_wait_for_event(...);
...error checks...
if((ev->response_type & ~0x80) == XCB_PROPERTY_NOTIFY){
xcb_property_notify_event_t *pe = (xcb_property_notify_event_t*)ev;
if(pe->atom == {_NET_FRAME_EXTENTS atom}){
...get the _NET_FRAME_EXTENTS property...
}
}
...
loop end;