Tam olarak ne istediğini değil , ama en azından (etkili bir şekilde) karşılaştırılabilir bir çözüm, betiği bir kısayol anahtarının altına koymak olacaktır.
Bu ne yapar
Kısayol tuşu kullanıldığında:
Sonra:
- Kullanıcı basarsa Enter, sistem kapanır
- Kullanıcı hiçbir şey yapmazsa, sistem 30 saniye (veya ayarlamak istediğiniz başka bir süre) bekler ve kapanır.
- Kullanıcı fareyi 30 saniye boyunca hareket ettirirse, işlem durdurulur
Senaryo
#!/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
Nasıl kullanılır
Bunu nasıl kullanacağınızı bildiğinizden eminim, ancak burada alışkanlık nedenleriyle gidiyoruz:
Komut dosyası kullanır xdotool
sudo apt-get install xdotool
Komut dosyasını boş bir dosyaya kopyalayın, run_close.py
Kafa bölümünde, pencerenin kapanma düğmesinin ekranın konumunu ayarlayın (ilk tahminim haklıydı):
#--- set the location of the close button x, y
q_loc = [1050, 525]
ve katılımsız kapanmadan önce beklenecek süre:
#--- set the time to wait before shutdown
countdown = 30
Komut ile test çalıştırın:
python3 /path/to/run_close.py
Tüm seçeneklerle test edin: Enteranında kapatma, katılımsız kapatma için düğmesine basın ve fareyi hareket ettirerek prosedürü kırın
Her şey yolunda giderse bir kısayol tuşuna ekleyin: şunu seçin: Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar". "+" İşaretini tıklayın ve şu komutu ekleyin:
python3 /path/to/run_close.py
DÜZENLE
Ek ayar gerektirmeyen komut dosyasının bir sürümünün altında. Ekran çözünürlüğü ne olursa olsun, çık düğmesinin koordinatlarını hesaplar.
Kurulum hemen hemen aynıdır, ancak [3.]
atlanabilir.
#!/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
açıklama
Sistemi kapatmak için Oturum Yöneticisi penceresinin boyutu her zaman ortalanır ve ekranın çözünürlüğünden bağımsız olarak sabit (mutlak) bir boyuttadır. Bu nedenle ekranın merkezine göre konum sabit bir faktördür.
O zaman tek yapmamız gereken ekran çözünürlüğünü okumak ve düğmenin konumunu oradan hesaplamak.
Uygulanan işlev ( get_qloc()
), sol ekranın çözünürlüğünü hesaplar , çünkü diyalog burada görünecektir.
Not
Satırda time.sleep(0.4)
ayarlanan süre , kapanma penceresi göründükten sonra farenin hareket ettirildiğinden emin olmak için nispeten yavaş sistemler için ayarlanır . Daha hızlı sistemlerde, daha kısa olabilir, daha yavaş sistemlerde (muhtemelen bir VM gibi) daha uzun süre ayarlanması gerekebilir.