如何切换 AwesomeWM 中的标题栏?

How to toggle the titlebar in AwesomeWM?

我正在尝试按以下方式修改我的 rc.lua 文件:当我按 Mod4+R,AwesomeWM 键绑定 运行 一个命令时,我希望 Rofi 出现,模糊我的墙纸并隐藏我屏幕上的一切。我只想看到模糊壁纸上的 Rofi 提示。

为此,我的 conf 文件中包含以下代码。我正在使用 AwesomeWM v3.5.9 (Mighty Ravendark) 和 Lua 5.3.3:

--From PROmpt COMmand:
procom = "rofi -show run"

awful.key({ modkey }, "r", function () awful.util.spawn(procom)

    for _,c in ipairs(client.get()) do
        if c:isvisible() then
            mywibox[mouse.screen].visible = not mywibox[mouse.screen].visible 
        else 
            mywibox[mouse.screen].visible = mywibox[mouse.screen].visible 
        end
    end

end),

重启AwesomeWM 一点问题都没有,但是我的wibox 不会消失。如果我将代码更改为一些微不足道的东西(即 if mywibox[mouse.screen],visible 作为条件语句), 小部件 将消失,但即使我退出 Rofi,一个空的黑条仍将留在那里,只有再次召唤罗菲时才会回到初始状态(这是我最初的说法造成的,所以我认为是微不足道的)。

对于新问题:

您的代码片段不起作用,因为您检查客户端是否可见,然后切换随机 wibox(好吧,不是那么随机)。 wibox 将多次显示和隐藏,您是否为每个客户执行此操作。所以你最终有 ~50% 的变化回到原始状态,~50% 的变化没有 wibox 并且没有办法恢复它。

我将扩展我之前回答的最后一部分,因为它现在是问题。

你想要什么:

  • rofi 启动时隐藏 wibar (mywibox)
  • rofi 启动时隐藏所有客户端
  • rofi存在时恢复wibar
  • 也许再次显示标签(或不显示,由您决定)。

问题是:

  1. 你不知道rofi什么时候退出
  2. 你不知道rofi什么时候出现
  3. 您不知道要隐藏的东西的名称
  4. 您需要隐藏标签和wibar

问题三:

不是你的错,3.5 没有这方面的文档,wiki 同样令人困惑。

  • awful.wibox(现在更名为 wibar)是屏幕顶部的东西
  • 一个 wibox 是屏幕上随机自由浮动的小部件。 wibar 是一种类似于面板的 wibox。
  • 一个客户在屏幕上是window
  • 标签类似于虚拟工作区

问题二:

这个很棘手。当您启动命令时,在该命令与应用程序出现之间存在延迟。有多种方法可以检测到它,但它们并非微不足道。现在你可以忽略这个问题。

问题一:

这是您真正需要解决的问题。 Awesome 3.5 没有很好的 API 来跟踪从命令到应用程序退出的生命周期。 Awesome 4.0 稍微好一点,但这是一个很难解决的问题。不过,rofi的class(using xprop)大家应该都知道吧。一旦你知道了这一点,你就可以通过只关心 "do an event when rofi exits" 来简化问题。代码是:

client.connect_signal("unmanage", function(c)
    if c.class == "whatever_its_class_is" then
        -- watch out of you have multiple screens, this may be too simplified.
        mywibox[mouse.screen].visible = true

        -- show the first tag, change this to what you prefer
        awful.tag.gettags(mouse.screen)[1].selected = true
    end
end)

问题四:

隐藏当前标签的简单方法(为简单起见,假设您有 1 个屏幕和 1 个选定标签)

awful.tag.selected().selected = false

隐藏主 wibar(假设您保留默认名称)

mywibox[mouse.screen].visible = false

原答案:(问题已更改)

嗯,c只是一个变量。在这种情况下,您从未定义它,所以它是 nil.

我猜你想要所有当前可见的客户端。要检查这一点,请使用 client:isvisible().

您可以使用

遍历所有客户端
for _, c in ipairs(client.get()) do
    if c:isvisible() then
        -- do something
    end
end

如客户端文档所示 (https://awesomewm.org/apidoc/classes/client.html [1])

话虽这么说,但我不明白描述和 question/code 是如何吻合的。如果您想隐藏所有内容,请取消选择所有标签并隐藏 wibar。弄乱标题栏(客户端顶部的东西)似乎是不必要的。

[1] link 适用于 Awesome 4.0,但在这种情况下与 3.5 没有太大区别 API。

现在我的 rc.lua 中的整个功能。工作正常,但我计划在未来改进它。不过,完美地回答了这个问题。

 -- Prompt
    awful.key({ modkey }, "r", 
              function ()
                  myscreen                 = awful.screen.focused()
                  commandPrompter          = "rofi -show run -normal-window"
                  blur                     = "hsetroot -fill /usr/local/share/awesome/themes/modded/back$
                  unblur                   = "hsetroot -fill /usr/local/share/awesome/themes/modded/back$
                  awful.spawn(commandPrompter)
                  myscreen.mywibox.visible = false
                  awful.spawn(blur)
              end),