仅在浮动窗口上显示标题栏

时间:2017-02-21 19:31:12

标签: lua awesome-wm

awesome 4.0中,有没有办法只在浮动窗口上显示标题栏?

查看文档,似乎没有开箱即用的选项。

指定;我正在寻找一种解决方案,当我在平铺和浮动之间动态切换窗口时,它可以正常工作。

3 个答案:

答案 0 :(得分:1)

有点晚了,但我也想这样做,而且我大部分都在努力。当您希望客户端显示或隐藏其标题栏时,它并未涵盖所有情况,但它足够接近我的用例。 这很简单,首先需要为每个客户端禁用标题栏,因此在与所有客户端匹配的默认规则的属性中添加titlebars_enabled = false
然后,当客户端浮动时,您需要切换其标题栏,并在其停止浮动时将其切换为关闭 我编写了这个小帮助函数来使代码更清晰。这很简单,如果strue然后显示条形,则隐藏它。但是有一个问题,在我们的例子中,窗口从未有过标题栏,所以它还没有创建。如果当前的信号是空的,我们发送信号给我们建一个。

-- Toggle titlebar on or off depending on s. Creates titlebar if it doesn't exist
local function setTitlebar(client, s)
    if s then
        if client.titlebar == nil then
            client:emit_signal("request::titlebars", "rules", {})
        end
        awful.titlebar.show(client)
    else 
        awful.titlebar.hide(client)
    end
end

现在我们可以挂钩属性更改:

--Toggle titlebar on floating status change
client.connect_signal("property::floating", function(c)
    setTitlebar(c, c.floating)
end)

但这仅适用于在创建后更改状态的客户端。我们需要一个挂钩,用于浮动或浮动标记的新客户端:

-- Hook called when a client spawns
client.connect_signal("manage", function(c) 
    setTitlebar(c, c.floating or c.first_tag.layout == awful.layout.suit.floating)
end)

最后,如果当前布局是浮动的,则客户端没有浮动属性集,因此我们需要为布局更改添加一个钩子,以在内部客户端添加tittlebars。

-- Show titlebars on tags with the floating layout
tag.connect_signal("property::layout", function(t)
    -- New to Lua ? 
    -- pairs iterates on the table and return a key value pair
    -- I don't need the key here, so I put _ to ignore it
    for _, c in pairs(t:clients()) do
        if t.layout == awful.layout.suit.floating then
            setTitlebar(c, true)
        else
            setTitlebar(c, false)
        end
    end
end)

我不想在此花费太多时间,因此它不包括客户端在浮动布局中被标记的情况,或者客户端被多次标记并且其中一个标记是浮动的情况。

答案 1 :(得分:0)

更改

{ rule_any = {type = { "normal", "dialog" }
  }, properties = { titlebars_enabled = true }
},

{ rule_any = {type = { "dialog" }
  }, properties = { titlebars_enabled = true }
},

答案 2 :(得分:0)

Niverton 的解决方案非常适合简单地从平铺模式切换到浮动模式;但是,浮动窗口在最大化然后未最大化时将丢失其标题栏。要解决此问题,更好的解决方案是替换

client.connect_signal("property::floating", function(c)
    setTitlebar(c, c.floating)
end)

client.connect_signal("property::floating", function(c)
    setTitlebar(c, c.floating or c.first_tag and c.first_tag.layout.name == "floating")
end)

这应该可以解决问题,以便窗口可以正确最大化,而无需切换到平铺模式并返回以再次获取标题栏。

我在 u/Ham5andw1ch 提供的关于该主题的 reddit 帖子中发现了这个总体想法。我刚刚使用 Niverton 提出的函数和一些短路逻辑简化了代码。