【问题标题】:X11: _NET_FRAME_EXTENTS window property. Not consistent return with XCBX11:_NET_FRAME_EXTENTS 窗口属性。与 XCB 的回报不一致
【发布时间】:2021-04-08 23:04:09
【问题描述】:

有问题的代码类似于这个 SO 主题:Get X11 window caption height。链接指向用Xlib 代码回答。这个想法是获取窗口属性,即_NET_FRAME_EXTENTS。代码一直等到窗口管理器设置装饰尺寸。答案中的代码会跳过所有事件,直到属性返回。

基本上我对XCB 做同样的事情。我想知道我刚刚创建的窗户的装饰尺寸。我用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 检查,因此,据我了解,回复属于该请求。在调用上述代码之前,我会映射窗口并刷新事件。

问题是,如何用XCB正确获取WM装饰?

【问题讨论】:

    标签: c x11 xcb


    【解决方案1】:

    我与链接的 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;
    

    【讨论】:

      猜你喜欢
      • 2021-01-26
      • 2019-03-29
      • 2020-11-10
      • 2018-11-30
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多