Une autre façon d'exécuter une commande si un écran est connecté ou déconnecté
Une solution alternative serait d'exécuter un minuscule script d'arrière-plan. En exécutant le script ci-dessous en arrière-plan, je n'ai pu mesurer aucune augmentation de la charge du processeur.
C'est un moyen facile et pratique d'exécuter un script ou toute autre commande, lorsqu'un deuxième écran est connecté ou déconnecté.
L'exemple de script
- Vérifie simplement toutes les cinq secondes combien de fois la chaîne "connecté" apparaît dans la sortie de la commande
xrandr
(attention à l'espace après "connecté" pour éviter les fausses correspondances avec "déconnecté"). Chaque occurrence représente un écran connecté.
- Si le nombre d'occurrences change, un écran était connecté ou déconnecté. Le changement est "remarqué" par le script et peut être connecté à une commande, que vous pouvez définir dans la section head du script.
Le 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
Comment utiliser
- Copiez le script dans un fichier vide, enregistrez-le sous
connect_screen.py
Dans la section head, définissez la commande à exécuter sur connect (je mets "gedit" à titre d'exemple, faites attention aux guillemets). Il est également possible de définir une commande de déconnexion également. Sinon, laissez disconnect_command = ""
tel quel.
Si vous utilisez une commande de déconnexion, décommentez également la ligne:
run_command(disconnect_command)
et commentez la ligne:
pass
Comme indiqué dans le script
- Testez le script à partir d'un terminal, connectez votre écran et voyez si tout fonctionne bien.
Si tout fonctionne bien, ajoutez-le à vos applications de démarrage: Dash> Startup Applications> Add the command:
/bin/bash -c "sleep 15&&python3 /path/to/connect_screen.py"
Il sleep 15
s'agit de faire démarrer le bureau complètement avant que le script ne démarre. Juste pour en être certain.
ÉDITER
Comment exécuter le script au démarrage de manière "intelligente".
La pause de sleep 15
devrait fonctionner en général, mais comme le temps de démarrage diffère selon le système, il peut falloir quelques essais pour trouver le bon temps de pause. Avec un petit ajout, le script devient «intelligent» et attend que la xrandr
commande réussisse avant de démarrer le script réel. Si vous utilisez la version ci-dessous, il vous suffit d'ajouter la commande:
python3 /path/to/connect_screen.py
à vos applications de démarrage. L'utilisation ultérieure est exactement la même que la version ci-dessus.
Le 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