
Estou usando o archlinux em combinação com o awesome-wm já há algum tempo. Ainda não descobri como obter automaticamente o foco em um aplicativo ao alterar o espaço de trabalho por meio do Mod + número.
Por exemplo, tenho o Firefox em execução no espaço de trabalho 2 e alguns terminais no espaço de trabalho 1. Se eu estiver no espaço de trabalho 2 e pressionar Mod+1 para ir para o espaço de trabalho 1, nenhum terminal será focado. É claro que posso clicar em um terminal para focar ou pressionar Mod+j ou Mod+k, mas gostaria que isso acontecesse automaticamente.
Como posso tornar isso possível? Desde já, obrigado!
Responder1
Eu descobri, então responderei minha própria pergunta. Essa pode não ser a maneira melhor ou mais eficiente, mas dá conta do recado. Esta questão pode caber mais no stackoverflow, uma vez que é mais focada em programação.
Eu escrevi esta função, que foca no primeiro cliente na tela (exceto Conky, o monitor do sistema que uso).
-- 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
Agora chamo esta função em rc.lua onde as chaves numeradas são mapeadas:
-- Bind all key numbers to tags.
...
if tags[screen][i] then
awful.tag.viewonly(tags[screen][i])
grab_focus()
end
Responder2
Muito obrigado Carlito, estive lutando a tarde toda para resolver esse problema e sua função funciona perfeitamente.
Eu apenas chamo isso de "grab_focus ()" no ciclo de atalho "for" que desejo.
Eu uso o Awesome 3.5 com Shifty, foi assim que consertei (observe "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
Responder3
Achei que o método mencionado anteriormente funcionava mal em configurações de múltiplas telas, pois a verificação isvisible também verifica outras telas.
Depois de dar uma olhada na documentação da API, cheguei a esta solução
Isenção de responsabilidade: não tenho muita experiência com o incrível e esta é minha primeira tentativa de fazer qualquer coisa que não seja copiar e colar. Até agora, para mim, está funcionando bem.
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
onde 's' é a tela. Faça isso para cada tela. Eu o tenho no mesmo loop da configuração da tag no rc.lua padrão.
Basicamente, percorremos as tags de uma tela e adicionamos um ouvinte de evento para quando a tag é selecionada, que então dispara a função que conecta o primeiro cliente à tag e o define como o cliente em foco.
Estou usando o incrível 3.5 e há algumas diferenças que você deve conhecer se estiver usando versões anteriores. No 3.4, por exemplo, a função connect_signal é denominada add_signal.
Esta solução funciona automaticamente ao trocar tags por outros meios, pois conecta um ouvinte à própria operação de troca de tags.
Responder4
Eu uso algo assim para focar automaticamente na mudança de tag
tag.connect_signal("property::selected", function() focus_on_last_in_history(mouse.screen) end)
e este para focar novamente ao fechar uma janela em uma tag
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