Есть ли что-то вроде "awful.client.focus.global_byidx ()"? - PullRequest
0 голосов
/ 06 мая 2020

У меня два монитора, и я хотел бы изменить клиент, ориентированный на ярлык. Сейчас у меня awful.client.focus.byidx(1), но он меняет клиентов только на одном мониторе. Я знаю, что есть awful.client.focus.global_bydirection("right"), который работает на нескольких экранах, но идет только в одном направлении и перестает работать, когда добирается до последнего клиента. Мне нравится поведение awful.client.focus.byidx(1), которое проходит через всех клиентов, поэтому от последнего клиента он переходит к первому.

Я хотел бы использовать гибрид между: проходящими через клиентов, как в awful.client.focus.byidx(1), но на всех мониторы / экраны, такие как awful.client.focus.global_bydirection("right"). Есть ли функция с таким поведением, чтобы я мог ее использовать? Если нет, знаете ли вы, как я могу достичь этой цели?

1 Ответ

0 голосов
/ 07 мая 2020

Во-первых, давайте посмотрим, как реализован 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
...