Alternatywny sposób uruchomienia polecenia, jeśli ekran jest podłączony lub odłączony
Alternatywnym rozwiązaniem byłoby uruchomienie małego skryptu w tle. Uruchamiając poniższy skrypt w tle, nie mogłem zmierzyć żadnego wzrostu obciążenia procesora.
Jest to łatwy i wygodny sposób na uruchomienie skryptu lub dowolnego innego polecenia, ilekroć drugi ekran jest podłączony lub odłączony.
Przykładowy skrypt
- Po prostu co pięć sekund sprawdza, ile razy ciąg „podłączony” występuje w danych wyjściowych polecenia
xrandr
(pamiętaj o spacji po „podłączonym”, aby zapobiec fałszywym dopasowaniom z „odłączony”). Każde wystąpienie reprezentuje podłączony ekran.
- Jeśli liczba wystąpień ulegnie zmianie, ekran zostanie podłączony lub odłączony. Zmiana jest „zauważana” przez skrypt i może być połączona z poleceniem, które można ustawić w sekcji head skryptu.
Scenariusz
#!/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
Jak używać
- Skopiuj skrypt do pustego pliku i zapisz go jako
connect_screen.py
W sekcji nagłówka ustaw polecenie, aby było uruchamiane przy połączeniu (ustawiłem „gedit” jako przykład, pamiętaj o cudzysłowach). Możliwe jest również ustawienie polecenia rozłączenia, podobnie. W przeciwnym razie odejdź disconnect_command = ""
.
Jeśli użyjesz polecenia rozłączenia, odkomentuj również wiersz:
run_command(disconnect_command)
i skomentuj linię:
pass
Jak wskazano w skrypcie
- Uruchom skrypt z terminalu, podłącz ekran i sprawdź, czy wszystko działa poprawnie.
Jeśli wszystko działa poprawnie, dodaj go do aplikacji startowych: Dash> Aplikacje startowe> Dodaj polecenie:
/bin/bash -c "sleep 15&&python3 /path/to/connect_screen.py"
Ma sleep 15
to na celu całkowite uruchomienie pulpitu przed uruchomieniem skryptu. Dla pewności.
EDYTOWAĆ
Jak uruchomić skrypt podczas uruchamiania w „inteligentny” sposób.
Przerwa sleep 15
powinna działać ogólnie, ale ponieważ czas uruchamiania różni się w zależności od systemu, znalezienie odpowiedniego czasu przerwy może wymagać eksperymentów. Z niewielkim dodatkiem skrypt staje się „inteligentny” i czeka na xrandr
pomyślne wykonanie polecenia, zanim rozpocznie właściwy skrypt. Jeśli używasz poniższej wersji, wystarczy dodać polecenie:
python3 /path/to/connect_screen.py
do aplikacji startowych. Dalsze użycie jest dokładnie takie samo jak w powyższej wersji.
Scenariusz
#!/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