Foco na aplicação ao mudar espaços de trabalho em awesome-wm

4

Estou usando o archlinux em combinação com o awesome-wm por um bom tempo agora. Eu ainda não descobri como capturar automaticamente o foco em um aplicativo ao alterar o espaço de trabalho através do número Mod +.

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 ao espaço de trabalho 1, nenhum terminal será focalizado. Eu posso, é claro, clicar em um terminal para pegar o foco, ou pressionar Mod + j ou Mod + k, mas eu gostaria que isso acontecesse automaticamente.

Como posso tornar isso possível? Obrigado antecipadamente!

    
por Carlito 05.07.2012 / 19:14

6 respostas

4

Eu descobri então vou responder minha própria pergunta. Isso pode não ser o melhor ou mais eficiente, mas faz o trabalho. Esta questão pode caber mais no stackoverflow, uma vez que é mais focado na programação.

Eu escrevi essa função, que concentra o foco no primeiro cliente na tela (exceto no Conky, o monitor do sistema que eu 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

Eu agora chamo essa 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
    
por 06.07.2012 / 13:27
1

Muito obrigado Carlito, tenho lutado por toda a tarde para resolver esse problema e sua função funciona perfeitamente.

Eu apenas chamo por si só "grab_focus ()" no ciclo de "fixação de teclas" para "eu quero.

Eu uso o Awesome 3.5 com o Shifty, é assim que eu consertei (por favor, note "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
    
por 09.05.2014 / 19:07
1

Eu encontrei o método mencionado anteriormente para funcionar mal em configurações de tela múltipla, pois a verificação invisível também verifica outras telas.

Depois de olhar em volta da documentação da API, cheguei a essa solução

Disclaimer: Eu não tenho muita experiência com awesome e esta é a minha primeira tentativa de fazer qualquer coisa que não é um 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 tenho isso no mesmo loop como configuração de tags no padrão rc.lua.

Basicamente percorra as tags de uma tela e adicione um ouvinte de evento para quando a tag for selecionada, que então dispara a função que recebe o primeiro cliente conectado à tag e a define como o cliente em foco.

Estou usando o impressionante 3.5 e há algumas diferenças a ter em conta se você estiver usando versões anteriores. Em 3.4, por exemplo, a função connect_signal é nomeada add_signal.

Esta solução funciona automaticamente ao alternar as tags por outros meios para conectar um ouvinte à operação de alternar as próprias tags.

    
por 07.12.2014 / 20:49
0

O que não gosto com essas soluções é que elas nem sempre focam o cliente sob o mouse.

O A melhor solução que encontrei é o script que você precisa colocar em seu rc.lua:

tag.connect_signal(
"property::selected",
  function (t)
    local selected = tostring(t.selected) == "false"
    if selected then
     local focus_timer = timer({ timeout = 0.2 })
     focus_timer:connect_signal("timeout", function()
    local c = awful.mouse.client_under_pointer()
    if not (c == nil) then
      client.focus = c
      c:raise()
    end
    focus_timer:stop()
  end)
  focus_timer:start()
 end
end)
    
por 25.07.2015 / 00:01
0

Eu uso algo assim para capturar automaticamente o foco na alteração da tag

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

e este para reorientar 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
    
por 22.07.2016 / 19:41
0

Com a versão 4.0 mais recente do incrível, nenhuma dessas soluções estava funcionando.

Aqui está um que irá focar automaticamente o cliente que estiver sob o mouse sempre que você trocar tags / espaços de trabalho.

tag.connect_signal("property::selected", function (t)
    local selected = tostring(t.selected) == "true"
    if selected then
        local mouseX = mouse.coords().x
        local mouseY = mouse.coords().y
        for k,v in pairs(t.screen.all_clients) do
            if v.first_tag.index==t.index and mouseX>=v.x and mouseX<=(v.x+v.width) and mouseY>=v.y and mouseY<=(v.y+v.height) then
                client.focus = v
                v:raise()
            end
        end
    end
end)
    
por 03.03.2017 / 20:30