无法使用 xcb 为 window 保留 space

Can't reserve space for window with xcb

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

我目前无法在 Rust 版本中为我的酒吧预订 space。下面是 xprop

的完整输出
WM_CLASS(STRING) = "onyxbar"
WM_NAME(STRING) = "bar"
_NET_WM_STRUT(CARDINAL) = 0, 0, 20, 0
_NET_WM_STRUT_PARTIAL(CARDINAL) = 0, 0, 20, 0, 0, 0, 0, 0, 1920, 3840, 0, 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, 0, 0
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 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, 20, 0
_NET_WM_STRUT_PARTIAL(CARDINAL) = 0, 0, 20, 0, 0, 0, 0, 0, 1920, 3840, 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++ 版本的输出中当然有一些额外的信息,但据我了解,在保留 space 时只有 _NET_WM_STRUT_NET_WM_STRUT_PARTIAL 才是重要的。我在这里错过了什么?

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

这个 属性 是由 window 经理在管理 window 时设置的。您是否可能在 Rust 版本中创建覆盖重定向 window,但在 C++ 版本中没有?