Unity'den geri sayım ile gnome-session-quit'i nasıl arayabilirim?


13

Yapabilmek için bir klavye kısayol ile kapatma biz atayabilirsiniz gnome-session-quit ---power-offözel kısayol için.

Unity'de bu, aşağıdaki iletişim kutusuna götürür:

resim açıklamasını buraya girin

Sonunda sistemimizi kapatmak için en az iki tuşa daha ihtiyacımız var. Bu oldukça rahatsız edici ve sadece basarak Returnveya 60 saniyelik varsayılan geri sayımı beklemesine izin vererek kapattığınızda eski kapatma iletişim kutusunu tercih ederim .

Aynı sistemdeki (14.04 LTS) gnome-session-quit --poweroffbir GNOME oturumu geri dönüş oturumundan arama yaparken geri sayım da dahil olmak üzere eski iletişim kutusu geri gelir:

resim açıklamasını buraya girin

Yani bir yerde yaşadığını biliyoruz.

Bir Unity oturumu çalıştırırken bu eski iletişim kutusunu çağırmanın bir yolu var mı?


Birlik gizli bir zamanlayıcı yok mu, bu yüzden yine de 60 saniye sonra kapanıyor ??
Tim


Her ikisine de: yeni iletişim kutusundaki şey, görünüşe göre ne yapılacağı için bir kullanıcı seçimini beklemesi ...: /
Takkat

2
@Serg Pencere Oturum Yöneticisine aittir (bir dosyaya yeni pencerenin özelliklerini yazmak için bir arka plan komut dosyası çalıştırdım). Sorun, pencere yöneticisine bağlı olarak farklı davranmasıdır.
Jacob Vlijm

1
@JacobVlijm: evet ben de görebiliyordum ... görünüşe göre WM yoklar ve sonra bu ya da bu rutin çağırır ama bunu zorlamak için bir yol bulamadım.
Takkat

Yanıtlar:


10

İşte istenen davranışı taklit eden bir komut dosyası. Olduğu gibi çalıştırılmalıdır sudo. Bir klavye kısayoluna bağlanabilir ( şifresiz çalışmaya izin vermekshutdown için sudoers dosyasına komutun ön eklenmesi ile ). Basit, özlü ve işi yapar.

#!/bin/bash
# Date: June 11,2015
# Author: Serg Kolo
# Description: a script to emulate
# behavior of GNOME session flashback
# shutdown dialog

# Tell ubuntu to shutdown in 1 min
shutdown -P +1 &
# Show the dialog
zenity --question --text="Shutdown now ? Automatic shutdown in 60 seconds" --ok-label="DOIT" 
# If user clicks DOIT, then cancel the old 
# shutdown call that has countdown,
# (because only one shutdown command can be run at a time), and
# tell ubuntu to shutdown immediately
# otherwise - cancel it
if [ $? -eq 0 ];then
        shutdown -c
        shutdown -P now
else
        shutdown -c
fi

Güncelleme: 14 Haziran

Takkat tarafından önerildiği gibi, sudo erişimine gerek kalmadan aynı davranışı elde etmek için zenity'nin --timer seçeneğini ve dbus'u kullanan bir komut dosyası:

#!/bin/bash
# Date: June 14,2015
# Author: Serg Kolo
# Description: a script to emulate
# behavior of GNOME session flashback
# shutdown dialog
# version #2

zenity --question --text="Shutdown now ? Autoshutdown in 60 seconds" \
    --cancel-label="DOIT" --ok-label="NOPE" --timeout=60 ||  
  dbus-send --system --print-reply --dest=org.freedesktop.login1 \
    /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true

Buradaki temel fikir, zenity'nin zaman aşımı seçeneğinin 0'dan büyük kodla çıkmasıdır, bu da genellikle komutun başarısız olduğu anlamına gelir. Zenity'nin iptal seçeneğini ve zaman aşımını kapatmaya izin verecek koşul olarak ele alarak, OR ||kullanıcısını ( ) yalnızca kullanıcı iptal düğmesine ("DOIT" olarak etiketlenir) tıklarsa veya iletişim süresi dolduğunda kapatmak için kullanırız.

Kullanıcı deneyimini iyileştirmek için başka bir varyasyon yapılabilir yad(önce bu komutlarla yüklenmesi gerekir sudo apt-add-repository ppa:webupd8team/y-ppa-manager;sudo apt-get update; sudo apg-get install yad). Bu varyasyon, kullanıcıya ne kadar süre kaldığını bildirmek için ilerleme çubuğu kullanır

    #!/bin/bash
    yad --auto-close --sticky --on-top --skip-taskbar --center \
  --text 'Shutdown now ? Autoshutdown in 60 seconds.' \
  --button="gtk-ok:1" --button="gtk-close:0" --image=dialog-question \ 
--title 'Shutdown' --timeout=60 --timeout-indicator=top || 
dbus-send --system --print-reply --dest=org.freedesktop.login1 \
/org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true

Başka bir olası sürüm, zenity'nin ok düğmesi etiketini değiştirirseniz, varsayılan olarak vurgulanan düğmenin ok düğmesi olabileceğini veya olmayabileceğini dikkate alır.

zenity --question --timeout 10 --text="Automatic shutdown in 10 seconds"
if [[ $? -eq 1 ]] ; then
    # user clicked Cancel
    exit 
else
    dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
fi

Komut dosyası, 0 olmayan herhangi bir dönüşle sistemi kapatır. Komut dosyası zaman aşımına uğradığında, 1 veya 5'in dönüş değeri komut dosyasına elseparçayı yürütmesini söyler


Sudo ile çalışırken bir cazibe gibi çalışır veya root olmayan kullanıcıların kapanmasına izin verir. Bunu yapmamayı tercih ederim. Komut dosyanızın ölümlü bir kullanıcı tarafından çalıştırılmasını sağlamak için aşağıdaki düzenlemeleri önereyim : 1. Bu yanıtta önerildiği gibi güç kapatma için dbus kullanın 2.zenity --timeout Dahili zamanlayıcıyı kullanın . Bu şekilde daha sonra kapatmayı iptal etmek / yeniden başlatmak zorunda kalmayacağız.
Takkat

@Takkat önerilerinizi kullanan başka bir komut dosyası ekledi. Lütfen gözden
geçirin

Kök şifresi olmadan gerçekten kapanır, ancak RETURN tuşuyla anında kapatma için OK / DOIT düğmesi varsayılan olarak seçilmez. Bunu yapan if [[ $? -eq 1 ]] ; then exit \else dbus...koşulu olan benzer bir komut dosyası kullanıyoruz . Açıkçası, eski çıkış yardımcısını çağırmanın bir yolu yok gibi görünüyor ...
Takkat

Yad;)
AB

Ödülün her iki yanıta da bölünebilmesini diliyorum. Eşit derecede harika iki cevap verdikten sonra burada karar vermek çok zordu. Sonunda Jacob'a verdim çünkü cevabı biraz daha çok yönlü görünüyor. Ama senaryonuz işini harika yapıyor ve çok basit. En iyi yanıt olarak gösterilmesini sağlamak için kabul edilmiş olarak işaretleyeceğim. Umarım zamanla daha da fazla oy alır.
Takkat

6

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:

  • gnome-session-quit --power-offKomut çalıştırıldığında
  • Fare, karşılık gelen "yakın" düğmesine taşınır etkili bir kapatma düğmesi seçilen ÖN yapma:

    resim açıklamasını buraya girin

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:

  1. Komut dosyası kullanır xdotool

    sudo apt-get install xdotool
    
  2. Komut dosyasını boş bir dosyaya kopyalayın, run_close.py

  3. 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
    
  4. 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

  5. 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.


@Takkat Sabit, bu sürüm herhangi bir çözünürlük üzerinde çalışmalıdır.
Jacob Vlijm

Harika! VM'imde de kusursuz çalışıyor.
Takkat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.