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:
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:
Kịch bản sử dụng xdotool
sudo apt-get install xdotool
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
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
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
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.