Как динамически скрыть границы от окон, когда они не выложены плиткой (Awesome WM)?
Я хотел бы удалить границу из любого окна, которое не является мозаичным (независимо от того, где оно максимизировано, или только одному окну, назначенному тегу) и добавить границы, как только оно станет мозаичным, и все это при использовании того же макета.
Я попробовал это решение (с изменением client.add_signal на client.connect_signal): http://blog.lazut.in/2012/11/awesome-wm-remove-border-from-maximized.html
client.connect_signal("focus",
function(c)
if c.maximized_horizontal == true and c.maximized_vertical == true then
c.border_width = "0"
c.border_color = beautiful.border_focus
else
c.border_width = beautiful.border_width
c.border_color = beautiful.border_focus
end
end)
но это работало только для некоторых развернутых окон и перезаписывало удаленные мной границы (например, для запуска синапса) через свойства в awful.rules.rules.
Я видел tiled(screen)
функция указана в официальной документации API, может быть, что-то можно сделать с этим? Я все еще новичок в Awesome WM, поэтому небольшая помощь будет оценена.
3 ответа
Вот что я имею в своем rc.lua для достижения того же результата:
for s = 1, screen.count() do
screen[s]:connect_signal("arrange", function ()
local clients = awful.client.visible(s)
local layout = awful.layout.getname(awful.layout.get(s))
-- No borders with only one visible client or in maximized layout
if #clients > 1 and layout ~= "max" then
for _, c in pairs(clients) do -- Floaters always have borders
if not awful.rules.match(c, {class = "Synapse"}) and awful.client.floating.get(c) or layout == "floating" then
c.border_width = beautiful.border_width
c.border_color = beautiful.border_focus
end
end
end
end)
end
Я добавил условие if not awful.rules.match(c, {class = "Synapse"})...
обработать указанный вами случай запуска synapse. Но это может быть уже охвачено другими условиями (модуль запуска уже должен быть плавающим, поэтому следующее условие не позволит ему получить границу)
Вот моя версия для Awesome 4.2:
screen.connect_signal("arrange", function (s)
local max = s.selected_tag.layout.name == "max"
local only_one = #s.tiled_clients == 1 -- use tiled_clients so that other floating windows don't affect the count
-- but iterate over clients instead of tiled_clients as tiled_clients doesn't include maximized windows
for _, c in pairs(s.clients) do
if (max or only_one) and not c.floating or c.maximized then
c.border_width = 0
else
c.border_width = beautiful.border_width
end
end
end)
Я считаю, что он правильно обрабатывает развернутые окна, окна, которые являются единственными видимыми в макете, и окна в макете 'max'. Он также игнорирует плавающие клиенты, как и должно быть.
В awesome 4.0 заголовки заголовков обеспечивают большую гибкость, чем границы окон. Я использую заголовки для создания верхней и левой границ. Таким образом, у меня есть границы, чтобы различать клиентов в мозаичном режиме, но я все еще могу переместить свою мышь к правому или нижнему краю экрана и щелкнуть полосу прокрутки. Это также помогает мне сказать, кто является целевым клиентом.
Вот кусок моего theme.lua
где я определяю theme.bar_width
:
-- {{{ Borders
theme.useless_gap = 0
theme.border_width = 0
theme.bar_width = 2
theme.border_normal = "#3F3F3F"
theme.border_focus = "#6F6F6F"
theme.border_marked = "#CC9393"
-- }}}
А вот две штуки из моего rc.lua
где я определяю два заголовка:
client.connect_signal("request::titlebars", function(c)
-- ...
-- The top bar
-- code was: awful.titlebar(c) : setup { ...
-- code became:
awful.titlebar(c, {
position = "top",
bg_normal = beautiful.border_normal,
bg_focus = beautiful.border_focus,
}):setup{
-- ...
}
-- The left bar
awful.titlebar(c, {
position = "left",
size = beautiful.bar_width,
bg_normal = beautiful.border_normal,
bg_focus = beautiful.border_focus,
})
-- ...
end)