Сосредоточьтесь на приложении при смене рабочих пространств в awesome-wm

Сосредоточьтесь на приложении при смене рабочих пространств в awesome-wm

Я уже довольно давно использую archlinux в сочетании с awesome-wm. Я до сих пор не понял, как автоматически перехватывать фокус на приложении при смене рабочего пространства через Mod+number.

Например, у меня Firefox запущен на рабочем пространстве 2, а некоторые терминалы — на рабочем пространстве 1. Если я нахожусь в рабочем пространстве 2 и нажимаю Mod+1, чтобы перейти на рабочее пространство 1, ни один терминал не будет сфокусирован. Конечно, я могу щелкнуть по терминалу, чтобы получить фокус, или нажать Mod+j или Mod+k, но я бы хотел, чтобы это происходило автоматически.

Как я могу это сделать? Спасибо заранее!

решение1

Я разобрался, поэтому отвечу на свой вопрос. Возможно, это не лучший и не самый эффективный способ, но он выполняет свою работу. Этот вопрос больше подходит для stackoverflow, поскольку он больше ориентирован на программирование.

Я написал эту функцию, которая захватывает фокус на первом клиенте на экране (за исключением Conky, системного монитора, который я использую).

-- Grab focus on first client on screen
function grab_focus()
    local all_clients = client.get()
    for i, c in pairs(all_clients) do
        if c:isvisible() and c.class ~= "Conky" then
            client.focus = c
        end
    end
end

Теперь я вызываю эту функцию в rc.lua, где отображаются пронумерованные клавиши:

-- Bind all key numbers to tags.
...
if tags[screen][i] then
    awful.tag.viewonly(tags[screen][i])
    grab_focus()
end

решение2

Большое спасибо, Карлито. Я целый день пытался решить эту проблему, и твоя функция работает отлично.

Я просто вызываю его саму по себе «grab_focus()» в цикле привязки клавиш «for», который мне нужен.

Я использую Awesome 3.5 с Shifty, вот как я это исправил (обратите внимание на «grab_focus()»):

-- Bind all key numbers to tags.
-- Be careful: we use keycodes to make it works on any keyboard layout.
-- This should map on the top row of your keyboard, usually 1 to 9.

   for i = 1, (shifty.config.maxtags or 9) do
    globalkeys = awful.util.table.join(globalkeys,
        awful.key({ modkey }, "#" .. i + 9,
                  function ()
                      awful.tag.viewonly(shifty.getpos(i))
                      grab_focus()
                end),
        awful.key({ modkey, "Control" }, "#" .. i + 9,
                  function ()
                      awful.tag.viewtoggle(shifty.getpos(i))
                  end),
        awful.key({ modkey, "Shift" }, "#" .. i + 9,
                  function ()
                      if client.focus then
                          local t = shifty.getpos(i)
                          awful.client.movetotag(t)
                          awful.tag.viewonly(t)
                       end
                  end),
        awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
                  function ()
                      if client.focus then
                          awful.client.toggletag(shifty.getpos(i))
                      end
                  end))
end

решение3

Я обнаружил, что ранее упомянутый метод плохо работает на многоэкранных конфигурациях, поскольку проверка isvisible также проверяет другие экраны.

Изучив документацию API, я пришел к такому решению.

Отказ от ответственности: У меня нет большого опыта работы с awesome, и это моя первая попытка сделать что-то, что не является копипастой. Пока что для меня это работает хорошо.

for k,t in pairs(awful.tag.gettags(s)) do t:connect_signal("property::selected", function(t) local c = t.clients(t)[1] if c then client.focus = c end end) end

где 's' — это экран. Сделайте это для каждого экрана. У меня это в том же цикле, что и настройка тега в стандартном rc.lua.

По сути, мы проходим по тегам экрана и добавляем прослушиватель событий при выборе тега, который затем запускает функцию, которая подключает первого клиента к тегу и устанавливает его в качестве сфокусированного клиента.

Я использую awesome 3.5, и есть некоторые различия, о которых следует знать, если вы используете предыдущие версии. Например, в 3.4 функция connect_signal называется add_signal.

Это решение автоматически работает при переключении тегов другими способами, поскольку оно подключает прослушиватель к самой операции переключения тегов.

решение4

Я использую что-то вроде этого, чтобы автоматически захватывать фокус при изменении тега

tag.connect_signal("property::selected", function() focus_on_last_in_history(mouse.screen) end)

и этот для перефокусировки при закрытии окна на теге

client.connect_signal("unmanage", function() focus_on_last_in_history(mouse.screen) end)

function focus_on_last_in_history( screen )
  local c = awful.client.focus.history.get(screen, 0)
  if not (c == nil) then
    client.focus = c
    c:raise()
  end
end

Связанный контент