Во-первых, давайте посмотрим, как реализован 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: получить клиента по желаемому смещению и вернуть его
Итак, ваш запрос звучит как вам нужно изменить только один шаг: получить список всех видимых клиентов, а не только тех, которые находятся на текущем экране. Чтобы получить этот список, вам нужно позвонить awful.client.visible
с nil
вместо специального c экрана.
Непроверенный код:
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 и исправление обезьяны становится постоянным)
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