这并不是您真正要的,而是至少(有效)可比较的解决方案是将脚本放在快捷键下面。
它能做什么
使用快捷键时:
然后:
- 如果用户按Enter,系统将关闭
- 如果用户不执行任何操作,则系统将等待30秒(或您要设置的任何其他时间段)并关闭。
- 如果用户在30秒钟内移动鼠标,该过程将停止
剧本
#!/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
如何使用
我很确定您知道如何使用它,但是出于习惯性的原因,我们在这里进行介绍:
脚本使用 xdotool
sudo apt-get install xdotool
将脚本复制到一个空文件中,另存为 run_close.py
在头部区域中,在关闭窗口中设置关闭按钮在屏幕上的位置(我的第一个猜测是正确的):
#--- set the location of the close button x, y
q_loc = [1050, 525]
以及无人值守关闭之前需要等待的时间:
#--- set the time to wait before shutdown
countdown = 30
通过以下命令进行测试:
python3 /path/to/run_close.py
使用所有选项进行测试:按Enter立即关机,无人值守关机并通过鼠标移动中断该过程
如果一切正常,请将其添加到快捷键:选择:“系统设置”>“键盘”>“快捷方式”>“自定义快捷方式”。单击“ +”并添加命令:
python3 /path/to/run_close.py
编辑
下面的脚本版本不需要任何其他设置。无论屏幕的分辨率如何,它都会计算退出按钮的坐标。
设置几乎相同,但是[3.]
可以跳过。
#!/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
说明
关闭系统的“会话管理器”窗口的大小始终居中,并且大小固定(绝对),与屏幕分辨率无关。因此,相对于屏幕中心的位置是一个常数。
然后,我们需要做的就是读取屏幕的分辨率并从那里计算按钮的位置。
应用的函数(get_qloc()
)计算左屏幕的分辨率,因为这是对话框将出现的分辨率。
注意
在行time.sleep(0.4)
中设置的时间是为相对较慢的系统设置的,以确保在出现关闭窗口后移动鼠标。在较快的系统上,它可能会更短,而在较慢的系统(可能是VM)上,可能需要将其设置为更长。