Un modo alternativo per eseguire un comando se uno schermo è collegato o disconnesso
Una soluzione alternativa sarebbe quella di eseguire un piccolo script in background. Eseguendo lo script di seguito in background, non sono riuscito a misurare alcun aumento del carico del processore.
È un modo semplice e conveniente per eseguire uno script o qualsiasi altro comando, quando una seconda schermata è connessa o disconnessa.
Lo script di esempio
- Controlla semplicemente ogni cinque secondi quante volte si verifica la stringa "connesso" nell'output del comando
xrandr
(attenzione allo spazio dopo "connesso" per evitare false corrispondenze con "disconnesso"). Ogni occorrenza rappresenta una schermata collegata.
- Se il numero di occorrenze cambia, uno schermo è stato collegato o disconnesso. La modifica viene "notata" dallo script e può essere collegata a un comando, è possibile impostare nella sezione head dello script.
Il copione
#!/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
Come usare
- Copia lo script in un file vuoto, salvalo come
connect_screen.py
Nella sezione head, imposta il comando per eseguire su connect (ho impostato "gedit" come esempio, attenzione alle virgolette). Allo stesso modo è anche possibile impostare un comando su disconnect. Altrimenti partire disconnect_command = ""
così com'è.
Se si utilizza un comando di disconnessione, rimuovere anche il commento dalla riga:
run_command(disconnect_command)
e commenta la riga:
pass
Come indicato nella sceneggiatura
- Esegui il test dello script da un terminale, collega lo schermo e verifica se tutto funziona correttamente.
Se tutto funziona correttamente, aggiungilo alle applicazioni di avvio: Dash> Applicazioni di avvio> Aggiungi il comando:
/bin/bash -c "sleep 15&&python3 /path/to/connect_screen.py"
Il sleep 15
è quello di rendere il desktop avvio completamente prima che lo script inizia a correre. Giusto per essere sicuri.
MODIFICARE
Come eseguire lo script all'avvio in modo "intelligente".
L'interruzione sleep 15
dovrebbe funzionare in generale, ma poiché il tempo di avvio varia a seconda del sistema, potrebbero essere necessari alcuni esperimenti per trovare il momento giusto. Con una piccola aggiunta, lo script diventa "intelligente" e attende che il xrandr
comando abbia esito positivo prima di avviare lo script effettivo. Se usi la versione seguente, devi solo aggiungere il comando:
python3 /path/to/connect_screen.py
alle tue applicazioni di avvio. L'ulteriore utilizzo è esattamente lo stesso della versione precedente.
Il copione
#!/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