在任务列表中分组 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),
我目前在所有标签上使用 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),