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;