Uma maneira alternativa de executar um comando se uma tela estiver conectada ou desconectada
Uma solução alternativa seria executar um pequeno script em segundo plano. Executando o script abaixo em segundo plano, não pude medir nenhum aumento na carga do processador.
É uma maneira fácil e conveniente de executar um script ou qualquer outro comando sempre que uma segunda tela for conectada ou desconectada.
O script de exemplo
- Simplesmente verifica a cada cinco segundos quantas vezes a string "conectado" ocorre na saída do comando
xrandr
(lembre-se do espaço após "conectado" para evitar correspondências falsas com "desconectado"). Cada ocorrência representa uma tela conectada.
- Se o número de ocorrências mudar, uma tela foi conectada ou desconectada. A alteração é "notada" pelo script e pode ser conectada a um comando, você pode definir na seção principal do script.
O script
#!/usr/bin/env python3
import subprocess
import time
#--- set both commands (connect / disconnect) below
connect_command = "gedit"
disconnect_command = ""
#---
def get(cmd): return subprocess.check_output(cmd).decode("utf-8")
# - to count the occurrenc of " connected "
def count_screens(xr): return xr.count(" connected ")
# - to run the connect / disconnect command(s)
def run_command(cmd): subprocess.Popen(["/bin/bash", "-c", cmd])
# first count
xr1 = None
while True:
time.sleep(5)
# second count
xr2 = count_screens(get(["xrandr"]))
# check if there is a change in the screen state
if xr2 != xr1:
print("change")
if xr2 == 2:
# command to run if connected (two screens)
run_command(connect_command)
elif xr2 == 1:
# command to run if disconnected (one screen)
# uncomment run_command(disconnect_command) to enable, then also comment out pass
pass
# run_command(disconnect_command)
# set the second count as initial state for the next loop
xr1 = xr2
Como usar
- Copie o script em um arquivo vazio, salve-o como
connect_screen.py
Na seção principal, defina o comando para executar no connect (defino "gedit" como exemplo, lembre-se das aspas). Também é possível definir um comando para desconectar, da mesma forma. Caso disconnect_command = ""
contrário, deixe como está.
Se você usar um comando de desconexão, descomente também a linha:
run_command(disconnect_command)
e comente a linha:
pass
Conforme indicado no script
- Teste o script a partir de um terminal, conecte sua tela e veja se tudo funciona bem.
Se tudo funcionar bem, adicione-o aos aplicativos de inicialização: Dash> Startup Applications> Add the command:
/bin/bash -c "sleep 15&&python3 /path/to/connect_screen.py"
O sleep 15
objetivo é fazer a área de trabalho inicializar completamente antes que o script comece a ser executado. Apenas para ter certeza.
EDITAR
Como executar o script na inicialização de uma maneira "inteligente".
A interrupção de sleep 15
deve funcionar em geral, mas como o tempo de inicialização varia de acordo com o sistema, pode levar algumas experiências para encontrar a hora certa. Com uma pequena adição, o script se torna "inteligente" e aguarda o xrandr
êxito do comando antes de iniciar o script real. Se você usa a versão abaixo, você só precisa adicionar o comando:
python3 /path/to/connect_screen.py
aos aplicativos de inicialização. O uso adicional é exatamente o mesmo da versão acima.
O script
#!/usr/bin/env python3
import subprocess
import time
#--- set both commands (connect / disconnect) below
connect_command = "gedit"
disconnect_command = ""
#---
while True:
time.sleep(5)
try:
subprocess.Popen(["xrandr"])
except:
pass
else:
break
# function to get the output of xrandr
def get(cmd): return subprocess.check_output(cmd).decode("utf-8")
# - to count the occurrenc of " connected "
def count_screens(xr): return xr.count(" connected ")
# - to run the connect / disconnect command(s)
def run_command(cmd): subprocess.Popen(["/bin/bash", "-c", cmd])
# first count
xr1 = None
while True:
time.sleep(5)
# second count
xr2 = count_screens(get(["xrandr"]))
# check if there is a change in the screen state
if xr2 != xr1:
if xr2 == 2:
# command to run if connected (two screens)
run_command(connect_command)
elif xr2 == 1:
# command to run if disconnected (one screen)
# uncomment run_command(disconnect_command) to enable, then also comment out pass
pass
# run_command(disconnect_command)
# set the second count as initial state for the next loop
xr1 = xr2