A opção preferida
Se um aplicativo oferece a opção de inicializar na bandeja, sem dúvida essa é a opção preferida.
Se não, no entanto, você precisa editar o código do aplicativo e recompilar (não a opção mais óbvia), ou você precisa "reparar" o comportamento do procedimento de inicialização. Uma versão ligeiramente editada de este script pode fazer o trabalho nesse caso.
Sobre esta resposta
Estou deliberadamente ignorando a linha em sua pergunta:
"não fechar esses aplicativos na bandeja do sistema"
Desde o fechamento da janela depois que ela surgiu , deixar o ícone na bandeja é simplesmente a única opção que temos. Efetivamente você não notará a diferença no entanto.
Explicação
- O script inicializa o aplicativo, executando o comando que você forneceu como primeiro argumento.
- Em seguida, o script verifica a lista de janelas (com a ajuda de
wmctrl
) para janelas, com o pid do aplicativo iniciado. -
Se a janela aparecer, ela é imediatamente fechada com graciosidade, com a ajuda do comando
wmctrl
:wmctrl -ic <window_id>
-
O resultado:
semumajaneladetransmissão(nesteexemplo).Obviamente,aimagemédaUnity,masfuncionadamesmaformaem
lxde
.
Paraevitarumloopinfinitoseajanelanãoaparecerporalgummotivo,oscriptpraticaumlimitedetempode30segundosparaqueajanelaapareça.
Nota
Nãohánecessidadedemencionarqueoscriptsóinicializaráoaplicativonabandejadosistemaseoaplicativotiverumíconenabandejadosistema,senãoelesimplesmentefecharáoaplicativocompletamentesesóajanelaestáfechada.
Oscript
#!/usr/bin/env python3
import subprocess
import sys
import time
command = sys.argv[1]
command_check = command.split("/")[-1]
subprocess.Popen(["/bin/bash", "-c", command])
t = 1
while t < 30:
try:
w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()]
proc = subprocess.check_output(["pgrep", "-f", command_check]).decode("utf-8").strip().split()
match = sum([[l[0] for l in w_list if p in l] for p in proc], [])
subprocess.Popen(["wmctrl", "-ic", match[0]])
break
except (IndexError, subprocess.CalledProcessError):
pass
t += 1
time.sleep(1)
Como usar
-
O script precisa de
wmctrl
:sudo apt-get wmctrl
-
Copie o script em um arquivo vazio, salve-o como
run_intray.py
-
Teste: execute o script com o aplicativo como argumento, por exemplo, no exemplo
transmission
:python3 /path/to/run_intray.py transmission-gtk
-
Se tudo funcionar bem, você pode adicioná-lo ao Aplicativo de Inicialização, mas observe que provavelmente precisará adicionar uma pequena quebra antes do comando, para a área de trabalho para construir completamente primeiro:
/bin/bash -c "sleep 15 && python3 /path/to/run_intray.py transmission-gtk"