Concentre-se na aplicação ao alterar os espaços de trabalho em awesome-wm

Concentre-se na aplicação ao alterar os espaços de trabalho em awesome-wm

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

informação relacionada