【问题标题】:Can't reserve space for window with xcb无法使用 xcb 为窗口预留空间
【发布时间】:2021-05-29 22:55:13
【问题描述】:

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

我目前无法在 rust 版本中为我的酒吧预留空间。下面是 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++ 版本的输出中还有一些额外的信息,但据我了解,在保留空间方面,只有 _NET_WM_STRUT 和 _NET_WM_STRUT_PARTIAL 很重要。我在这里错过了什么?

【问题讨论】:

    标签: x11 xlib xcb openbox


    【解决方案1】:

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

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

    【讨论】:

    • 我不能肯定地说,因为我对 X11 的所有知识都是有限的,但我基本上已经复制了对 xcb_change_property 的调用,就像它们在我的 c++ 版本中一样。不知道我会做些什么不同。如果有帮助,我可以发布确切的代码。
    • 在对xcb_create_window 的调用中,您可能没有将XCB_CW_OVERRIDE_REDIRECT 设置为1。在 Rust 版本中,您以某种方式设置了此覆盖重定向标志。这是我的猜测。如果您没有看到这样的差异,那么是的,我需要查看一些代码。
    • 好吧,我是个白痴,实际上我将覆盖重定向设置为 1。虽然这个项目似乎做同样的事情但它有效,但我觉得很奇怪:github.com/drscream/lemonbar-xft/blob/xft-port/lemonbar.c#L922
    • 他们将XCB_CW_OVERRIDE_REDIRECT 设置为dock 的值,默认为false(第115 行)。该变量由-d 命令行参数设置,该参数记录为“强制对接(如果您的 WM 不符合 EWMH,请使用此选项)”。所以,我猜如果你用-d 启动lemnobar-xft,它也不会在屏幕边缘保留空间。
    • (OverrideRedirect 在未显式设置时默认为 0/false,并且您链接到的代码只是显式设置了此隐式默认值。)
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2013-01-16
    • 2014-09-29
    相关资源
    最近更新 更多