
Я уже довольно давно использую 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