Una forma alternativa de ejecutar un comando si una pantalla está conectada o desconectada
Una solución alternativa sería ejecutar un pequeño script de fondo. Al ejecutar el siguiente script en segundo plano, no pude medir ningún aumento en la carga del procesador.
Es una manera fácil y conveniente de ejecutar un script, o cualquier otro comando, siempre que una segunda pantalla esté conectada o desconectada.
El guion de ejemplo
- Simplemente comprueba cada cinco segundos cuántas veces se produce la cadena "conectado" en la salida del comando
xrandr
(tenga en cuenta el espacio después de "conectado" para evitar coincidencias falsas con "desconectado"). Cada aparición representa una pantalla conectada.
- Si el número de ocurrencias cambia, se conectó o desconectó una pantalla. El cambio es "notado" por el script y puede conectarse a un comando, puede configurarlo en la sección principal del script.
La secuencia de comandos
#!/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
Cómo utilizar
- Copie el script en un archivo vacío, guárdelo como
connect_screen.py
En la sección de cabecera, configure el comando para que se ejecute en connect (configuro "gedit" como ejemplo, tenga en cuenta las comillas). También es posible establecer un comando de desconexión, de la misma manera. De lo contrario deja disconnect_command = ""
como está.
Si utiliza un comando de desconexión, también elimine el comentario de la línea:
run_command(disconnect_command)
y comentar la línea:
pass
Como se indica en el guión
- Pruebe a ejecutar el script desde una terminal, conecte su pantalla y vea si todo funciona bien.
Si todo funciona bien, agréguelo a sus aplicaciones de inicio: Tablero> Aplicaciones de inicio> Agregue el comando:
/bin/bash -c "sleep 15&&python3 /path/to/connect_screen.py"
El sleep 15
objetivo es hacer que el escritorio se inicie completamente antes de que el script comience a ejecutarse. Solo por asegurar.
EDITAR
Cómo ejecutar el script al inicio de una manera "inteligente".
El descanso de sleep 15
debería funcionar en general, pero dado que el tiempo de inicio difiere según el sistema, puede llevar un poco de experimentación encontrar el tiempo de descanso correcto. Con una pequeña adición, el script se vuelve "inteligente" y espera a que el xrandr
comando sea exitoso antes de iniciar el script real. Si usa la versión a continuación, solo necesita agregar el comando:
python3 /path/to/connect_screen.py
a sus aplicaciones de inicio. El uso adicional es exactamente el mismo que la versión anterior.
La secuencia de comandos
#!/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