首先,我们来看看awful.client.focus.byidx是如何实现的。
函数本身调用awful.client.next,然后聚焦返回的客户端,如果找到的话:
https://github.com/awesomeWM/awesome/blob/9781f14b105ee700c5bca339bf49bb52d2cca4b5/lib/awful/client/focus.lua#L65-L71
awful.client.next在这里实现:https://github.com/awesomeWM/awesome/blob/9781f14b105ee700c5bca339bf49bb52d2cca4b5/lib/awful/client.lua#L262-L284
它执行以下操作:
- 第 263 行:获取当前关注的客户
- 第 267 行:获取可见客户端屏幕上的所有可见客户端
- 第 270-274 行:从列表中过滤掉无法聚焦的客户
- 第 277 - 278 行:在结果列表中找到焦点客户
- 第 280 行:获取所需偏移量的客户端并返回
因此,您的请求听起来您只需要在此处更改一步:获取所有可见客户端的列表,而不是仅获取当前聚焦屏幕上的那些。
要获取该列表,您需要使用 nil 而不是特定屏幕调用 awful.client.visible。
未经测试的代码:
function next_global(i, sel, stacked)
sel = sel or client.focus
if not sel then return end
local cls = awful.client.visible(nil, stacked)
local fcls = {}
for _, c in ipairs(cls) do
if awful.client.focus.filter(c) or c == sel then
table.insert(fcls, c)
end
end
cls = fcls
for idx, c in ipairs(cls) do
if c == sel then
return cls[gears.math.cycle(#cls, idx + i)]
end
end
end
function focus_byidx_global(i, c)
local target = next_global(i, c)
if target then
target:emit_signal("request::activate", "client.focus.byidx", {raise=true})
end
end
我不知道您使用的是哪个版本的 AwesomeWM。如果有疑问,请查看/usr/share/awesome/lib/ 中的已安装文件并从那里复制代码,然后进行更改。
(一个更丑陋的解决方案类似于以下,即使它需要更少的代码;我把它留给读者作为练习,让读者弄清楚这是做什么的,但请注意,这会“破坏东西”,以防万一发生 Lua 错误,monkey-patching 变为永久)
function focus_byidx_global(i, c)
local old = awful.client.visible
awful.client.visible = function(_, s) return old(nil, s) end
awful.client.focus.byidx(i, c)
awful.client.visible = old
end