Nie dosłownie o co prosiłeś, ale przynajmniej (efektywnie) porównywalnym rozwiązaniem byłoby umieszczenie skryptu poniżej pod klawiszem skrótu.
Co to robi
Gdy używany jest klawisz skrótu:
Następnie:
- Jeśli użytkownik naciśnie Enter, system wyłącza się
- Jeśli użytkownik nic nie robi, system czeka 30 sekund (lub inny okres, który chcesz ustawić) i wyłącza się.
- Jeśli użytkownik poruszy myszką w ciągu 30 sekund, procedura zostanie zatrzymana
Scenariusz
#!/usr/bin/env python3
import subprocess
import time
#--- set the location of the close button x, y
q_loc = [1050, 525]
#--- set the time to wait before shutdown
countdown = 30
subprocess.Popen(["gnome-session-quit", "--power-off"])
# for slower systems, set a longer break, on faster systems, can be shorter:
time.sleep(0.4)
subprocess.Popen(["xdotool", "mousemove", str(q_loc[0]), str(q_loc[1])])
coords1 = q_loc
t = 0
while True:
time.sleep(1)
cmd = "xdotool", "getmouselocation"
currloc = subprocess.check_output(cmd).decode("utf-8").split()[:2]
coords2 = [int(n.split(":")[1]) for n in currloc]
if coords2 != coords1:
break
else:
if t >= countdown:
subprocess.Popen(["xdotool", "key", "KP_Enter"])
break
t += 1
Jak używać
Jestem pewien, że wiesz, jak go używać, ale oto powód dla którego nawykliśmy:
Używa skryptu xdotool
sudo apt-get install xdotool
Skopiuj skrypt do pustego pliku i zapisz go jako run_close.py
W sekcji głowy ustaw lokalizację przycisku zamykania na ekranie w zamkniętym oknie (moje pierwsze przypuszczenie było słuszne):
#--- set the location of the close button x, y
q_loc = [1050, 525]
i czas oczekiwania na zamknięcie bez nadzoru:
#--- set the time to wait before shutdown
countdown = 30
Uruchom go testowo za pomocą polecenia:
python3 /path/to/run_close.py
Przetestuj to z wszystkimi opcjami: naciskanie w Entercelu natychmiastowego wyłączenia, nienadzorowanego wyłączenia i przerwanie procedury za pomocą myszy
Jeśli wszystko działa poprawnie, dodaj go do klawisza skrótu: wybierz: Ustawienia systemu> „Klawiatura”> „Skróty”> „Skróty niestandardowe”. Kliknij „+” i dodaj polecenie:
python3 /path/to/run_close.py
EDYTOWAĆ
Poniżej wersja skryptu, która nie wymaga żadnych dodatkowych ustawień. Oblicza współrzędne przycisku wyjścia, bez względu na rozdzielczość ekranu.
Konfiguracja jest prawie taka sama, ale [3.]
można ją pominąć.
#!/usr/bin/env python3
import subprocess
import time
#--- set the time to wait before shutdown
countdown = 30
def get_qloc():
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
scrs = [s.split("+") for s in xr if all([s.count("x") == 1, s.count("+") == 2])]
center = [int(int(s)/2) for s in [scr[0] for scr in scrs if scr[1] == "0"][0].split("x")]
return [center[0] + 250, center[1]]
q_loc = get_qloc()
subprocess.Popen(["gnome-session-quit", "--power-off"])
# for slower systems, set a longer break, on faster systems, can be shorter:
time.sleep(0.4)
subprocess.Popen(["xdotool", "mousemove", str(q_loc[0]), str(q_loc[1])])
coords1 = q_loc
t = 0
while True:
time.sleep(1)
cmd = "xdotool", "getmouselocation"
currloc = subprocess.check_output(cmd).decode("utf-8").split()[:2]
coords2 = [int(n.split(":")[1]) for n in currloc]
if coords2 != coords1:
break
else:
if t >= countdown:
subprocess.Popen(["xdotool", "key", "KP_Enter"])
break
t += 1
Wyjaśnienie
Rozmiar okna Menedżera sesji do zamknięcia systemu jest zawsze wyśrodkowany i ma stały (absolutny) rozmiar, niezależny od rozdzielczości ekranu. Dlatego położenie względem środka ekranu jest stałym czynnikiem.
Wszystko, co musimy wtedy zrobić, to odczytać rozdzielczość ekranu i stamtąd obliczyć pozycję przycisku.
Zastosowana funkcja ( get_qloc()
) oblicza rozdzielczość lewego ekranu , ponieważ to właśnie tam pojawi się dialog.
Uwaga
Czas ustawiony w wierszu time.sleep(0.4)
jest ustawiony dla względnie wolnych systemów, aby upewnić się, że mysz zostanie poruszona po wyświetleniu okna zamykania. W szybszych systemach może być krótszy, w wolniejszych systemach (np. VM) może być konieczne ustawienie dłuższej.