【问题标题】:Grouping Windows in the tasklist在任务列表中对 Windows 进行分组
【发布时间】:2020-06-09 15:37:00
【问题描述】:

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

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

任何帮助将不胜感激!

提前致谢

【问题讨论】:

  • 这实际上并没有帮助,所以我不是将其写为答案,但是:是的,这在理论上是可能的。 C 代码将所有必要的信息导出到 Lua。但是,我不认为现有的tasklist Lua 代码对分组条目有任何现有的支持。

标签: awesome-wm tasklist


【解决方案1】:

实际上...是的,这在现有代码中是可能的。函数awful.widget.tasklist 获取一个表作为它的第一个参数。条目source 用于获取应显示的客户端列表(filter 用于仅选择其中的一个子集,例如当前选定标签上的那些)。

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

但是,这可能会与filter 交互。例如,如果您在另一个标签和当前标签上都有 XTerms,那么在source 函数中进行过滤可能意味着在另一个标签上选择客户端,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,
}

上面的代码意味着只显示每个类的第一个客户端。如果你想要例如单击代表多个类的条目时打开的弹出菜单,您将需要更多代码。这个答案只处理“外观”,而不是“行为”。

【讨论】:

  • 非常感谢您的帮助!感谢您花时间解释 - 它澄清了很多事情。视觉上唯一缺少的是,如果我将注意力集中在第一个窗口以外的另一个窗口上,任务列表中的焦点指示器会丢失。我试图看看是否可以找到一种方法将窗口类传递给 widget_template 而不是实际的客户端,但我没有成功。你会推荐什么是弹出窗口的好方法?不确定是否最好从 awesome.popup api 任务列表示例开始并尝试仅按窗口类过滤...
  • 嗯...检查客户端是否有焦点是client.focus == c。也许应该更改source 函数,以便它始终使用焦点客户端(如果存在)?对此的随机想法是将class_seen[c.class] = true 更改为class_seen[c.class] = #result 并将elseif client.focus == c then result[class_seen[c.class]] = c 附加到最里面的if。这会记住result 中每个“类”的位置,并在关注的客户“经过”时使用它来覆盖条目。
  • 谢谢!我试图实现您的答案,但行为仍然相同。我内心最深处的if 现在是这样的:if not class_seen[c.class] then class_seen[c.class] = #result table.insert(result, c) elseif client.focus == c then result[class_seen[c.class]] = c end
  • 其实有一个off-by-one错误,对吧? Lua 表从 1 开始索引,因此它需要为 #result + 1(或者:在 table.insert 更改表长度后计算 #result
  • 啊,这完全有道理!是的,现在可以按预期工作了:)非常感谢!至于弹出列表你有什么指点吗?
【解决方案2】:

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

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),

【讨论】:

  • if awful.rules.match(cl, {class= c.class}) then 只是if cl.class == c.class then
  • 啊,是的,谢谢!说得通。更新了上面的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多