Как динамически скрыть границы от окон, когда они не выложены плиткой (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)
Другие вопросы по тегам