LINUX.ORG.RU

динамически создавать и удалять теги

 ,


0

1

есть теги 1 2 3 4 5 6 7 8 9

Я запускаю окно с классом «some_tag». И у меня появляется тег some_tag т.е

1 2 3 4 5 6 7 8 9 some_tag

Если в данном теге нет не одного окна, тег some_tag автоматически исчезает т.е получается так:

1 2 3 4 5 6 7 8 9

Такое возможно?

★★★

Последнее исправление: serg002 (всего исправлений: 1)

Этот велосипед уже есть в коде, что для меня тоже маленькое открытие. Например:

    { rule = { class = "Lxterminal" },
       properties = { new_tag = "Lxterminal", switchtotag = true },
    },

const92
()
Ответ на: комментарий от serg002
    { rule = { class = "Virt-manager" },
      properties = { screen = 1, 
		new_tag = { name = "VM", 
		            layout = awful.layout.suit.max,
		            volatile = true },
		switchtotag = true,
		floating = false,  
		maximized_vertical = false, 
		maximized_horizontal = false }  
		},

Поигрался, у меня вот так сработало. В layout соответственно какой тебе нужен.

frunobulax ★★★
()
Ответ на: комментарий от const92

Полезно, спасибо. А как бы на ходу такое делать, если окно уже создано, для него не существует правила, и я захотел его отправить на отдельный тег?

xenith
()
Ответ на: комментарий от xenith

Накидал функций из либ tag.lua и rules.lua:

clientkeys = gears.table.join(
    --...
    awful.key({ modkey,           }, "t",
        function (c)
            t = awful.tag.add(c.class or "N/A", {screen=c.screen, volatile=true})
            if not t then return end
            local tags = c:tags()
            table.insert(tags, t)
            c:tags(tags)
            c:move_to_tag(t)
            awful.tag.viewonly(t)
        end),
    --...
)
const92
()
Ответ на: комментарий от const92

Вау! Работает! Никогда не доходили руки разобраться как такое сделать. Спасибо огромное!

xenith
()
Ответ на: комментарий от const92

Немного переделал решение под себя.

    awful.key({ modkey, "Control" }, "t",
        function (c)
            local c_tags = c:tags()
            local t_name = c.class or "N/A"
            for _, t in pairs(c_tags) do
              if t.name == t_name then return end
              -- Already on the corresponding tag
            end

            local new_t = awful.tag.find_by_name(c.screen, t_name)
            if not new_t then
              new_t = awful.tag.add(t_name, {screen=c.screen, volatile=true})
              if not new_t then return end
            end

            table.insert(c_tags, new_t)
            c:tags(c_tags)
            c:move_to_tag(new_t)
            awful.tag.viewtoggle(new_t)
        end ,
        {description = "move client to a new tag", group = "client"})

Среди изменений:

  1. Если клиент уже находится на нужном теге, создание нового такого же и перемещение клиента на него, которое уничтожит старый тег и в сумме не даст совсем ничего, кроме сброса layout’а и т.п., не произойдёт.

  2. Часть посередине добавлена, чтобы не создавать дублирующиеся теги с одинаковым именем. Так оно работает в изначальном варианте, и это вполне себе не баг, а фича, но мне удобнее без дублей.

  3. После перемещения клиента происходит не переключение на свежесозданный тег, а лишь добавление его к списку активных. Мне так больше нравится, т.к. операция не деструктивная и переключиться на свежесозданный тег вручную всегда легче, чем возвращать обратно ранее активные теги после принудительного переключения. Есть ещё очень похожий вариант, где вместо перемещения клиента на новый тег и затем просмотра нескольких тегов одновременно делается почти то же самое – клиент добавлялся на новый тег, и не убирается при этом со старого, но под мой юзкейс более подходит то решение, которое описано в коде.

Думал придумать для правил что-нибудь подобное третьему пункту на замену switchtotag = true, чтобы правила тоже не переключали меня на новый тег, а лишь добавляли его к активным, но решил не заморачиваться, вручную и так легко это сделать, а надобность есть не то что бы постоянно.

Спасибо ещё раз за помощь.

xenith
()
Последнее исправление: xenith (всего исправлений: 1)
5 сентября 2021 г.
Ответ на: комментарий от frunobulax

Что-то у меня тот код выше через ж. работает – создает на каждое модальное окошко отдельный тег.

Переписал, убрал ту часть полностью, вышло как-то так:

client.connect_signal("property::class", function(c)
    if c.class == "Virt-manager" then
    t = awful.tag.find_by_name(awful.screen.focused(), "VM")
        if t then return end
        awful.tag.add("VM", {
            screen = 1,
            layout = awful.layout.suit.floating } )
        c:move_to_tag(screen[1].tags[5])
    end
end)

client.connect_signal("unmanage", function(c)
    if c.class == "Virt-manager" then
        t = awful.tag.find_by_name(awful.screen.focused(), "VM")
        if t then t:delete() end
        end
    end)

При запуске вирт-менеджера создает тег VM. Последующие запуски, открытие окошек настроек\виртуалок, etc. происходят внутри этого тэга. При закрытии всех окон вирт-менеджера тэг удаляется.

Надеюсь не страшно что в старую тему пишу, может кому пригодится.

frunobulax ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.