Làm cách nào để tôi gọi gnome-session-Thoát với đếm ngược từ Unity?


13

Để có thể tắt máy bằng phím tắt, chúng ta có thể gán gnome-session-quit ---power-offcho một phím tắt tùy chỉnh.

Trong Unity, điều này sẽ dẫn đến hộp thoại sau:

nhập mô tả hình ảnh ở đây

Sau đó, chúng tôi cần ít nhất hai lần nhấn phím để cuối cùng tắt nguồn hệ thống của chúng tôi. Điều này khá bất tiện và tôi thích hộp thoại tắt máy cũ hơn khi bạn có thể tắt nguồn bằng cách chỉ cần nhấn Returnhoặc để nó chờ đếm ngược mặc định là 60 giây.

Khi gọi gnome-session-quit --powerofftừ phiên flashback phiên Gnome trên cùng một hệ thống (14.04 LTS), hộp thoại cũ bao gồm cả đếm ngược trở lại:

nhập mô tả hình ảnh ở đây

Vì vậy, chúng tôi biết nó ở đâu đó.

Có cách nào để gọi hộp thoại cũ này khi chạy phiên Unity không?


Liệu một thể thống nhất không có bộ đếm thời gian ẩn, vì vậy nó sẽ tắt nguồn sau 60 giây chứ ??
Tim

Askubfox.com/questions/14794/ có thể giúp đỡ
Tim

Đối với cả hai: điều với hộp thoại mới là, dường như nó đang chờ lựa chọn của người dùng để làm gì ...: /
Takkat

2
@Serg Cửa sổ thuộc về Trình quản lý phiên (Tôi đã chạy tập lệnh nền để ghi các thuộc tính của cửa sổ mới vào một tệp). Vấn đề là nó hoạt động khác nhau, tùy thuộc vào trình quản lý cửa sổ.
Jacob Vlijm

1
@JacobVlijm: vâng đó là những gì tôi có thể thấy ... nó dường như thăm dò ý kiến ​​của WM và sau đó gọi đây là thói quen đó nhưng tôi không tìm ra cách nào để ép buộc điều này.
Takkat

Câu trả lời:


10

Đây là một kịch bản để mô phỏng hành vi mong muốn. Phải chạy như với sudo. Có thể được liên kết với một phím tắt (với việc bổ sung sơ bộ shutdownlệnh vào tập tin sudoers để cho phép chạy mật khẩu ). Đơn giản, súc tích, và làm công việc.

#!/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

Cập nhật: ngày 14 tháng 6

Theo đề xuất của Takkat, đây là tập lệnh sử dụng tùy chọn --timer và dbus của zenity để đạt được hành vi tương tự mà không cần truy cập sudo:

#!/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

Ý tưởng cơ bản ở đây là tùy chọn hết thời gian của zenity thoát với mã lớn hơn 0, điều này thường có nghĩa là lệnh thất bại. Vì vậy, bằng cách coi tùy chọn hủy và thời gian chờ của zenity là điều kiện sẽ cho phép tắt máy, chúng tôi chỉ sử dụng toán tử OR ( ||) để tắt máy nếu người dùng nhấp vào nút hủy (được dán nhãn là "DOIT") hoặc hết thời gian hộp thoại.

Một biến thể khác để cải thiện trải nghiệm người dùng có thể được thực hiện với yad (cần phải được cài đặt trước với các lệnh này sudo apt-add-repository ppa:webupd8team/y-ppa-manager;sudo apt-get update; sudo apg-get install yad). Biến thể này sử dụng thanh tiến trình để cho người dùng biết thời gian còn lại

    #!/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

Một phiên bản có thể khác, tính đến việc nếu bạn thay đổi nhãn nút ok của zenity, nút được tô sáng theo mặc định có thể hoặc không phải là nút ok.

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

Tập lệnh tắt hệ thống khi có bất kỳ trả về nào không bằng 0. Nếu tập lệnh hết thời gian, giá trị trả về của 1 hoặc 5 sẽ cho tập lệnh thực thi elsephần đó


Hoạt động như một bùa mê khi chạy với sudo hoặc cho phép người dùng không root được tắt máy. Tôi không muốn làm điều đó. Hãy để tôi đề xuất các chỉnh sửa sau để cho phép tập lệnh của bạn được chạy bởi một người dùng sinh tử: 1. Sử dụng dbus cho poweroff như được đề xuất trong câu trả lời này 2. Sử dụng zenity --timeoutbộ đếm thời gian sẵn có. Bằng cách này, chúng tôi sẽ không phải hủy / khởi động lại việc tắt máy sau này.
Takkat

@Takkat đã thêm một tập lệnh khác sử dụng đề xuất của bạn. Vui lòng xem lại
Sergiy Kolodyazhnyy

Nó thực sự tắt máy mà không cần mật khẩu root nhưng nút OK / DOIT không được chọn theo mặc định để tắt ngay lập tức với phím RETURN. Chúng tôi sử dụng một kịch bản tương tự với if [[ $? -eq 1 ]] ; then exit \else dbus...điều kiện đó. Rõ ràng là dường như không có cách nào để gọi người trợ giúp đăng xuất cũ ...
Takkat

Thêm các lệnh để cài đặt yad;)
AB

Ước gì tôi có thể chia tiền thưởng cho cả hai câu trả lời. Thật khó để quyết định ở đây sau khi có hai câu trả lời tuyệt vời như nhau. Cuối cùng tôi đưa nó cho Jacob vì câu trả lời của anh ấy có vẻ linh hoạt hơn một chút. Nhưng kịch bản của bạn làm công việc của nó tuyệt vời, và nó rất đơn giản. Thay vào đó, tôi sẽ đánh dấu nó là được chấp nhận để làm cho nó hiển thị là câu trả lời hàng đầu. Tôi hy vọng nó sẽ nhận được nhiều phiếu hơn theo thời gian bởi điều này.
Takkat

6

Không phải theo nghĩa đen những gì bạn yêu cầu, nhưng ít nhất một giải pháp có thể so sánh (hiệu quả) sẽ là đặt tập lệnh bên dưới dưới một phím tắt.

Những gì nó làm

Khi phím tắt được sử dụng:

  • các gnome-session-quit --power-offlệnh được chạy
  • chuột được di chuyển đến nút "đóng" tương ứng, thực hiện hiệu quả nút tắt máy được chọn trước:

    nhập mô tả hình ảnh ở đây

Sau đó:

  • Nếu người dùng nhấn Enter, hệ thống sẽ tắt
  • Nếu người dùng không làm gì, hệ thống sẽ đợi trong 30 giây (hoặc bất kỳ khoảng thời gian nào bạn muốn đặt) và tắt.
  • Nếu người dùng di chuyển chuột trong 30 giây, quy trình sẽ dừng lại

Kịch bản

#!/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

Cách sử dụng

Tôi khá chắc chắn rằng bạn biết cách sử dụng nó, nhưng ở đây chúng tôi đi vì lý do hợi:

  1. Kịch bản sử dụng xdotool

    sudo apt-get install xdotool
    
  2. Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng run_close.py

  3. Trong phần đầu, đặt vị trí của màn hình của nút tắt trong cửa sổ đóng (dự đoán đầu tiên của tôi là đúng):

    #--- set the location of the close button x, y
    q_loc = [1050, 525]
    

    và thời gian chờ đợi trước khi tắt không giám sát:

    #--- set the time to wait before shutdown
    countdown = 30
    
  4. Chạy thử nó bằng lệnh:

    python3 /path/to/run_close.py
    

    Kiểm tra nó với tất cả các tùy chọn: nhấn Enterđể tắt ngay lập tức, tắt máy không giám sát và phá vỡ quy trình bằng cách di chuyển chuột

  5. Nếu tất cả đều hoạt động tốt, hãy thêm nó vào một phím tắt: chọn: Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh". Nhấp vào "+" và thêm lệnh:

     python3 /path/to/run_close.py
    

BIÊN TẬP

Bên dưới một phiên bản của tập lệnh không cần bất kỳ cài đặt bổ sung nào. Nó tính toán tọa độ của nút thoát, bất kể độ phân giải của màn hình là gì.

Các thiết lập khá giống nhau, nhưng [3.]có thể bỏ qua.

#!/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

Giải trình

Kích thước của cửa sổ Trình quản lý phiên để đóng hệ thống luôn được căn giữa và có kích thước cố định (tuyệt đối), độc lập với độ phân giải của màn hình. Do đó, vị trí liên quan đến trung tâm của màn hình là một yếu tố không đổi.

Tất cả những gì chúng ta cần làm là đọc độ phân giải của màn hình và tính toán vị trí của nút từ đó.

Hàm được áp dụng ( get_qloc()) tính toán độ phân giải của màn hình bên trái , vì đó là nơi mà đoạn hội thoại sẽ xuất hiện.

Ghi chú

Thời gian, được đặt trong dòng time.sleep(0.4)được đặt cho các hệ thống tương đối chậm, để đảm bảo chuột được di chuyển sau khi cửa sổ tắt xuất hiện. Trên các hệ thống nhanh hơn, nó có thể ngắn hơn, trên các hệ thống chậm hơn (như có thể là VM) có thể cần phải đặt thành dài hơn.


@Takkat Đã sửa, phiên bản này sẽ hoạt động ở mọi độ phân giải.
Jacob Vlijm

Tuyệt quá! Nó hoạt động hoàn hảo trên VM của tôi.
Takkat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.