微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用 xcb 为窗口保留空间

如何解决无法使用 xcb 为窗口保留空间

我正在尝试使用 xcb 在 Rust 中创建一个状态栏。我已经在 C++ 中编写了一个已经使用 xcb 和 xlib 的混合,所以我将使用它作为比较点。如果重要的话,我也在 openBox 上测试这个,这是一个用 xlib 编写的窗口管理器。

我目前无法在 Rust 版本中为我的酒吧保留空间。下面是 xprop 的完整输出

WM_CLASS(STRING) = "onyxbar"
WM_NAME(STRING) = "bar"
_NET_WM_STRUT(CARDINAL) = 0,20,0
_NET_WM_STRUT_PARTIAL(CARDINAL) = 0,1920,3840,0
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY,_NET_WM_STATE_ABOVE
_NET_WM_WINDOW_TYPE(CARDINAL) = _NET_WM_WINDOW_TYPE_DOCK

您可以看到相关的 _NET_WM_STRUT_NET_WM_STRUT_PARTIAL 在这与我在 c++ 中的工作栏的 xprop 输出之间是相同的:

WM_STATE(WM_STATE):
                window state: normal
                icon window: 0x0
_NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_CHANGE_DESKTOP,_NET_WM_ACTION_BELOW
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 0,0
_NET_FRAME_EXTENTS(CARDINAL) = 0,0
_NET_WM_ICON(CARDINAL) =        Icon (48 x 48):  (some big ascii icon)
_OB_APP_TYPE(UTF8_STRING) = "dock"
_OB_APP_TITLE(UTF8_STRING) = "bar"
_OB_APP_GROUP_CLASS(UTF8_STRING) =
_OB_APP_GROUP_NAME(UTF8_STRING) =
_OB_APP_CLASS(UTF8_STRING) =
_OB_APP_NAME(UTF8_STRING) = "limebar"
_OB_APP_ROLE(UTF8_STRING) =
_NET_WM_VISIBLE_ICON_NAME(UTF8_STRING) = "bar"
_NET_WM_VISIBLE_NAME(UTF8_STRING) = "bar"
WM_CLASS(STRING) = "limebar","",""
WM_NAME(STRING) = "bar"
_NET_WM_STRUT(CARDINAL) = 0,0
_NET_WM_DESKTOP(CARDINAL) = 4294967295
_NET_WM_STATE(ATOM) = _NET_WM_STATE_ABOVE
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK

当然,C++ 版本的输出中有一些额外的信息,但我的理解是,在保留空间方面,只有 _NET_WM_STRUT_NET_WM_STRUT_PARTIAL 很重要。我在这里错过了什么?

解决方法

您的工作示例具有 WM_STATE 属性。非工作没有。

该属性由窗口管理器在管理窗口时设置。您是否可能在 Rust 版本中创建了一个覆盖重定向窗口,而不是在 C++ 版本中?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。