在任务列表中分组 Windows

Grouping Windows in the tasklist

我目前在所有标签上使用 here 的纯图标样式任务列表。这使我对系统上 运行 的所有内容有了一个很好的了解。如果我有很多程序 运行,任务栏很快就会变得混乱。

我想知道是否有办法将 windows 按 class 分组。例如,让所有 firefox windows 彼此相邻,所有终端彼此相邻,等等。另一个不错的选择可能是将它们全部堆叠在一起 - 例如只有一个终端图标在弹出菜单中包含所有可访问的终端子进程的任务栏。我试图为这两种选择想出一些办法,但不幸的是,这超出了我的知识范围:)

如有任何帮助,我们将不胜感激!

提前致谢

实际上...是的,这在现有代码中是可行的。函数 awful.widget.tasklist 得到一个 table 作为它的第一个参数。条目 source 用于获取应显示的客户端列表(并且 filter 仅用于 select 其中的一个子集,例如当前 select编辑标签)。

source 的默认值是 awful.widget.tasklist.source.all_clients,即 returns client.get()(所有存在的客户端)。如果您将其替换为每个 class 只有 returns 一个客户端的函数,那么您会得到想要的。

但是,这可能会与 filter 交互。例如,如果您有 XTerms 一个另一个标签和当前标签,那么在 source 函数中过滤可能意味着一个 select 客户端在另一个标签上并且 filter 然后被删除也是如此。所以,我想 filter 这样做更有意义,但过滤器看不到所有客户端的列表,而只看到一个。

一种可能的方法是在 source 函数中调用 filter。未经测试的草图:

s.mytasklist = awful.widget.tasklist {
    screen = s,
    filter = function() return true end, -- Filtering is already done in source
    source = function()
        -- Get all clients
        local cls = client.get()

        -- Filter by an existing filter function and allowing only one client per class
        local result = {}
        local class_seen = {}
        for _, c in pairs(cls) do
            if awful.widget.tasklist.filter.currenttags(c, s) then
                if not class_seen[c.class] then
                    class_seen[c.class] = true
                    table.insert(result, c)
                end
            end
        end
        return result
    end,
}

以上代码意味着只显示每个 class 的第一个客户端。如果你想要例如单击代表多个 class 的条目时打开的弹出菜单,您将获得更多代码。此答案仅处理 "look",不处理 "behaviour"。

除了 Uli 对组合多个客户端的回答之外,如果我的 tasklist_buttons 中有超过 1 个特定 class 的客户端,我还使用下面的代码生成弹出菜单。如果有更有效的方法,请随时告诉我:)我还是个新手。

awful.button({ }, 1, function (c)

    if cl_menu then
        cl_menu:hide()
        cl_menu=nil
    else
        client_num=0
        client_list={}
        for i, cl in pairs(client.get()) do
            if cl.class == c.class then
                client_num = client_num + 1
                client_list[i]=
                  {cl.name,
                   function()
                       client.focus = cl
                       awful.tag.viewonly(cl:tags()[1])
                       cl:raise()
                   end,
                   cl.icon
                  }
           end
        end

        if client_num > 1 then
            cl_menu=awful.menu({items = client_list, theme = {width=300}})
            cl_menu:show()
        else
            client.focus = c
            awful.tag.viewonly(c:tags()[1])
            c:raise() 
        end
    end
end),