i3: Como iniciar um programa com tempo de inicialização longo em um espaço de trabalho especificado

4

É possível no meu arquivo de inicialização do i3 configurar especificamente uma área de trabalho na qual iniciar um programa, mas apenas iniciá-lo uma vez sem atribuir esse programa à área de trabalho em geral.

Estou ciente de que existe uma solução que envolve a mudança para outro espaço de trabalho, mas isso me deixa com um grande problema: Assim que eu tiver um programa com um tempo de inicialização 'não instantâneo', esse programa aparecerá no último espaço de trabalho para o qual eu alternar e não no espaço de trabalho onde eu quero que ele esteja.

Em específico, este meu arquivo de inicialização atual onde eu fiz uma solução envolvendo a atribuição de atom (que é o programa me incomodando) para o espaço de trabalho 9, o que é ok por enquanto, mas é indesejável a longo prazo:

assign [class="Atom"] $workspace9
exec atom

exec --no-startup-id i3-msg 'workspace $workspace9; exec 
/usr/bin/urxvt'
#exec --no-startup-id i3-msg 'workspace $workspace9; exec /usr/bin/atom'
exec --no-startup-id i3-msg 'workspace $workspace1; exec /usr/bin/urxvt'

Eu gostaria de obter a chamada comentada de atom para executar da maneira desejada e abandonar o método de atribuição em conjunto.

Na verdade, não acho que seja relevante, mas apenas no caso: eu executo o Manjaro-Linux, que é baseado no Arch.

Editar: o trecho de código a seguir funciona, mas ainda deixa esta questão em aberto, pois me restringe a abrir o Google Analytics por último e iniciar minha sessão na área de trabalho:

#assign [class="Atom"] $workspace9
#exec atom

exec --no-startup-id i3-msg 'workspace $workspace9; exec 
/usr/bin/urxvt'
exec --no-startup-id i3-msg 'workspace $workspace1; exec /usr/bin/urxvt'
exec --no-startup-id i3-msg 'workspace $workspace9; exec /usr/bin/atom'

Isso também tem a desvantagem significativa de não permitir vários programas iniciando em espaços de trabalho diferentes, se eles mostrarem o mesmo comportamento que o átomo.

    
por tillyboy 04.05.2017 / 18:23

3 respostas

1

Aguarde até que a janela apareça e, em seguida, envie-a para a área de trabalho original:

#!/bin/bash

activeworkspace=$(i3-msg -t get_workspaces | jq -c '.[] | select(.focused) | .name' --raw-output)
atom &
windowname=atom
xprop -spy -root _NET_ACTIVE_WINDOW | \
  while read line ; do 
      if xprop WM_CLASS -id ${line##* } | grep -q $windowname ; then
          i3-msg move "[con_id=\"${line##* }\"]" $activeworkspace
          exit
      fi
  done
  • Primeiro, obtenha o espaço de trabalho ativo, use jq como exemplo
  • execute seu programa em segundo plano: atom &
  • Use xprop -spy para 'Examine as propriedades da janela para sempre, procurando eventos de alteração de propriedade.'
  • Atuar em todas as novas janelas ativas com while read line
  • Obtenha WM_CLASS deles com xprop WM_CLASS , extraia o windowid com bash ${line##* }
  • Filtrar com grep $windowname
  • Mover a janela para o espaço de trabalho original com i3-msg move ..

Você deve permanecer no espaço de trabalho ativo e uma janela nesse espaço de trabalho deve ficar focada.

Não funciona quando você tem várias janelas de átomo que se concentram entre o início e o movimento de uma nova janela atômica. Nesse caso, você teria que procurar o átomo NET_WM_PID em vez de WM_CLASS.

    
por 05.05.2017 / 12:14
0

Suas chamadas comentadas funcionam com aplicativos que suportam notifcações de inicialização - na verdade, o exemplo "Iniciar o iceweasel na área de trabalho 3 (uma vez)" no guia do usuário tem quase o mesmo comando exec :

exec --no-startup-id i3-msg 'workspace 3; exec iceweasel; workspace 1'

Atom no entanto parece não oferecer suporte a notificações de inicialização , então você precisa continuar usando o método assign .

    
por 05.05.2017 / 07:24
0

Se você deseja sempre ter programas específicos (por exemplo, Atom) abertos em espaços de trabalho específicos, é possível usar a funcionalidade de classe de designação descrita no Documentação do usuário do i3

Execute xprop do seu terminal e clique na janela (por exemplo, Firefox) para ver a qual classe ele pertence. Procure por WM_CLASS(STRING) .

Então, é tão simples quanto colocar a seguinte linha no seu arquivo .config:

assign [class="Firefox"] 2 

Não se esqueça de reiniciar sua instância usando (padrão) $Mod + Shift + r

Agora, o Firefox sempre será aberto no espaço de trabalho 2, independentemente de onde ou quando eu o execute. Você poderia fazer o mesmo com o Atom, e isso liberaria você para iniciar sua área de trabalho onde quisesse.

    
por 02.03.2018 / 20:18